创建自定义 codeigniter 验证规则

Posted

技术标签:

【中文标题】创建自定义 codeigniter 验证规则【英文标题】:Creating a custom codeigniter validation rule 【发布时间】:2012-01-01 04:18:01 【问题描述】:

我的登录表单中有一个功能,可以检查电子邮件和密码是否与数据库中的值匹配,如果匹配,它将用户登录到系统中。

如果此函数返回 false,我想显示验证错误。

我的问题是我不确定如何创建它。该消息与密码和电子邮件字段相关,因此我不希望每个输入字段的规则只显示一条消息。

我曾尝试使用 flashdata 来实现这一点,但它仅在页面刷新后才有效。

如何为函数$this->members_model->validate_member() 创建一个新的验证规则?

$this->form_validation->set_error_delimiters('<div class="error">', '</div>');
        $this->form_validation->set_rules('email_address', '"Email address"', 'trim|required|valid_email');
        $this->form_validation->set_rules('password', '"Password"', 'trim|required');

        if ($this->form_validation->run() == FALSE)
        
            $viewdata['main_content'] = 'members/login';
            $this->load->view('includes/template', $viewdata);
        
        else
               
                if($this->members_model->validate_member())
                

【问题讨论】:

【参考方案1】:

您在规则中使用callback_,例如,请参阅callbacks

$this->form_validation->set_rules('email_address', '"Email address"', 'trim|required|valid_email|callback_validate_member');

并在控制器中添加方法。此方法需要返回 TRUE 或 FALSE

function validate_member($str)

   $field_value = $str; //this is redundant, but it's to show you how
   //the content of the fields gets automatically passed to the method

   if($this->members_model->validate_member($field_value))
   
     return TRUE;
   
   else
   
     return FALSE;
   

然后您需要创建一个相应的错误以防验证失败

$this->form_validation->set_message('validate_member','Member is not valid!');

【讨论】:

@Ivan 没必要,但可以增加可读性,谢谢 可能没有必要,但前导下划线将阻止该方法通过 "/controller_name/validate_member/blah" ... 访问,并且使用双下划线是完全可以接受的 IMO "callback__validate_member" ; ) +1 用于命名回调函数的双下划线 __ 方案,因为这样函数变得不可访问并返回 404。更重要的是,因为 private 函数不适用于回调。【参考方案2】:

实现这一目标的最佳方法是扩展 CodeIgniter 的表单验证库。假设我们要为数据库表 users 的字段 access_code 创建一个名为 access_code_unique 的自定义验证器。

您所要做的就是在application/libraries 目录中创建一个名为MY_Form_validation.php 的类文件。该方法应始终返回 TRUEFALSE

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

class MY_Form_validation extends CI_Form_validation 
    protected $CI;

    public function __construct() 
        parent::__construct();
            // reference to the CodeIgniter super object
        $this->CI =& get_instance();
    

    public function access_code_unique($access_code, $table_name) 
        $this->CI->form_validation->set_message('access_code_unique', $this->CI->lang->line('access_code_invalid'));

        $where = array (
            'access_code' => $access_code
        );

        $query = $this->CI->db->limit(1)->get_where($table_name, $where);
        return $query->num_rows() === 0;
    

现在您可以轻松添加新创建的规则

$this->form_validation->set_rules('access_code', $this->lang->line('access_code'), 'trim|xss_clean|access_code_unique[users]'); 

【讨论】:

以上是关于创建自定义 codeigniter 验证规则的主要内容,如果未能解决你的问题,请参考以下文章

如何使 CodeIgniter 可调用为空的复选框,自定义表单验证错误

Codeigniter 表单验证无法与自定义回调函数一样工作

Codeigniter 验证——如何限制数值?

将自定义回调添加到 Codeigniter 表单验证

在 codeigniter 中验证 max_length、min_length

基于自定义本地化错误消息asp core 3.1创建自定义jquery验证规则