Mostrando entradas con la etiqueta validación. Mostrar todas las entradas
Mostrando entradas con la etiqueta validación. Mostrar todas las entradas

domingo, 28 de febrero de 2010

Validación: comparar con otro campo

En la validación de datos de formularios, muchas veces nos gustaría comprobar que dos campos coinciden, como pueden ser los casos de contraseñas, emails, etc.

Para ello, en los formularios ponemos un segundo campo similar al que queremos comparar a fin de que el usuario introduzca dos veces el valor. Así, por ejemplo, tendríamos el campo User.password y el campo User.confirm_password, o bien User.emal y User.confirm_email.

Yo recomendaría que en el formulario usaras los campos de confirmación como si fuesen campos del modelo. A la hora de guardar (save), CakePHP los va a ignorar pues no están en el schema del modelo y nos resulta bastante fácil manipularlos.

No hay una regla de validación por defecto para esto, así que me he escrito mi propio método match para hacerlo.

La comparación de contraseñas

Una de las cuestiones problemáticas tiene que ver si usas campos de contraseñas y el AuthComponent, ya que éste intercepta los datos del formulario antes de que lleguen al sistema de validación por lo que el campo de contraseña original vendrá transformado por un hash, mientras que el campo de confirmación no (normalmente). En consecuencia, es imposible que coincidan ambos campos.

Es decir, los campos van a llegar más o menos así:

['User']['password'] = 'a3f9b5c4....'
['User']['confirm_password'] = 'miclave'

Por eso, he añadido al método soporte para obtener el hash deseado del campo de confirmación antes de comparar los campos. Si no indicas nada, los campos serán comparados en bruto.

Uso

Para comparar un campo con otro:

'campo' => array('rule' => array('match', 'otro_campo')

Para comparar un campo transformado por un hash, indicamos el tipo de hash.

'password' => array('rule' => array('match', 'confirm_password', 'sha1'))

Si se usa AuthComponent no hay que olvidar que se debe añadir el valor de Salt, lo que indicamos así


'password' => array('rule' => array('match', 'confirm_password', 'sha1', true))

Aquí un ejemplo con otro tipo de hash, en este caso md5

'password' => array('rule' => array('match', 'confirm_password', 'md5', true))

domingo, 16 de agosto de 2009

jueves, 4 de septiembre de 2008

Validation CheatSheet 1.1

Acabo de hacer una chuleta (cheatsheet) sobre el tema de la validación en CakePHP. Puedes descargarla si crees que te puede resultar útil. Está basada en la página del manual correspondiente


29/8/2008: corregido el typo señalado por Kejk (Thanks)
4/9/2008: corregido y aumentado el apartado de Custom Validation
10/2/2014: Cambio del enlace

miércoles, 4 de julio de 2007

Comprobar que algo es único

Tenía la impresión de haber escrito algo sobre esto, pero parece que no. Así que pego este pequeño método que comprueba si un modelo es único. En este caso, un usuario comprobando si su nombre es único.

La clase Model tiene un método isUnique () al que le podemos pasar varias condiciones, en formato de pares "campo" => "condición" (como los métodos Find) y un segundo parámetro para booleano para responder en cuanto una condición se cumpla. Si le pasas true, isUnique devuelve true con tal de que se cumple alguna de las condiciones. Si le pasas false, tienen que cumplirse todas las condiciones.

Un pequeño falloUna pequeña limitación de esta función es que no está pendiente automáticamente del id del modelo. Esto genera el problema de que cuando editas un modelo, la validación falla porque efectivamente existe un registro igual en la base de datos: justamente el que estás editando. Incluyendo el chequeo del id como condición en caso de que estemos editando un registro, funcionará correctamente. Para saber si un modelo está en "edición" no tenemos más que mirar si hay valor en model::id.

Cuando estamos añadiendo un modelo (todavía no está guardado en la base de datos) el problema no se presenta y valida correctamente.

Pienso que el código se explica bastante bien:

function usuarioEsUnico ($nombreUsuario) {
// Empezamos suponiendo que el nombre no va a validar
$esValido = false;
// La condición básica es que no coincidan los nombres de usuario
$condiciones['usuario'] = $nombreUsuario;
// Si estamos editando (hay valor en model::id, entonces comprobamos que no sea el mismo id
if ($this->id) {
$condiciones['id'] = '<> '.$this->id;
}
// Y ahora preguntamos al modelo si es único
$esValido = $this->isUnique ($condiciones, false);
return $esValido;
}