12. Validación de datos en CakePHP 1.1

Hasta ahora hemos dado nuestros primeros pasos en CakePHP de la mano del ejemplo de la base de datos de la discografía y ha llegado el momento de despedirnos de él, aunque siempre puede uno releer los posts anteriores para repasar.

Vamos a ver cómo se validan los datos en CakePHP a través de otro ejemplo que trabaja con una tabla de usuarios y que se puede crear con el siguiente script MySQL:


create table usuarios (

id mediumint unsigned NOT NULL auto_increment,

nombre varchar(100) NOT NULL,

telefono varchar(9) NOT NULL,

email varchar(100),

primary key(id)

);

Una vez tenemos la tabla, lo primero que debemos hacer es definir las reglas de validación en el modelo.


class Usuario extends AppModel{

   var $name = 'Usuario';

   var $validate = array(  'nombre'=>VALID_NOT_EMPTY,
                           'telefono'=>VALID_NOT_EMPTY,
                           'email'=>VALID_EMAIL,
                           );

}

En este ejemplo hemos utilizado las validaciones predeterminadas de CakePHP VALID_NOT_EMPTY y VALID_EMAIL. Además de estos dos tipos de validación, CakePHP 1.1 cuenta con otros dos: VALID_NUMBER y VALID_YEAR.

Vamos a crear esta vista para ver el efecto de las dos validaciones que acabamos de crear:

<h1>Nuevo Usuario</h1>
<form method="post" action="<?php echo $html->url('/usuarios/anadir_usuario')?>">
   <fieldset>
      <div class="required">
         <label for="usuario_nombre">Nombre:</label>
         <?php echo $html->input('Usuario/nombre', array('size' => '40'))?>
         <?php echo $html->tagErrorMsg('Usuario/nombre', 'El nombre es obligatorio'); ?>
      </div>
      <div class="required">
         <label for="usuario_telefono">Telefono:</label>
         <?php echo $html->input('Usuario/telefono', array('size' => '40'))?>
      </div>
      <div class="required">
         <label for="usuario_email">E-mail:</label>
         <?php echo $html->input('Usuario/email', array('size' => '40'))?>
         <?php echo $html->tagErrorMsg('Usuario/email', 'El e-mail es obligatorio'); ?>
      </div>
</fieldset>
<?php echo $html->submit('Añadir usuario') ?>
</form>

En la vista hemos especificado los campos obligatorios -“required”-. Por una parte, para que la magia de CakePHP funcione, el método validates de la clase Controller comprueba las validaciones que se añaden al modelo, y, por otra, el método validationErrors() de Controller devuelve los mensajes de error que lanza el modelo. El método tagErrorMsg del objeto $html muestra estos errores en la vista. Puedes repasar cómo funcionan los ayudantes HTML aquí.

Anuncios

4 comentarios

  1. La validación de los datos, según la documentación oficial, funciona así: “si en la definición del modelo hay validaciones, entonces éstas se analizan y se comprueban durante los métodos “save”. Para validar los datos directamente se utiliza Model::validates() (devuelve falso si los datos son incorrectos) y Model::invalidFields() (que devuelve una matriz con mensajes de error).”

    Escribía hoy, en el Grupo Google CakePHP en Español, algunas dudas sobre el funcionamiento de la validación porque -según lo que he entendido- no la puedo aplicar en el caso concreto del alta de un usuario del sistema en varios pasos. También decía esto a otro usuario del Grupo Google:

    “Es decir, que, según entiendo yo, sin métodos saves no hay validación de datos y tengo un problema: si mis usuarios se registran en cuatro pasos y, en el primero de ellos, por ejemplo, rellenan su nombre y e-mail (lo que guardo en variables de sesión), cómo puedo validar si el e-mail es correcto, si todavía le falta al pobre usuario tres pasos por completar y yo, también pobre, no he guardado los datos con el método “save”. Bueno, esto último de Model::validtes() no lo he usado todavía y no lo entiendo. ¿Podría ayudarme en este caso?”

    Si llegas aquí por casualidad y sabes cómo se validan los datos en un caso así, puedes dejar tu comentario. Un servidor (yo, no Apache) te lo agradecerá.

  2. Hola,

    teniendo en cuenta que save valida los datos que se le pasan antes de guardarlos lo más fácil es que vayas reuniendo los datos (por ejemplo en la sesión) y luego en el momento de guardar reconstruyas el array completo para pasárselo a save.

    De todos modos tú trabajas con la versión 1.1 y no estoy seguro de cómo funciona ahí. En la 1.2 save admite un array de datos con una estructura determinada (no tiene que ser $this->data). Por ejemplo:

    $losDatos = array(‘Modelo’ => array(‘campo1’ => ‘Pepe’, ‘campo2’ => ‘Pérez’);
    $this->create(); // Inicia el modelo
    $this->save($losDatos); // devuelve true si se guarda o false si hay errores

    Otra alternativa sería que los pasos del formulario sean en Javascript, de modo que muestres y ocultes partes del formulario según los pasos. Pero que construyas la vista con todos los campos y para Cake sea uno sólo.

    En resumidas cuentas, lo que le importa a Cake es que cuando llames a Save le pases un array bien formado que pueda entender.

  3. Creo que nunca Entendere como funciona un framework y si me es util para lo que hago……….. aaaaaaaa
    o_O

  4. Me gusta cakephp (estoy trabajando con la versión 1.2.5) pero estoy un tantillo complicada con las validaciones de varias reglas por campo. Esperando que pronto hagan mas tutoriales.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: