代码点火器自定义字段验证不起作用

时间:2013-04-14 17:44:40

标签: codeigniter validation

我在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的新手并开始学习。

1 个答案:

答案 0 :(得分:2)

如果要扩展本机库,则必须正确添加自定义库的前缀。默认前缀为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,这是添加自己的验证规则的常用方法。