2012-02-06 17 views
8

He colocado este archivo de clase llamado 'My_Form_validation.php' en 'application/core' y también he intentado colocarlo en 'application/libraries'.Extendiendo la validación de formulario en Codeigniter

En mi controlador estoy usando

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

Esto es lo que hay en My_Form_validation.php - la lógica real no está en cuestión aquí porque tengo un par de opciones para validar en realidad el código postal. Lo que necesito ayuda es entender por qué no se está cargando o recibiendo llamadas.

Mi versión de CI es 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

comprobaciones de validez: 1) archivo es 'application/libraries/MY_Form_validation.php', 2)' $ config [ 'subclass_prefix '] =' MY _ '; ', 3) Su umbral de registro de configuración generará su mensaje de depuración (y los permisos de archivo lo permiten) – landons

+0

Sí a todo ... –

+0

No hay pista. Tendría que disparar depurarlo con todo tipo de llamadas 'var_dump()' y 'die()' ... – landons

Respuesta

17

Debido a que usted está extendiendo una biblioteca CodeIgniter y no un componente central, que desea colocar en el que application/libraries (no application/core).

Y, por supuesto, no olvide cargar la biblioteca Form_validation dentro de su código de controlador.

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

Otras cosas a comprobar:

  • mayúsculas y minúsculas Nombre (MY_Form_validation.php cargas mientras se My_Form_validation.php no)
  • Nombre de clase mayúsculas y minúsculas (clase MY_Form_validation extiende CI_Form_validation)

Referencia material:

+0

Probé todos los tipos diferentes de capitalizaciones en el archivo 'MY_Form_validation' y nombre de archivo pero ninguno funcionó. ¿Podría haber un cambio dependiendo de la versión de CI que está usando? –

+2

@timpeterson: Hice lo mismo. ¿Pudiste encontrar una solución a esto? – user1149244

+0

He tenido pesadillas interminables tratando de hacer que esto funcione correctamente. Mi archivo y clase fueron llamados 'My_form_validation' en lugar de' MY_Form_validation'. Me estoy pateando ahora –

11

hay que añadir reglas $ en su método __construct y también pasar esta a constructor de matriz

por ejemplo:

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

Mira Form_validation y proporcionar mismas variables.

+0

ialbescu, FTW. Esto no solo tiene sentido, sino que también funciona. No puedo creer que pasé por alto pasar la matriz de reglas. Bien hecho. +1 – Abinadi

2

Sé que esto es viejo, pero por si alguien más tropieza con esto en la actualidad como yo, aquí hay un ejemplo rápido. (En la actualidad el uso de 3.0.6, pero creo que esto va a funcionar el 2 también.)

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. No es necesario obtener la instancia. –

Cuestiones relacionadas