在 Codeigniter 中扩展表单验证

Posted

技术标签:

【中文标题】在 Codeigniter 中扩展表单验证【英文标题】:Extending form validation in Codeigniter 【发布时间】:2012-02-27 22:58:39 【问题描述】:

我已将名为“My_Form_validation.php”的类文件放入“应用程序/核心”,我也尝试将其放入“应用程序/库”。

在我的控制器中我正在使用

$this->form_validation->set_rules('user_postcode', 'Postcode', 'valid_postcode|trim|required|xss_clean');

这是 My_Form_validation.php 中的内容 - 实际逻辑在这里没有问题,因为我有几个选项可以实际验证邮政编码。我需要帮助的是了解为什么它没有加载或被调用!

我的 CI 版本是 定义('CI_VERSION', '2.0.2');

<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

/**
 * Form validation for UK Postcodes
 * 
 * Check that its a valid postcode
 * @author James Mills <james@koodoocreative.co.uk>
 * @version 1.0
 * @package FriendsSavingMoney
 */

class MY_Form_validation extends CI_Form_validation


    function __construct()
    
        parent::__construct();  
        log_message('debug', '*** Hello from MY_Form_validation ***');
    

    function valid_postcode($postcode)
    

        /**
         *
         * UK Postcode validation expression from Wikipedia
         * http://en.wikipedia.org/wiki/Postcodes_in_the_United_Kingdom
         *
         * Note: Remember to strtoupper() your postcode before inserting into database!
         *
         */

        $pattern = "/^(GIR 0AA)|(((A[BL]|B[ABDHLNRSTX]?|C[ABFHMORTVW]|D[ADEGHLNTY]|E[HNX]?|F[KY]|G[LUY]?|H[ADGPRSUX]|I[GMPV]|JE|K[ATWY]|L[ADELNSU]?|M[EKL]?|N[EGNPRW]?|O[LX]|P[AEHLOR]|R[GHM]|S[AEGKLMNOPRSTY]?|T[ADFNQRSW]|UB|W[ADFNRSV]|YO|ZE)[1-9]?[0-9]|((E|N|NW|SE|SW|W)1|EC[1-4]|WC[12])[A-HJKMNPR-Y]|(SW|W)([2-9]|[1-9][0-9])|EC[1-9][0-9]) [0-9][ABD-HJLNP-UW-Z]2)$/";


        if (preg_match($pattern, strtoupper($postcode)))
    
            return TRUE;
         
        else
        
            $this->set_message('valid_postcode', 'Please enter a valid postcode');
            return FALSE;
        
    

【问题讨论】:

完整性检查:1) 文件为 application/libraries/MY_Form_validation.php, 2) $config['subclass_prefix'] = 'MY_';, 3) 您的配置日志阈值将输出您的调试消息(并且文件权限允许) 没有线索。我不得不用各种var_dump()die() 调用来调试它...... 您是否尝试过编辑 language/english/form_validation_lang.php 文件,而不是在方法中设置消息?像这样:$lang['valid_postcode'] = "Please enter a valid postcode"; 应该是 MY_ 而不是 My_ 。根据您的问题参考 My_Form_validation.php 的内容,您似乎正在使用后者 我也遇到了同样的问题,我把文件放对了,文件名是正确的。我将库加载到我的控制器中。一切都安排妥当。但是我的自定义验证中的方法没有被加载。我收到此消息“无法找到验证规则:is_Fieldunique”。为什么会这样? 【参考方案1】:

因为您扩展的是 CodeIgniter 库而不是核心组件,所以您希望将其放在 application/libraries(而不是 application/core)中。

当然,不要忘记在控制器代码中加载Form_validation 库。

$this->load->library('form_validation');

其他需要检查的事项:

文件名区分大小写(MY_Form_validation.php 加载,而 My_Form_validation.php 不会) 类名区分大小写(类MY_Form_validation 扩展CI_Form_validation

参考资料:

Extending Core Classes Extending Native Libraries

【讨论】:

我在MY_Form_validation 文件和文件名中尝试了所有不同类型的大写字母,但都没有奏效。是否会根据使用的 CI 版本而有所变化? @timpeterson:我也做了同样的事情。你有办法解决这个问题吗? 我做了无数的噩梦,试图让它正常工作。我的文件和类都被命名为My_form_validation 而不是MY_Form_validation。我现在在踢自己【参考方案2】:

您必须在 __construct 方法上添加 $rules 并将其传递给父构造函数

例如:

function __construct($rules = array())

    parent::__construct($rules);

查看 Form_validation 并提供相同的变量。

【讨论】:

阿尔贝斯库,FTW。这不仅有意义,而且还有效。我不敢相信我忽略了传递规则数组。做得很好。 +1

以上是关于在 Codeigniter 中扩展表单验证的主要内容,如果未能解决你的问题,请参考以下文章

在 codeigniter 3.1.2 中,登录表单提交导致身份验证失败

在 CodeIgniter 中验证表单下拉列表

如何在codeigniter中验证表单

使用规则集进行 Codeigniter 表单验证

在 codeigniter 中使用 jquery ajax 进行表单验证

Codeigniter 3:不要在表单验证错误时重新加载表单