Validación en CakePHP 1.2 (III): Internacionalización de mensajes en el modelo

Continuando con los posts anteriores relativos a la validación y relacionado con el post en el que se trata la localización e internacionalización de nuestras aplicaciones, explicaremos en éste cómo realizar la internacionalización de los mensajes de error. Tenemos dos opciones para implementar este funcionamiento:

  1. Utilizar la función error del FormHelper (realizando la llamada desde la vista) o la función invalidate del modelo (si realizamos la validación manual desde el controlador).
  2. Utilizar el propio modelo como fuente de estos mensajes de error.

En el primero de los casos utilizaríamos el siguiente código para la vista y el controlador respectivamente:

$form->error('campo', __('MENSAJE_ERROR', true));
$this->Modelo->invalidate('campo', __('MENSAJE_ERROR', true));

y de esta forma buscaría esa clave del mensaje en el fichero de idioma.

La ventaja de hacerlo desde el modelo y no desde las vistas es que nos permite unificar los mensajes de error en cada campo y evitar la repetición de este código cuando estemos en formularios distintos que incluyan los mismos campos. El inconveniente es que en el modelo no se permite la utilización de la función __() de CakePHP.

Para solucionar este problema será necesario modificar la clase AppModel de la que extienden todos los modelos y que a su vez extiende de Model para redefinir la función invalidate (podemos ver la definición original en el api de CakePHP). Así, el fichero cake/libs/model/app_model.php quedaría como se muestra a continuación:

<?php
class AppModel extends Model {
   function invalidate($field, $value = true) {
      if (!is_array($this->validationErrors)) {
         $this->validationErrors = array();
      }
      $this->validationErrors[$field] = __($value, true);
   }
}
?>

Con este simple cambio, tenemos los mensajes de error del modelo internacionalizados.

3 Respuestas a “Validación en CakePHP 1.2 (III): Internacionalización de mensajes en el modelo”

  1. walter escribió:

    Todavía quedaría buscar una manera de obtener los mensajes de error a traducir. Por ejemplo desde la consola: cake i18n , obtiene los mensajes desde las llamadas a las funciones de traducción. En esta caso la llamada contiene una variable, por lo que no se podría saber cuales son los textos a traducir.

  2. nuria escribió:

    Tienes razón. Hasta ahora utilizamos para obtener los mensajes la función xgettext, y al igual que la llamada “cake i18n”, necesita que la clave esté en una función como argumento para ser capaz de extraerla.
    La única forma que encontramos hasta ahora de realizar este proceso automáticamente es “engañando” al comando xgettext de una forma poco elegante: sustituir en la carpeta de modelo todas las cadenas de la forma “‘message’ =>” por “__(” (para xgettext no es necesario cerrar la función). Una vez hecho esto se extraen todos los mensajes y se sustituyen las cadenas en el sentido contrario.
    Esta sustitución se realiza rápidamente si utilizas cualquier entorno de desarrollo, aunque somos conscientes de que no es la mejor manera de hacerlo, hasta la fecha es la más rápida que hemos encontrado.

  3. obelich escribió:

    Hola que tal felicidades por tu sitio me boy a estar dando unas bueltas recientemente acabo de iniciar en esto de usar cakephp y se mira muy prometedor sale estamos en caontacto

    Please continue discussion on the forum: link

Deja una respuesta

[ bbPress synchronization by bobrik ]