Validación en CakePHP 1.2
Jueves, 27 Marzo 2008
A pesar de estar todavía en la versión beta, hemos optado por hacer el desarrollo web con la versión 1.2 de CakePHP, entre otras cosas por el potente sistema de validación que posee. Explicaremos cómo realizar la validación de un formulario y los distintos tipos de validación que existen, aunque si no te gustan los que vienen ya implementados, CakePHP da soporte para poder crear tus propias reglas de validación.
Al tema… Lo primero que hay que hacer es crear las reglas de validación en el modelo, lo haremos en la variable $validate, introduciendo ya aquí los mensajes de error para no tener que preocuparnos en cada formulario de especificarlos.
En el siguiente ejemplo vemos varias reglas sencillas para un modelo que sólo tiene dos campos que queramos validar: nombre y password.
var $validate = array(
'nombre' => array(
'valid' => array('rule' => array('alphaNumeric'),
'message' => 'Nombre debe ser alfanumérico'),
'required' => array('rule' => array('minLength', '1'),
'message' => 'Nombre obligatorio')),
'password' => array(
'required' => array('rule' => array('minLength', '1'),
'message' => 'Password obligatorio'),
'length' => array('rule' => array('minLength', 6),
'message' => 'Longitud mínima del password de 6 caracteres')));
Vemos ya en este ejemplo algunas de las distintas reglas que existen en CakePHP 1.2, pero tenemos muchas más. Son las siguientes:
- alphaNumeric: campos alfanuméricos.
- between: aunque pueda parecer que valida que un número esté en un rango, lo que en realidad hace es comprobar que la longitud de una cadena esté en un rango:
'rule' => array('between', minVal, maxVal) - blank: valida que el campo esté en blanco o contenga sólo espacios o tabulaciones.
- cc: valida que una tarjeta de crédito sea correcta:
'rule' => array('cc', array('tipo')), donde tipo puede ser: visa, maestro... - comparison: para comparar valores numéricos:
'rule' => array('comparison', 'tipo', val), donde tipo puede ser: "is greater”,“is less”, “greater or equal”, “less or equal”, “is less”, “equal to”, y “not equal”;y sus equivalentes >, <, >= ... - custom: sirve para definir tus propias expresiones regulares:
'rule' => array('custom', 'expresion_regular') - date: valida una fecha, recibe como parámetro el formato:
'rule' => array('date', 'ymd') - decimal: valida un número decimal recibiendo el número de decimales que tiene que tener:
'rule' => array('decimal', num_decimales) - email: sirve para verificar que una dirección de email tiene el formato adecuado.
- equalTo: para comprobar que un campo sea exactamente igual a otro que se le pasa como parámetro:
'rule' => array('equalTo', val) - extension: sirve para validar que el campo tiene la extensión o extensiones que se le indican como parámetro:
'rule' => array('extension',array('gif', 'jpeg', 'png', 'jpg')) - file: permite comprobar que es un fichero. Todavía no está implementada.
- ip: valida que el campo es una IPv4.
- minLength y maxLength: sirve para validar que el campo tiene la longitud mínima y máxima, respectivamente, que se le pasa como parámetro:
'rule' => array('minLength',val) o 'rule' => array('maxLength',val) - money: valida que sea una cantidad monetaria. Se le pasa como parámetro ‘left’ o ‘right’, en función de dónde le digamos que está el símbolo monetario.
- multiple: para validar selects múltiples. Aún no está implementado.
- numeric: se comporta igual que la función de PHP is_numeric().
- phone: para validar un número de teléfono, se le pasa una expresión regular o null y el código del país. De momento sólo está implementado para Estados Unidos, para el resto se debe poner la expresión regular.
'rule' => array('phone', null, 'us') - postal: igual que el anterior en sintaxis pero para validar códigos postales. En este caso, está implementado para Estado Unidos(us), Reino Unido(uk), Canada(ca), Italia(it) y Alemania (de).
- ssn: lo mismo que los dos anteriores pero para números de la seguridad social. Implementado para Estados Unidos(us), Dinamarca(dk) y Holanda(nl).
- url: para validar urls.
Y ya sólo queda hacer el formulario que incluya validación. Podemos hacer uso para ello de una nueva función que viene implementada en el Form Helper, inputs:
echo $form->inputs(array('legend'=>'Datos personales',
'nombre' => array('label'=>'Nombre *', 'size'=>32),
'password' => array('label'=>'Password *', 'type'=>'password')));
De esta forma ya se encarga CakePHP de mostrar los errores automáticamente, al hacer el save (si no le especificamos que no nos lo haga) o bien al llamar explícitamente a la función validates del modelo. Si optas por esta segunda opción, la forma de hacer la llamada cambió con la nueva versión de Cake, y ahora se realiza de la manera siguiente:
$this->Modelo->set($this->data); $this->Modelo->validates();
Yo he optado, en el caso de no poder usar la función inputs, por no usar ninguna de las funciones del Form Helper select, dateTime, radio… y utilizar para todo la función input, a la que se le pueden pasar atributos tipo type, label, before, options, error… (para más información ver la línea 491 del Form Helper). De esta forma me muestra automáticamente los errores.
Por supuesto existe muchas más información en la propia API de CakePHP 1.2, aunque una información menos densa la encontramos en la Bakery, interesante sobre todo por los comentarios finales de la gente, que aportan muchas ideas.

No. 1 — Agosto 6th, 2008 at 10:22 pm
Excelente aporte, justo estaba teniendo unos problemas con las validaciones en mis aplicaciones (pues me rompo la cabeza con las expresiones regulares) y aqui veo q en la version 1.2 puede realizarse mas facil y eficientemente
No. 2 — Octubre 31st, 2008 at 12:53 pm
Amigos de Hospedaxes:
Estoy trabajando en un caso concreto en que un usuario se da de alta en varios pasos y, por tanto, no tenemos un solo formulario, sino varios.
No sé cómo validar los datos en este caso y en http://tutorialcakephp.wordpress.com/2008/10/26/12-validacion-de-datos/ planteo esta duda. ¡Muchas gracias y un saludo!
No. 3 — Octubre 31st, 2008 at 1:17 pm
Jordi, en este caso tendrás que hacer una validación manual llamando a la función “validates” del modelo, como se explica en el post.
Esta función validará sólo los campos que se almacenen con “set”, no todos los datos que se especifiquen en el modelo.
Además, utilizando esta función y renderizando en caso de error, se mostrarán correctamente los errores en el formulario.
No. 4 — Noviembre 12th, 2008 at 2:22 pm
[...] con el post Validación en CakePHP 1.2, explicaremos en esta ocasión cómo validar formatos de campos, permitiendo que estén vacíos, y [...]