我的代码如下:
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()所有其他验证工作但回调函数不起作用.... 它总是抛出我的自定义错误'无效字符串'!!! ...
任何解决方案?...
答案 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()
方法未更改。