【问题标题】:Codeigniter callbacks affecting required validation影响所需验证的 Codeigniter 回调
【发布时间】:2016-10-23 15:33:07
【问题描述】:

我正在使用 codeigniter 3.1.1。我是codeigniter的新手,我遇到了一个可以解决的问题。我的回调函数似乎会影响所需的验证,因为似乎跳过了所需的规则,并且即使字段为空,回调函数也会被执行。这是我的代码

$validate_data = array(

        array(

            'field' => 'pages',
            'label' => 'No of pages',
            'rules' => 'trim|required|integer|callback_regex_pages'
            )
  );

  $this->form_validation->set_rules($validate_data);
  $this->form_validation->set_error_delimiters('<p class="text-danger">','</p>');

我的回调函数

   public function regex_pages(){

if(!preg_match('/^\d(\d)?(\d)?$/',$this->input->post('pages'))){

    $this->form_validation->set_message('regex_pages', 'The {field} is not valid!');

    return false;

    }else{

    return true;

    }
   }//end method regex_pages

这只是我以这种方式运行的众多回调之一。如果我删除回调规则,则执行所需的规则

这是我下面的输出

【问题讨论】:

  • 输入是什么,显示样本
  • 我相信$this-&gt;form_validation-&gt;run() 将测试所有规则,无论其中任何一个返回false。也就是说,即使 required 规则返回 false 也不会阻止 regex_pages 被调用。

标签: php codeigniter


【解决方案1】:

无论字段的值是否有效,都设置消息。

 public function regex_pages($value){

   //set message anyway
   $this->form_validation->set_message('regex_pages', 'The {field} is not valid!');

   //the rule will be available for any field, not just for pages
   return (bool) preg_match('/^\d(\d)?(\d)?$/',$value);

}

您还可以使用 Codeigniter regex_match 规则。 http://www.codeigniter.com/user_guide/libraries/form_validation.html?highlight=form%20validation#CI_Form_validation

'rules' => 'trim|required|integer|regex_match[//]'

【讨论】:

    【解决方案2】:

    我建议您通过创建一个名为“MY_form_validation”的新库来扩展您的表单验证库,该库将扩展“CI_form_validation”并将其保存在“libraries”文件夹中;在此之后,将所有回调函数放在 MY_form_validation 中,这样,您将获得全局可用的回调,但请记住,您无需设置带有前缀“回调”的规则。 这是一个例子:

    $validate_data = array(
    
        array(
    
            'field' => 'pages',
            'label' => 'No of pages',
            'rules' => 'trim|required|integer|regex_pages'
            )
    

    );

    $this->form_validation->set_rules($validate_data);
    $this->form_validation->set_error_delimiters('<p class="text-danger">','</p>');
    

    所以在 MY_form_validation 中你将创建函数

    public function regex_pages($value_to_be_validated){
    
    if(!preg_match('/^\d(\d)?(\d)?$/',$value_to_be_validated)){
    
    $this->set_message('regex_pages', 'The {field} is not valid!');
    
    return false;
    
    }else{
    
    return true;
    
    }
    

    【讨论】:

    • 这似乎是一个解决方案,但不完全形成需要访问数据库的规则,例如检查电子邮件地址是否存在,因为我无法加载我的模型类或使用$this-&gt;db
    • 哦,我发现它使用了`$this->CI->load->database();`
    • 你可以通过调用函数get_instance()来加载你的数据库或任何你想要的东西;所以,如果你做类似 $CI = get_instance();您将通过 $CI->load->database(); 调用您的数据库;如果要加载模型,只需键入: $CI->load->model('your_name_model');在此之后,您将能够通过键入以下内容来调用您的模型: $CI->your_model_name->your_method();
    猜你喜欢
    • 1970-01-01
    • 2011-04-23
    • 1970-01-01
    • 2016-05-19
    • 1970-01-01
    • 1970-01-01
    • 2014-09-24
    • 2012-06-16
    • 2015-07-04
    相关资源
    最近更新 更多