Codeigniter form_validation回调函数问题

时间:2017-04-05 12:21:29

标签: php codeigniter callback codeigniter-3

我的代码如下:

class Test_model extends MY_Model
{
  public $validation_rules = [
    'field' => 'input_text',
    'label' => 'Your Text',
    'rules' => 'trim|callback_checkString',
    'errors' => [
      'checkString' => 'Invalid String',
    ]
  ];

  public function checkString($x){
    return $x==='valid';
  }

  /* callback function */
  public function do_my_job(){
    /*form_validation is already loaded in autoload.php*/
    $this->form_validation->set_rules($this->validation_rules);
    if($this->form_validation->run()){
      /*do something*/
    }else show_404();
  }
}

当我调用$ this-> Test_model-> do_my_job()所有其他验证工作但回调函数不起作用.... 它总是抛出我的自定义错误'无效字符串'!!! ...

任何解决方案?...

1 个答案:

答案 0 :(得分:0)

您需要为自定义规则定义错误消息。在您的情况下,将消息添加到$validation_rules将非常容易。

public $validation_rules = [
  'field' => 'input_text',
  'label' => 'Your Text',
  'rules' => 'trim|callback_checkString',
  'errors' => ['checkString' => '{field} text is not valid'],
];

另一种选择是在set_message之后立即使用set_rules方法。

$this->form_validation
     ->set_rules($this->validation_rules)
     ->set_message('checkString', '{field} text is not valid');

Setting Error Messages Documentation

下一位没有回答您的问题,但请在checkString上考虑此变体。

public function checkString($x)
{
  return $x==='valid'; //this will evaluate to a boolean, if/else not required
}

第2部分

未验证有效输入的问题是因为定义了回调函数的位置。 Form_validation期望验证方法在控制器中。 (从技术上讲,它实际上在CI“超级对象中寻找方法”并且该对象是控制器。)将回调定义移动到控制器应该可以解决所有问题。

第3部分

如果您想让整个网站都可以使用自定义验证器,并且保持代码干净,最简单的方法就是扩展CI_Form_validation。比你想象的更容易做到。

创建文件application/libraries/MY_Form_validation.php 这是代码

defined('BASEPATH') OR exit('No direct script access allowed');

class MY_Form_validation extends CI_Form_validation
{
  public function __construct($rules = array())
  {
    parent :: __construct($rules);
  }

  //Add any custom validation methods.

  public function checkString($x)
  {
    return $x === 'valid'; 
  }
}

DONE!

您可以像往常一样加载表单验证,并使用新方法,就像使用CI中包含的规则一样。您不使用callback_前缀。

以下是您的新规则现在将如何在您的模型中设置。

public $validation_rules = [
  'field' => 'input_text',
  'label' => 'Your Text',
  'rules' => 'trim|checkString',
  'errors' => [
    'checkString' => 'Invalid String',
  ]
];

do_my_job()方法未更改。