Yii Framework Forum: Formatação de valores - Yii Framework Forum

Jump to content

Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

Formatação de valores Rate Topic: -----

#1 User is offline   Daniel Augusto Bastos 

  • Advanced Member
  • PipPipPip
  • Yii
  • Group: Members
  • Posts: 347
  • Joined: 25-May 09
  • Location:Rio de Janeiro - Brasil

Posted 30 September 2009 - 12:16 PM

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?
Every solution creates a problem.
twitter.com/nenhumnick
0

#2 User is offline   Ismael 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 163
  • Joined: 02-June 09
  • Location:Brazil

Posted 30 September 2009 - 05:46 PM

public function afterFind()
{
    $this->codigo = sprintf('%06d', $this->codigo)
}


ve se vai
0

#3 User is offline   Junior - df9 

  • Advanced Member
  • PipPipPip
  • Yii
  • Group: Members
  • Posts: 416
  • Joined: 24-May 09
  • Location:Brazil

Posted 30 September 2009 - 08:58 PM

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

:>)

cheers!!!
______________________________________
Junior
df9.com.br
Linux Registered User #364954
GNU/Linux: together we're ready!
0

#4 User is offline   josafafilho 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 43
  • Joined: 08-July 09
  • Location:Brazil

Posted 01 October 2009 - 12:40 PM

Como o Ismael falou eu utilizo o afterFind do model
0

#5 User is offline   Daniel Augusto Bastos 

  • Advanced Member
  • PipPipPip
  • Yii
  • Group: Members
  • Posts: 347
  • Joined: 25-May 09
  • Location:Rio de Janeiro - Brasil

Posted 01 October 2009 - 01:15 PM

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 :(


Every solution creates a problem.
twitter.com/nenhumnick
0

#6 User is offline   ricardograna 

  • Advanced Member
  • PipPipPip
  • Yii
  • Group: Members
  • Posts: 376
  • Joined: 31-March 09
  • Location:Manaus/AM - Brazil

Posted 01 October 2009 - 04:57 PM

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;

Yes, It Is!
0

#7 User is offline   Ismael 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 163
  • Joined: 02-June 09
  • Location:Brazil

Posted 01 October 2009 - 07:25 PM

View PostDaniel A. Bastos, on 01 October 2009 - 01:15 PM, said:

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 :(



É só fazer um $this->isNewRecord pra não formatar.
E tu também pode fazer um beforeSave() pra transformar o 000011 em 11.
$this->codigo = (int) $this->codigo;
0

#8 User is offline   Daniel Augusto Bastos 

  • Advanced Member
  • PipPipPip
  • Yii
  • Group: Members
  • Posts: 347
  • Joined: 25-May 09
  • Location:Rio de Janeiro - Brasil

Posted 01 October 2009 - 08:51 PM

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 :(


Every solution creates a problem.
twitter.com/nenhumnick
0

#9 User is offline   josafafilho 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 43
  • Joined: 08-July 09
  • Location:Brazil

Posted 02 October 2009 - 12:24 PM

Daniel A. Bastos

No caso de registros novos você pode utilizar o afterConstruct
0

Share this topic:


Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

1 User(s) are reading this topic
0 members, 1 guests, 0 anonymous users