2011-11-18 51 views
18

Tengo una función en mi formulario de inicio de sesión que comprueba si el correo electrónico y la contraseña coinciden con los valores de la base de datos y, de ser así, registra al usuario en el sistema.Crear una regla de validación codeigniter personalizada

Me gustaría mostrar un error de validación si esta función devuelve falso.

Mi problema es que no estoy seguro de cómo crear esto. El mensaje se relaciona con los campos de contraseña y correo electrónico, por lo que no me gustaría que una regla para cada campo de entrada solo muestre un solo mensaje.

He intentado utilizar flashdata para lograr esto, pero solo funciona cuando la página se ha actualizado.

¿Cómo puedo crear una nueva regla de validación únicamente para la función $this->members_model->validate_member() ??

$this->form_validation->set_error_delimiters('<div class="error">', '</div>'); 
     $this->form_validation->set_rules('email_address', '"Email address"', 'trim|required|valid_email'); 
     $this->form_validation->set_rules('password', '"Password"', 'trim|required'); 

     if ($this->form_validation->run() == FALSE) 
     { 
      $viewdata['main_content'] = 'members/login'; 
      $this->load->view('includes/template', $viewdata); 
     } 
     else 
     {  
       if($this->members_model->validate_member()) 
       { 

Respuesta

38

utiliza el callback_ en sus reglas, consulte callbacks, por ej.

$this->form_validation->set_rules('email_address', '"Email address"', 'trim|required|valid_email|callback_validate_member'); 

y añada el método en el controlador. Este método debe devolver VERDADERO o FALSO

function validate_member($str) 
{ 
    $field_value = $str; //this is redundant, but it's to show you how 
    //the content of the fields gets automatically passed to the method 

    if($this->members_model->validate_member($field_value)) 
    { 
    return TRUE; 
    } 
    else 
    { 
    return FALSE; 
    } 
} 

A continuación, deberá crear un error correspondiente en caso de falla la validación

$this->form_validation->set_message('validate_member','Member is not valid!'); 
+2

Nombre "_validate_member" será mejor .. – Ivan

+0

@Ivan No es necesario, pero puede agregar legibilidad, gracias –

+6

Puede que no sea necesario, pero un subrayado inicial evitará que el método sea accesible mediante "/ nombre_de_controlador/validate_member/blah" ... y usar un doble guión bajo es perfectamente aceptable OMI "callback__validate_member";) –

5

Una mejor manera de lograr esto está extendiendo biblioteca de formularios de validación de CodeIgniter. Supongamos que queremos crear un validador personalizado llamado access_code_unique para el campo access_code de la tabla de la base de datos users.

Todo lo que tiene que hacer es crear un archivo de clase llamado MY_Form_validation.php en el directorio application/libraries. El método debería devolver siempre TRUE O FALSE

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

class MY_Form_validation extends CI_Form_validation { 
    protected $CI; 

    public function __construct() { 
     parent::__construct(); 
      // reference to the CodeIgniter super object 
     $this->CI =& get_instance(); 
    } 

    public function access_code_unique($access_code, $table_name) { 
     $this->CI->form_validation->set_message('access_code_unique', $this->CI->lang->line('access_code_invalid')); 

     $where = array (
      'access_code' => $access_code 
     ); 

     $query = $this->CI->db->limit(1)->get_where($table_name, $where); 
     return $query->num_rows() === 0; 
    } 
} 

Ahora usted puede agregar fácilmente su nueva regla creada

$this->form_validation->set_rules('access_code', $this->lang->line('access_code'), 'trim|xss_clean|access_code_unique[users]'); 
Cuestiones relacionadas