2017-04-05 89 views
0

我的代码如下:笨form_validation回调函数问题

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(); 
    } 
} 

当我打电话$这个 - > Test_model-> do_my_job()所有其他的验证工作,但回调函数不是作品.... 它总是抛出我的自定义错误“无效的字符串” !!! ...

任何解决办法吗?...

+0

https://codeigniter.com/userguide3/libraries/form_validation.html#setting-error-messages – Narf

回答

0

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

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

另一种选择是set_rules后使用set_message方法正确。

$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()方法不变。

+0

谢谢:)根据你的建议我已经为'checkString'=>'invalid String'设置了一个错误信息, &现在prevoius错误已解决,但即使通过输入字段输入'valid',自定义消息“无效字符串”也会被抛出! :'( – Amin

+0

即使我试过了:公共函数checkString($ x){return true;} – Amin

+0

好的,算出来了,应该记住了这个问题,见编辑答案的第2部分。 – DFriend