Codeigniter, parte 8: Validaciones

En la publicación pasada, vimos un ejemplo básico de una aplicación CRUD, en donde podíamos insertar, modificar, eliminar, ver y mostrar una lista de informes de una base de datos. En esa ocasión, nosotros usábamos un formulario que nos permitía crear o modificar informes, éste contaba con las validaciones de Html5, mediante el atributo required.

Sin embargo esto trae consigo un posible problema, y es que el navegador del usuario puede no soportar estas validaciones. Otra solución sería validar el formulario con Javascript, sin embargo esta barrera de seguridad podría ser vulnerada fácilmente, por un usuario con conocimientos medios.

Para ello necesitamos una validación que se encuentre en el lado del servidor, que es mucho más segura que cualquier validación del lado del cliente. Codeigniter entre sus múltiples librerías incluye una llamada form_validation, que nos permitirá validar formularios de manera muy sencilla.

Para incluir esta librería podemos hacerlo como hicimos anteriormente con database. Podemos ir a application -> config -> autoload.php, y buscar la línea:

$autoload['libraries'] = array('database');

Agregar una nueva posición en el array con la librería que queremos cargar:

$autoload['libraries'] = array('database', 'form_validation');

Otra forma más barata, es cargarlo dentro del controlador donde lo necesitamos usar. Yo lo haré de esta última forma.

Dentro de application -> controllers -> informes.php voy a modificar el constructor que estaba así:

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

Por:

public function __construct() {
   parent::__construct();
   $this->load->library('form_validation');
}

Como se ve en el ejemplo, otra forma de cargar una librería es mediante el método library() del objeto load. La desventaja que tiene esto, es que no se cargará en toda la aplicación, sino en los controladores donde es solicitado. Para incluir la librería en toda la aplicación debemos hacerlo como mostré antes, dentro del archivo autoload.php.

Ahora que ya tenemos la librería cargada, podemos validar nuestro formulario. Para eso vamos a modificar el método guardar_post(), que hicimos en la última publicación, el cuál tenía el siguiente aspecto:

public function guardar_post($id=null){
   if($this->input->post()){
      $titulo = $this->input->post('titulo');
      $descripcion = $this->input->post('descripcion');
      $prioridad = $this->input->post('prioridad');
      $this->load->model('informe_model');
      $this->informe_model->guardar($titulo, $descripcion, $prioridad, $id);
      redirect('informes');
   }else{
      $this->guardar();
   } 
}

Por este nuevo:

public function guardar_post($id=null){
   if($this->input->post()){
      $titulo = $this->input->post('titulo');
      $descripcion = $this->input->post('descripcion');
      $prioridad = $this->input->post('prioridad');
      $this->form_validation->set_rules('titulo', 'Título', 'required');
      $this->form_validation->set_rules('descripcion', 'Descripción', 'required');
      $this->form_validation->set_rules('prioridad', 'Proridad', 'required|numeric'); 
      //Verifica que el formulario esté validado.
      if ($this->form_validation->run() == TRUE){
         $this->load->model('informe_model');
         $this->informe_model->guardar($titulo, $descripcion, $prioridad, $id);
         redirect('informes');
      }else{
         $data = array();
         $data['id'] = $id;
         $data['titulo'] = $titulo;
         $data['descripcion'] = $descripcion;
         $data['prioridad'] = $prioridad;
         $this->load->view('informes/header');
         $this->load->view('informes/guardar', $data);
         $this->load->view('informes/footer');
      }
   }else{
      $this->guardar();
   } 
}

Mediante el método set_rules(), del objeto form_validation, podemos crear una regla de validación. Este método va a recibir tres parámetros, el primero es el nombre del campo a validar, el segundo es el valor que se le mostrará al usuario cuando haya un error, y el tercero la regla en sí.

En los dos primeros, titulodescripcion, usamos la regla required, que significa que es un campo que debe llenarse en forma obligatoria:

$this->form_validation->set_rules('titulo', 'Título', 'required');
$this->form_validation->set_rules('descripcion', 'Descripción', 'required');

Mientras que el tercero es una combinación entre required y numeric, esto tendrá en cuenta que el campo sea obligatorio y numérico:

$this->form_validation->set_rules('prioridad', 'Proridad', 'required|numeric');

Luego vamos a preguntar si el formulario está validado correctamente, mediante el método run() del objeto form_validation:

if ($this->form_validation->run() == TRUE)

Pero, si no fue así, osea que hay errores, entonces vamos a volver a mostrar el formulario, con los datos que introdujo anteriormente el formulario, para que el usuario corrija los errores:

