如何将模型函数作为验证规则调用

时间:2015-08-28 08:09:40

标签: php codeigniter

我在使用带有CodeIgniter 3.x的form_validation库时出现问题:

我想使用模型函数作为输入的验证规则。当我提交表单时,似乎根本没有调用该函数。 According to the user guide,这就是我从控制器那里做到的方式:

if($this->input->post() !== false) 
    {
        $this->form_validation->set_rules(
            'username', //the post value to check
            'User Name',
            array(
                'trim',
                'required',
                array($this->user_model, 'checkUserName') // i want to call checkUserName from the user_model model
            )
        );

我不明白为什么它甚至不会调用user_model中的checkUserName函数:有没有人有想法?

[编辑] :我在system / libraries / form_validation.php中看到了set_rules()函数的源代码。似乎如果第三个参数不是字符串,它什么都不做,所以我不能调用模型函数。用户指南不是最新版本? 这是我从form_validation中找到的代码行:

// No fields? Nothing to do...
    if ( ! is_string($field) OR  ! is_string($rules) OR $field == '')
    {
        return $this;
    }

2 个答案:

答案 0 :(得分:0)

如果您要检查不重复的用户名,请使用内置函数is_unique['table.field] 表格:表格的名称 字段:是要检查的字段的名称。

$this->form_validation->set_rules('username', User Name, 'is_unique['users.username]');

这将检查dbtable用户的字段Username。如果提供的用户名是find,它将返回错误用户名不唯一

这是在form_validation类中定义的is_unique()函数:

public function is_unique($str, $field)
    {
        sscanf($field, '%[^.].%[^.]', $table, $field);
        return isset($this->CI->db)
            ? ($this->CI->db->limit(1)->get_where($table, array($field => $str))->num_rows() === 0)
            : FALSE;
    }

如果您真的想要调用自己的自定义函数,那么...
最好是扩展form_validation类:如下。

class MY_Form_validation extends CI_Form_validation {
    protected $CI;
    public function __construct()
    {
        parent::__construct();
        $this->CI =& get_instance();
    }

    public function check_user_name($str)
    {
      //here you codes goes eg.$this->CI->db->get_where(); etc.
    }
}

答案 1 :(得分:0)

'premium_dates' => [
        'field'  => 'premium_dates',
        'label'  => 'Premium dates',
        'rules'  => [
            'trim',
            ['validate_premium_dates', function () {
                return $this->Properties_seasons_model->validate_premium_dates();
            }],
        ],
        'errors' => [
            'validate_premium_dates' => 'Premium dates enabled. Please choose at least one Premium Date.',
        ],
    ];