【问题标题】:Code Igniter Custom Field Validation Not Working代码点火器自定义字段验证不起作用
【发布时间】:2013-04-14 17:44:40
【问题描述】:

我在 Code Igniter 中创建了一个自定义验证。我有以下代码,但 is_FieldUnique 验证不起作用。即使,我var_dump() 的参数仍然没有得到它正在显示的信息。我在下面的代码做错了什么?我没有得到is_FieldUnique 的任何回报,但默认验证工作正常,就像requiredmin_length 一样。

application/libraries/Customfieldvalidation.php,下面有这行代码:

class Customfieldvalidation extends CI_Form_validation 
    {
        public function is_FieldUnique($str, $field)
        {
            var_dump($str);
            var_dump($field);
            list($table, $field)=explode('.', $field);
            $q = $this->CI->db->query("SHOW KEYS FROM $table WHERE Key_name = 'PRIMARY'")->row();
            $primary_key = $q->Column_name;
            if($this->CI->input->post($primary_key) > 0):
                $query = $this->CI->db->limit(1)->get_where($table, array($field => $str,$primary_key.' !='=>$this->CI->input->post($primary_key)));
            else:
                $query = $this->CI->db->limit(1)->get_where($table, array($field => $str));
            endif; 
            echo $query;
            exit();
            return $query->num_rows() === 0;
        }
    }

在我的控制器中,我有以下代码:

class User extends CI_Controller 
{
    function __construct()
    {
        parent::__construct();
        $this->load->library('customfieldvalidation');
    }
    function _setRules()
    {
        $this->form_validation->set_rules('email_address', 'Email Address', 'required|valid_email|min_length[8]|is_FieldUnique[users.email_address]');
        $this->form_validation->set_message('is_FieldUnique', '* must have a unique value');
    }
}

自定义字段不起作用的原因可能是什么?我知道这对每个人来说都非常简单,但我是 Codeigniter 的新手并开始学习。

【问题讨论】:

    标签: codeigniter validation


    【解决方案1】:

    如果您要扩展本机库,则必须正确地为自定义库添加前缀。默认前缀是MY_ 这可以在application/config/config.php 中更改,使用此配置:$config['subclass_prefix'] = 'MY_';

    所以这个:

    class Customfieldvalidation extends CI_Form_validation
    

    应该是:

    class MY_Form_validation extends CI_Form_validation
    

    还要确保文件名反映这一点并且位于适当的位置:

    application/libraries/MY_Form_validation.php
    

    您还需要一个构造函数来扩展父类:

    function __construct($rules = array())
    {
        parent::__construct($rules);
    }
    

    确保您将库加载到控制器或autoload 中。加载库时不需要包含类前缀:

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

    我猜你已经在 is_FieldUnique 函数中添加了几行用于调试,但你绝对不希望 exit()return 之前,因为这将退出脚本并且不会允许任何东西被退回。我也不清楚函数返回的是什么(也许我只是昏暗了!),所以这样的声明应该会有所帮助:

    if ($query->num_rows() === 0)
    {
        return TRUE;
    }
    else
    {
        return FALSE;
    }
    

    您也可以考虑使用callback,这是添加您自己的验证规则的常用方法。

    【讨论】:

    • 是的,它仅用于调试目的。我添加了 exit() 以仔细检查方法是否已执行。但遗憾的是,在我的代码中,我的自定义验证方法都没有成功执行。我会试试你的代码。感谢您的帮助。
    • 我已经尝试过您的建议,但自定义字段验证仍然无法正常工作。我一步一步调试代码,我发现了问题。我收到此错误消息,无法找到验证规则:is_Fieldunique。我已经在我的控制器中加载了自定义库。这可能是什么问题?
    • 我已经编辑了我的答案以更详细地介绍 - 希望这对帮助您加载和使用验证功能很有用。您似乎也只将 1 个参数传递给需要 2 个的验证函数。
    • 谢谢,我需要时间来弄清楚。在 CI 中,你不能只使用任何类名,否则它不会加载。所以我将我的班级名称从“My_Customfieldvalidation”更改为“MY_Form_validation”。
    猜你喜欢
    • 2017-11-04
    • 1970-01-01
    • 2016-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-05
    • 1970-01-01
    相关资源
    最近更新 更多