Dúvida: Como usar habilitar a internacionalização – o famoso I18N – nos erros de validação de seu modelo? Fácil? Como fazer então no próprio modelo para não repetir frases em várias Views?
Habilitar a internacionalização e ter a localização em uma aplicação com CakePHP desde a versão 1.2 é relativamente simples: basta uma lida no nosso Cookbook e pronto.
Outra coisa que é relativamente simples de se fazer é validar os dados, basta termos um atributo em nosso modelo chamado “validate” e seguir as dicas do livro de receitas.
Mas pelo Cookbook somos induzidos a fornecer a mensagem de erro na hora de criar a View, algo que eu particularmente não gosto. É até comum termos um modelo que é usado por Controllers diferentes e consequêntemente por Views diferentes.
Uma maneira de evitar isso, é definir as mensagens de erro já na definição das regras de validação, dentro do atributo “validate” do seu modelo. O grande problema é que para traduzir uma determinada expressão utilizamos um método, e a chamada de método na definição estática de um atributo não é permitida no PHP (dúvida? tente fazer o código abaixo)
class Modelo extends AppModel {
var $validate = _('ola mundo');
}
//esse código não devera ser executado
A solução para isso é a atribuição das regras de validação no momento da instanciação da classe, ou seja, no seu método construtor, da seguinte maneira
class Modelo extends AppModel {
var $validate;
function __construct(){
parent::__construct();
$this->validate = array( /* aqui você pode definir as regras e mensagens,mesmo chamando um método */ );
}
}
Qualquer dúvida não deixem de utilizar os comentários ;]
——–
Atualizado: havia esquecido da chamada ao construtor da superclasse AppModels ( através do parent::__construct() ) no último código mostrado.
——–
Atualizado
Obrigado ao José Tranca e Thiago Goulart pelos comentários, as soluções propostas por eles devem ser adotada em detrimento da minha, já que melhora consideravelmente a modularidade e reusabilidade das traduções.
3 respostas em “CakePHP – Dúvidas Comuns #2”
Para esse mesmo efeito costumo colocar o seguinte no meu AppModel:
function invalidate($field, $value = true) {
return parent::invalidate($field, __($value, true));
}
It works like a charm 🙂
Pessoal, só para constar segui a linha do comentário do José Trancas no post do Cauan Cabral e sobrescrevi o método invalidate($field, $value). Diferente do que o José Trancas recomendou, não utilizei o método __() para traduzir as mensagens, preferi o método __d() e criei um domínio chamado “validation”. Dessa maneira eu consigo manter um validation.pot na mão somente para validações e continuo gerando os demais termos para tradução através do comando cake i18n. Apesar de não ser a maneira ideal para traduzir as mensagens de validação acredito que no momento seja a que causa menos impacto no desenvolvimento, porque me permite seguir o padrão do framework mesmo que alguma coisas tenham que ser feitas no braço. Se alguém precisar de ajuda nesse problema estou a disposição para ajudar.
[…] errors.ctp da forma que achar melhor =] Dica retirada do TeknoidOutros posts que podem interessar:CakePHP – Dúvidas Comuns #2Dica Rápida – CakePHP 1.3, link com prefixoDica Rápida – Evitando problemas com uso de […]