Formatação de valores

Bom, jurava que essa discussão já tinha rolado aqui, mas não achei.

Bom, to procurando uma forma "elegante" de formatar os valores que serão exibidos, em um lugar único (Preferencialmente definido no model, para poder utilizar a mesma formatação em vários lugares do sistema.

Por exemplo:

Tenho uma tabela de clientes, e este tem um campo chamado código. Na base, o código é inteiro, mas no sistema, deve aparecer o código com 6 caracteres completados com "0" a esquerda.

Se eu fizer na minha view ou no controller, terei que fazer em cada lugar que utilizar este field, por isso a idéia de fazer no controller, mas, eu não posso utilizar behaviors, pois, eu não poderia formatar um novo valor não gravado. A formatação seria pelo evento AfterFind. Então, usando behaviors o código abaixo não iria funcionar:




  $model->codigo = '1';

  echo $model->codigo; 

  /* aqui exibiria o valor "1", mas eu queria que exibisse "000001", no caso o valor já formatado.  */



Não funciona pq não existe um evento que possa tratar isso. Um possível "beforeGetField" da vida.

Atualmente só consegui fazer sobreescrevendo o método mágico __get da classe CActiveRecord, mas não achei que foi uma boa solução.

Alguem sabe se existe alguma coisa já padrão do Yii pra isso?




public function afterFind()

{

    $this->codigo = sprintf('%06d', $this->codigo)

}



ve se vai

echo Yii::app()->numberFormatter->format(‘000000’,$model->codigo);

:>)

cheers!!!

Como o Ismael falou eu utilizo o afterFind do model

Não dá pra usar o afterFind.

Eu estou desenvolvendo vários cadastros no meu sistema que muda muito pouco de um para o outro. Muitos usam o mesmo model.

A questao é que, na hora que eu pedir pra incluir, o meu controller preenche alguns valores do meu model antes mesmo de renderizar. Como estes são dados novos, não passa pelo AfterFind e, consequentemente, estes valores não são formatados na view, me obrigando a checar se os objetos estão em estado de inclusão quando preencho os valores padrões.

Ai fica meu dilema :(

A única solução que encontrei até agora foi criar um model que será ancestral de todos os módulos do meu sistema, sobreescrevendo os método mágico __GET e simulando a criação de um novo evento “onBeforeGetField”. Mas não ficou tão elegante quanto os Behavior, por isso não gostei :(

Defina em seu model uma funcao getCodigoText


function getCodigoText(){

   return sprintf('%06d', $this->codigo)


} 

Entao, em cada lugar do teu sistema que tu quiser ver teu campo formatado, altere para


$model->codigoText;

É só fazer um [color="#8B0000"]$this->isNewRecord[/color] pra não formatar.

E tu também pode fazer um beforeSave() pra transformar o 000011 em 11.

[color="#8B0000"]$this->codigo = (int) $this->codigo;[/color]

Me corrigindo …

Na mensagem alterior eu escrevi módulo ao inves de model … foi mal.

Ricardo. Pow . não sabia dessa… pode ser uma boa solução.

Ismael, eu não entendi :(

Daniel A. Bastos

No caso de registros novos você pode utilizar o afterConstruct