2016-06-23 19 views
0

EDIT2:スクロールダウンして最新の情報を入手してください!カスタムコールバック検証ルール(CodeIgniter 3 HMVC)が見つかりません

CodeIgniter 3では、最近私のコントローラのすべてでコールバックルールをapplication/libraries/MY_Form_validation.phpに移動し、コードの繰り返しなどを防ぎ、クリーンアップしました。

今はもう機能していないようです。

MY_Form_validation.phpは次のように起動します:

<?php if (!defined('BASEPATH')) exit('No direct script access allowed'); 

class MY_Form_validation extends CI_Form_validation 
{ 
    public $CI; 

    function run($module = '', $group = '') 
    { 
     log_message('debug',"Now running the MY_Form_validation"); 
     (is_object($module)) AND $this->CI = &$module; 
     return parent::run($group); 
    } 

はその後、コールバック関数の全リストは以下の、すべてのpublic function callback_name(){}と定義します。

また、提供されたユーザーログイン情報が正しいかどうか(したがってユーザーがログインできるかどうかなど)を確認する(同じクラスにありますが)フォーム検証でルールが見つからない場合もあります。

エラーログは次のようになります。

INFO - 2016-06-23 13:33:18 --> Form Validation Class Initialized 
DEBUG - 2016-06-23 13:33:18 --> Now running the MY_Form_validation 
INFO - 2016-06-23 13:33:18 --> Language file loaded: language/english/form_validation_lang.php 
DEBUG - 2016-06-23 13:33:18 --> Unable to find callback validation rule: check_database 

最初のDEBUGメッセージが(その上書きrun()方法が使用されているように、したがって、デバッグログ)MY_Form_validationがロードされていることを示しているが、それは何とか見つけることができませんコールバック関数は以下で明確に定義されています。

私はまた、次の行で言語ファイルapplication/language/english/form_validation_lang.php含ま:

$lang['form_validation_check_database'] = 'The password does not match the username. Try again.';、それは正しくキャッチ(フォームの検証を実行するとき、すなわち、このメッセージが表示されている)、それは何らかの形でコールバック関数自体を見つけることができません。

編集:私はメソッドが正しく継承されていなかったかどうかチェック:

public function __construct($rules = array()) 
    { 
    $this->CI =& get_instance(); 
    var_dump(get_class_methods($this)); 

var_dump()は出力にする方法、独自のカスタムコールバックや内蔵のものの両方の正しい、完全な配列を行います。

EDIT2: 私はsystem/libraries/Form_validation.phpを読んで、デバッグメッセージが発生する場所を調べ、このコードサンプル(ライン734から749)で見ることができる。

// Call the function that corresponds to the rule 
    if ($callback OR $callable !== FALSE) 
    { 
     if ($callback) 
     { 
      if (! method_exists($this->CI, $rule)) 
      { 
       log_message('debug', 'Unable to find callback validation rule: '.$rule); 
       $result = FALSE; 
      } 
      else 
      { 
       // Run the function and grab the result 
       $result = $this->CI->$rule($postdata, $param); 

      } 
     } 

コールバックだけを探しているかのように思えメインのCIオブジェクトには存在しますが、フォーム検証ライブラリ自体には含まれません。ライブラリーのコールバックを選択するハッキーな例外を追加することもできますが、これが最善のことだとは思っていません。私は単純なものを見落としていると思います...

追加情報が必要な場合はお知らせください。

答えて

0

さてさて、私は、どうやら...

を発見していないとすぐにMY_Form_validation.phpにコールバック関数を移動すると、彼らは実際は、内蔵されている検証ルール、およびもはやコールバックとして動作します。

フォームルールを設定する場合、私はまだかなり(MY_)Form_validationクラスより(すなわち、コントローラ内の)正常CIオブジェクトにルールのForm_validationライブラリの外観を作る適用callback_接頭辞を有していたが。

私の解決策は、適用された検証ルール設定からこの接頭辞を削除することでした。今すぐ 'コールバック'関数が正しく検出されます。

0

この

<?php 

class Form extends CI_Controller { 

     public function index() 
     { 
       $this->load->helper(array('form', 'url')); 

       $this->load->library('form_validation'); 

       $this->form_validation->set_rules('username', 'Username', 'callback_username_check'); 
       $this->form_validation->set_rules('password', 'Password', 'required'); 
       $this->form_validation->set_rules('passconf', 'Password Confirmation', 'required'); 
       $this->form_validation->set_rules('email', 'Email', 'required|is_unique[users.email]'); 

       if ($this->form_validation->run() == FALSE) 
       { 
         $this->load->view('myform'); 
       } 
       else 
       { 
         $this->load->view('formsuccess'); 
       } 
     } 

     public function username_check($str) 
     { 
       if ($str == 'test') 
       { 
         $this->form_validation->set_message('username_check', 'The {field} field can not be the word "test"'); 
         return FALSE; 
       } 
       else 
       { 
         return TRUE; 
       } 
     } 

} 

?> 
を試してみてください。
関連する問題