Codeigniter, parte 8: Validaciones

11 Ago

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

Redes sociables

    2 thoughts on “Codeigniter, parte 8: Validaciones

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

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

        Y modificala por:

        $config[‘index_page’] = ”;

        Saludos!

    Deja un comentario

    Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *


    *