2017-04-05 113 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