$data = array();
$data['id'] = $id;
$data['titulo'] = $titulo;
$data['descripcion'] = $descripcion;
$data['prioridad'] = $prioridad;
$this->load->view('informes/header');
$this->load->view('informes/guardar', $data);
$this->load->view('informes/footer');

Ahora solamente nos resta mostrar las validaciones una vez que el formulario se recargue con errores, para eso vamos a nuestra vista en application -> views -> informes -> guardar.php y agregamos las siguientes líneas, en alguna parte de nuestro código donde queramos que se visualicen los errores:

<?php if (validation_errors()): ?>
   <div class="alert alert-error">
      <?php echo validation_errors(); ?>
   </div>
<?php endif; ?>

(Para probar el ejemplo en forma más rápida, deberíamos quitar los atributos required del código html)

Ahora, si probaste enviar el formulario con errores, habrás notas que estos vienen en inglés, para personalizar los mismos luego de cargar la librería deberíamos utilizar el método set_message(), del objeto form_validation. Así que luego de:

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

Vamos a agregar las siguientes líneas:

$this->form_validation->set_message('required', '%s es obligatorio.');
$this->form_validation->set_message('numeric', '%s debe ser numérico.');

 

Para ver más reglas de validación podés chequear el manual de Codeigniter:

https://ellislab.com/codeigniter/user-guide/libraries/form_validation.html#rulereference

 

Anterior: Codeigniter, parte 7: CRUD

Siguiente: Codeigniter, parte 9: Librería Session


9 Respuestas a “Codeigniter, parte 8: Validaciones”

  1. En el views\informes\guardar.php
    El boton de tipo SUBMIT guardar, te manda a esta ruta http://misitio.com/index.php/informes

    Sin embargo por la modificación previa en el .htaccess se supone que nunca se debe de mostrar INDEX.PHP

    como se podria retirar el index.php en este ejemplo?

    saludos.

    1. Andate a application/config.php, y buscá la siguiente línea:

      $config[‘index_page’] = ‘index.php’;

      Y modificala por:

      $config[‘index_page’] = »;

      Saludos!

  2. Hola. Necesito que me respondan lo siguiente para un proyecto en el que estoy trabajando con CodeIgniter. Quiero hacer una validación en mi controlador con lo siguiente:
    Si un dato no existe en la Base de Datos me muestre un mensaje. Gracias de antemano.

    1. Deysi, para resolver esto te sugiero que revises algún ejemplo de Codeigniter de cómo hacer un ABL, yo hace un tiempo publiqué éste:

      http://fernando-gaitan.com.ar/codeigniter-parte-7-crud/

      Si te fijas bien hay un método que se llama row(), y de no encontrar un registro te va a devolver null. Ese valor se lo pasas a la vista, y con un if verificas desde la vista si el valor es null, mostrás el mensaje.

      Saludos!

  3. Hola Fernando el ejemplo es genial! Me queda la duda del lado de la vista, para que las alertas aparezcan por cada input. Ponele si no cargo el titulo que la alerta para este aparezca debajo de ese inut. Desde ya muchas gracias.

  4. Hola Fernando, disculpa que te moleste, tengo el siguiente inconveniente, en un post anterior te comente que tengo implementado, en vez de header y footer una plantilla, me solucionaste el inconveniente que tenia y todo ha marchado bien, ahora siguiendo con el tutorial e implementando algunas otras librerias y helpers, me encuentro con el siguiente inconveniente al EDITAR un registro, al dar en el boton Editar me envia al formulario guardar con la siguiente URL informes/guardar/6, lo que esta bien, pero no muestra los datos para modificar, contrariamente si hago click en ver, si se myestra el registro.

    Ahora te cuento, yo cree el formulario con form_open y form_close de la siguiente forma,
    donde $atributosForm, es la configuracion del formulario:
    $atributosForm = array(
    ‘id’ =>’form1′,
    ‘class’=>’form-horizontal’,
    ‘role’ =>’form’
    );

    Que me falta hacer para que muestre los datos a editar?

    Por favor si sabes de algo que deba modificar para que muestre el registro, me puedes ayudar?

    De antemanos muchas gracias

    Un cordial saludo

    1. Si querés mandame tu controlador por correo, porque no tengo la suficiente información para detectar el problema.

      Saludos!

      1. Hola Fernando, Gracias por tu preocupación.
        Tengo comprimidos los archivos para enviarlos, pero no se a que dirección de correo enviarlos y no encuentro ningún contacto en ti blog