2012-02-06 16 views
8

Ho inserito questo file di classe chiamato "My_Form_validation.php" in "application/core" e ho anche provato a inserirlo in "application/library".Estensione del modulo di convalida in Codeigniter

Nel mio controller sto usando

$this->form_validation->set_rules('user_postcode', 'Postcode', 'valid_postcode|trim|required|xss_clean'); 

Si tratta di che cosa è in My_Form_validation.php - la logica di reale non è in questione qui perché ho un paio di opzioni per convalidare in realtà il codice postale. Quello di cui ho bisogno di aiuto è capire perché non sta caricando o non viene chiamato!

La mia versione CI è define ('CI_VERSION', '2.0.2');

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

/** 
* Form validation for UK Postcodes 
* 
* Check that its a valid postcode 
* @author James Mills <[email protected]> 
* @version 1.0 
* @package FriendsSavingMoney 
*/ 

class MY_Form_validation extends CI_Form_validation 
{ 

    function __construct() 
    { 
     parent::__construct(); 
     log_message('debug', '*** Hello from MY_Form_validation ***'); 
    } 

    function valid_postcode($postcode) 
    { 

     /** 
     * 
     * UK Postcode validation expression from Wikipedia 
     * http://en.wikipedia.org/wiki/Postcodes_in_the_United_Kingdom 
     * 
     * Note: Remember to strtoupper() your postcode before inserting into database! 
     * 
     */ 

     $pattern = "/^(GIR 0AA)|(((A[BL]|B[ABDHLNRSTX]?|C[ABFHMORTVW]|D[ADEGHLNTY]|E[HNX]?|F[KY]|G[LUY]?|H[ADGPRSUX]|I[GMPV]|JE|K[ATWY]|L[ADELNSU]?|M[EKL]?|N[EGNPRW]?|O[LX]|P[AEHLOR]|R[GHM]|S[AEGKLMNOPRSTY]?|T[ADFNQRSW]|UB|W[ADFNRSV]|YO|ZE)[1-9]?[0-9]|((E|N|NW|SE|SW|W)1|EC[1-4]|WC[12])[A-HJKMNPR-Y]|(SW|W)([2-9]|[1-9][0-9])|EC[1-9][0-9]) [0-9][ABD-HJLNP-UW-Z]{2})$/"; 


     if (preg_match($pattern, strtoupper($postcode))) 
    { 
      return TRUE; 
     } 
     else 
     { 
      $this->set_message('valid_postcode', 'Please enter a valid postcode'); 
      return FALSE; 
     } 
    } 
} 
+2

controlli di integrità: 1) file è 'applicazioni/librerie/MY_Form_validation.php', 2)' $ config [ 'subclass_prefix '] =' MY _ '; ', 3) La soglia del log di configurazione mostrerà il tuo messaggio di debug (e permetteranno permessi ai file) – landons

+0

Sì a tutto ... –

+0

Nessun indizio. Dovrei eseguire il debug del fucile con tutti i tipi di chiamate 'var_dump()' e 'die()' ... – landons

risposta

17

Perché si sta estendendo una biblioteca CodeIgniter e non un componente di base, si desidera inserire che nel application/libraries (non application/core).

E, naturalmente, non dimenticare di caricare la libreria Form_validation all'interno del codice del controller.

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

Altre cose da controllare:

  • caso Nome file sensibilità (MY_Form_validation.php carichi mentre My_Form_validation.php sarà meno)
  • nome Classe caso sensibilità (classe MY_Form_validation estende CI_Form_validation)

di riferimento materiale:

+0

Ho provato tutti i diversi tipi di maiuscole nel file "MY_Form_validation" e il nome del file, ma nessuno di essi ha funzionato. Potrebbe esserci un cambiamento a seconda della versione di CI che si sta utilizzando? –

+2

@ timpeterson: ho fatto la stessa cosa. Sei riuscito a trovare una soluzione a questo? – user1149244

+0

Ho avuto incubi senza fine cercando di farlo funzionare correttamente. Il mio file e la mia classe erano entrambi chiamati 'My_form_validation' invece di' MY_Form_validation'. Mi sto prendendo a calci ora –

11

dovete aggiungere $ regole del metodo __construct ed anche passare questo al costruttore genitore

esempio:

function __construct($rules = array()) 
{ 
    parent::__construct($rules); 
} 

Guardate Form_validation e fornire stesse variabili

+0

ialbescu, FTW. Non solo ha senso, funziona anche. Non posso credere di aver trascurato il passaggio dell'array delle regole. Ben fatto. +1 – Abinadi

2

So che questo è vecchio, ma nel caso in cui qualcun altro inciampi su questo nel giorno moderno come ho fatto, ecco un rapido esempio. (Attualmente utilizzando 3.0.6, ma credo che questo funzionerà su 2 pure.)

class MY_Form_validation extends CI_Form_validation { // Capitalization matters 

    protected $CI; 

    public function __construct() { 
     parent::__construct(); 
    } 

    /** 
    * Valid Date 
    * 
    * Verify that the date value provided can be converted to a valid unix timestamp 
    * 
    * @param string $str 
    * @return bool 
    */ 

    public function valid_date($str) { 
     $CI = $this->CI =& get_instance(); // Get your CodeIgniter instance 

     if (($str = strtotime($str)) === FALSE) { // Basic timestamp check 
      // Set error message by calling the method through the CI instance. 
      // Obviously must be done BEFORE returning any value 
      $this->CI->form_validation->set_message('valid_date', '{field} must be a valid date.'); 
      return FALSE; 
     } 

     return TRUE; 
    } 
} 
+1

'$ CI-> form_validation == $ this' fyi. Non c'è bisogno di ottenere l'istanza. –

Problemi correlati