Validar campos de verificación en CakePHP

[spanish]
Al diseñar un formulario de registro de usuario para una página web es una buena idea pedir dos veces tanto la contraseña como la dirección de correo: un error en la contraeña significaría que el usuario no podría logarse, mientras que con un error en su correo no nos podríamos poner en contacto con él. Al pedir verificación de ambos campos y validar que coincidan, evitamos problemas por errores tipográficos.

Esta validación en CakePHP no se puede automatizar en la definición del modelo, habría que hacerla en código en el controlador ya que en el modelo no hay ninguna regla predefinida que permita comparar el valor de un campo del objeto con el de otro (equalTo compara con una cadena como literal, no con una variable).

Una solución es implementar la siguiente función en el propio modelo desde el que queremos llamarla (o descárgala aquí, el plugin que uso para el resaltado de sintaxis o el propio WPMU se encarga de cargarse todos los caracteres >):
[/spanish][english]
When designing a registration form for a web site, it’s usually a good idea to include verification fields for both the password and the e-mail address: a typo on the password would leave the user unable to log into the system, while one on the e-mail address would prevent us from reaching the user. Asking twice for these fields allows us and the user to verify that there are no typos and that both values are correct, thus avoiding future problems.

With CakePHP these verification fields can’t be validated automatically with the model’s definition rules, it has to be done programmatically on the controller as there is no model verification rule to check that an object’s field’s value equals that of another field (equalTo compares against a string as a literal, not against a variable).

By defining the following function on the model we are defining a custom verification rule that will allow us to do this verification properly on the model (or download it here, the plugin I use for code highlighting or wpmu itself keep trashing all > symbols):
[/english]
[code lang=»PHP»]

        /**
         * Verifies that the field beeing validated matches the value of the
         * field in the second parameter. If omitted and the field beeing
         * validated's name is NAME_verification, the value will be compared
         * to that of the NAME field.
         *
         * Examples:
         * 
         * var $validate(
         *      'password_check' => array(
         *              'rule' => array('verifies', 'password'),
         *              'message' => 'The passwords don't match'
         *      ),
         *      'email_verification' => array(
         *              'rule' => array('verifies'),
         *              'message' => 'The email addresses don't match'
         *      ),
         * )
         * 
         *
         * The second case will verify automagically against the "email" field.
         */
        function verifies($data, $field=null) {
                $keys = array_keys($data);
                $key = $keys[0];
                if(!is_string($field)) {
                        if( ($pos = strpos($key, "_verification")) === FALSE ) {
                                return FALSE;
                        }
                        $field = substr($key, 0, $pos);
                }
                return ($data[$key] == $this->data[$this->name][$field]);
        }

[/code]

Astronomía básica para torpes

Vía microsiervos un pequeño curso de introducción rápida a la astronomía, para identificar rápidamente un par de constelaciones y un par de estrellas, y saber orientarse buscando el norte con la Estrella Polar.

La astronomía es algo que siempre me ha llamado bastante la atención pero nunca le he prestado un mínimo de interés como para aprender algo más allá de identificar la Osa Mayor y poco más, y eso que mi amigo Gabi es un auténtico frikazo del tema y me he ido con él y el telescopio un par de veces.