2009-01-22 18 views
14

Estoy escribiendo mi clase de validación de formulario usando CodeIgniter. ¿Hay alguna manera de que pueda obtener mensajes de error en el par de nombre y valor? Por ejemplo, en un formulario de muestra hay cuatro campos: user_name, password, password_conf y timezone. Entre ellos user_name y password la validación ha fallado después de ejecutar la siguiente:Validación de formulario de CodeIgniter: obtenga el resultado como "matriz" en lugar de "cadena"

$result = $this->form_validation->run(); 

Si la función anterior devuelve falso, quiero conseguir los errores en pares de nombre y valor como la siguiente:

Array 
{ 
    'user_name' => 'user name is required', 
    'password' => 'passord is required' 
} 

que realmente quiero formar un JSON, que puedo devolver a la llamada AJAX. Tengo una solución (sucio): Puedo llamar a los métodos de validación de uno en uno como el siguiente:

$this->form_validation->required($user_name); 
$this->form_validation->required($password); 

¿Hay alguna otra manera, para obtener todos los mensajes de error a la vez en el valor de par de nombres?

EDITAR: Yo se sugirió que ver con jQuery validación de una de las respuestas:

jQuery le ayudará en la validación del lado del cliente, pero ¿qué hay del lado del servidor, no estoy usando la validación CodeIgniter.

He diseñado de tal manera que:

  1. he puesto todos los valores usando AJAX.
  2. Validar en el lado del servidor (PHP).
  3. Realice la operación deseada si las entradas son válidas; else devuelve error al usuario.

Respuesta

16

he encontrado una manera a mí mismo mirando en el código CodeIgniter: que han extendido el CI_Form_validation biblioteca como: -

class MY_Form_validation extends CI_Form_validation 
{ 
    public function getErrorsArray() 
    { 
     return $this->_error_array; 
    } 
} 

Lo sé, esto es un truco, sino que servirá mi necesidad por el momento . Espero que el equipo de CodeIginter pronto encuentre una interfaz para acceder a esa matriz.

+2

No es un hack en absoluto, de eso se trata OOP. Estoy caminando por el mismo camino, y este es mi juego final ya que no veo otra alternativa. – thenetimp

+4

Definitivamente es una buena solución. Es una pena en codeigniter por no tener esta funcionalidad de forma nativa! –

+0

Esto no devuelve ningún valor. ¿Alguna idea de por qué? Cuando descargo $ este puntero, veo que _error_array está protegido. La matriz siempre regresa vacía. –

1

En vista de que la validación del código de encendido le da los mensajes de error en una actualización de la página normal, ¿no sería mejor utilizar algo así como el jquery validation plugin que validará su totalidad lado del cliente antes de enviar el formulario? No hay AJAX necesario de esa manera.

EDITAR: No estoy sugiriendo NO HACER la validación del lado del servidor, solo esa publicación con AJAX para validar no es necesaria y reducirá las visitas al servidor si lo hace por el lado del cliente. Se degradará con gracia a la actualización de la página normal con errores o un mensaje de éxito.

+3

La validación del lado del cliente no debe ser su única preocupación, la validación de back-end es mucho más importante. –

+0

Correcto, eso sería estúpido. No sugerí NO HACER la validación del lado del servidor - leer mi edición Y publicación original nuevamente. – roborourke

+0

Además, a veces la validación NECESITA hacerse back-end, por ejemplo para validar algo en una tabla de base de datos (unicity en una tabla) – MaxiWheat

1

La solución que más me gusta no implica la adición de una función de cualquier parte o la ampliación de la biblioteca de validación:

$validator =& _get_validation_object(); 
$error_messages = $validator->_error_array; 

Referencia: http://thesimplesynthesis.com/post/how-to-get-form-validation-errors-as-an-array-in-codeigniter/

usted debería ser capaz de llamar a este en cualquier punto de su código .Además, vale la pena señalar que hay un newer thread que analiza esto también.

+0

'$ this-> form_validation-> error_array();' ya está en la biblioteca. ¿Por qué no usarlo? – masterFly

1

Puede crear una función privada en su controlador

private function return_form_validation_error($input) 
{ 
    $output = array(); 
    foreach ($input as $key => $value) 
    { 
     $output[$key] = form_error($key); 
    } 
    return $output; 
} 

y luego en su método de validación, simplemente llame a esto, aquí es mío

public function add_cat_form() 
 
    { 
 
     $this->output->unset_template(); 
 
     $this->load->library('form_validation'); 
 
     $this->form_validation->set_rules('name', 'Name', 'required'); 
 
     if ($this->form_validation->run()) 
 
     { 
 
      if (IS_AJAX) 
 
      { 
 
       $dataForInsert = $this->input->post(); 
 
       if ($dataForInsert['parentid'] == -1) 
 
       { 
 
        unset($dataForInsert['parentid']); 
 
       } 
 
       $this->post_model->add_cat($dataForInsert); 
 
       echo json_encode('success'); 
 
      } else 
 
      { 
 
       #in case of not using AJAX, the AJAX const defined 
 
      } 
 
     } else 
 
     { 
 
      if (IS_AJAX) 
 
      { 
 
       #This will be return form_validation error in an array 
 
       $output = $this->return_form_validation_error($this->input->post()); 
 
       echo $output = json_encode($output); 
 
      } else 
 
      { 
 
       #in case of not using AJAX, the AJAX const defined 
 
      } 
 
     } 
 
    }

Cuestiones relacionadas