2016-06-23 12 views
0

EDIT2: Scrollen Sie nach unten, um die aktuellsten Informationen zu erhalten!Die benutzerdefinierte Callback-Validierungsregel kann nicht gefunden werden (CodeIgniter 3 HMVC)

In CodeIgniter 3 habe ich kürzlich Callback-Regeln über alle meine Controller auf application/libraries/MY_Form_validation.php verschoben, um Code-Wiederholungen usw. zu verhindern und zu bereinigen.

Im Moment scheinen sie nicht mehr zu funktionieren.

MY_Form_validation.php beginnt wie folgt aus:

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

Dann eine ganze Liste von Callback-Funktion folgt, die alle als public function callback_name(){} definiert.

Ich habe auch eine (in der gleichen Klasse), die überprüft, ob die bereitgestellten Benutzeranmeldeinformationen korrekt sind (und somit, wenn der Benutzer sich anmelden kann usw.), aber die Formularüberprüfung kann die Regel nicht finden.

Das Fehlerprotokoll sieht wie folgt aus:

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 

Die erste DEBUG Nachricht zeigt an, dass MY_Form_validation geladen wird (als überschrieben run() Methode wird verwendet, damit die Debug-Protokollierung), aber es kann irgendwie nicht finden die Callback-Funktionen sind im Folgenden klar definiert.

Ich habe auch Sprachdatei application/language/english/form_validation_lang.php mit der folgenden Zeile:

$lang['form_validation_check_database'] = 'The password does not match the username. Try again.';, die es richtig fängt (das heißt diese Meldung angezeigt wird, wenn die Formularvalidierung durchführt), aber es kann irgendwie nicht die Callback-Funktion selbst finden.

EDIT: Ich überprüfte, ob Methoden nicht korrekt vererbt wurden:

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

Die var_dump() tut Ausgang die korrekte, vollständige Palette von Methoden, die beide meiner eigenen benutzerdefinierten Rückrufe und den eingebauten in denjenigen.

EDIT2: Ich las die system/libraries/Form_validation.php und untersucht, wo die Debug-Meldung auftritt, das in diesem Codebeispiel zu sehen ist (Zeile 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); 

      } 
     } 

Es scheint, als ob Rückrufe nur gesucht werden im Haupt-CI-Objekt, aber nicht in der Formularüberprüfungsbibliothek selbst. Ich könnte einige hacky Ausnahmen hinzufügen, die die Rückrufe der Bibliothek auswählen würden, aber ich bezweifle, dass das das beste Ding ist, und ich denke, dass ich etwas einfaches übersehe ...

Wenn irgendwelche zusätzlichen Informationen erforderlich sind, lass es mich wissen .

Antwort

0

Okay, fand ich heraus, ...

Offenbar sobald Sie Callback-Funktionen zu MY_Form_validation.php bewegen, sind sie tatsächlich Einbau- Validierungsregeln, und nicht mehr als Rückrufe handeln.

Wenn Form Regeln Einstellung, ich hatte immer noch den callback_ Präfix angelegt, die den Form_validation Bibliothek Blick für die Regel im normalen CI Objekt (das heißt in der Steuerung), anstatt die (my_) Form_validation Klasse.

Das Problem für mich war, dieses Präfix einfach aus den Einstellungen der Gültigkeitsprüfung zu entfernen. Jetzt findet es die 'Callback'-Funktionen korrekt.

0

Bitte Versuchen Sie diese

<?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; 
       } 
     } 

} 

?> 
Verwandte Themen