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))

lunes, 1 de febrero de 2010

Lögica de negocio y lógica de aplicación

Cuando se habla del patrón Modelo-Vista-Controlador a veces no queda claro cuál es el papel del Controlador.

Veamos:

El Modelo lleva la lógica de negocio, que básicamente es la representación de las entidades que la aplicación ha de manejar y sus relaciones. Así en una aplicación de gestión de bibliotecas tendremos modelos para los libros, socios, préstamos, etc., así como métodos para prestar libros, devolverlos, y otros muchos.

La Vista lleva la lógica de presentación y cada vista sabe mostrar unos datos que recibe y nada más.

¿Y el controlador? Solemos decir que el controlador pide datos al modelo y se los pasa a la vista, pero eso creo que no deja suficientemente claro su papel.

El controlador se encarga de la lógica de la aplicación. Esta lógica es la que representa lo que ha de hacer el sistema para solicitar los datos adecuados al modelo y qué hacer con ellos. Eso incluiría también saber si hay un usuario autorizado en la sesión, si hay variables del entorno que se deban tener en cuenta (como límites de paginación, variables de sesión y otros), saber qué hacer si no se obtienen datos del modelo, etc.