HUFERSIL.WEBDEVELOPER - Soluções com qualidade - Hugo Ferreira da Silva

Lumine - Formatadores Seg, 20 de julho de 2009 - as 10h18 - 4 comentários

Hoje vamos falar um pouco sobre os formatadores.
Seu comportamento mudou nas versões mais recentes de Lumine, isto porque, nas versões anteriores os membros da classe não eram explicitamente declarados, assim quando você chamava um atributo que não existia, o método mágico __get era disparado, e internamente, os formatadores eram executados para então retornar o valor formatado.

Para fazer com que os formatadores funcionem de forma correta, você deve chamar o método Lumine_Base::addFormatter( $member, $formatter ).

Depois de adicionados os formatadores, eles serão executados quando chamados um dos metódos a seguir:

  • toArray
  • toObject
  • toXML
  • toJSON
  • allToArray
  • allToObject
  • allToXML
  • allToJSON
  • formattedValue( $member )

Se você chamar diretamente o membro ($obj->membro), os formatadores não serão executados.

Outro fator muito legal é que sempre que um formatador está prestes a ser executado e depois de sua execução, ele dispara eventos (preFormat e posFormat). Assim você consegue capturar os valores antes e depois da execução, exemplo:  

// criamos a funcao para formatar a data
function formatadaDataBrasil($data){
   return preg_replace('@^(\d{4})-(\d{2})-(\d{2})$@','$3/$2/$1',$data);
}

// pre-formatador
function pre_format($objRef, $oldValue){
   echo 'Valor a ser alterado: '.$oldValue.'<br>';
}

// pos-formatador
function pos_format($objRef, $oldValue, $newValue){
   echo 'Valor novo: '.$newValue.'<br>';
}

// cria o objeto de pessoa
$obj = new Pessoa;
// adiciona o formatador
$obj->addFormatter('dataNascimento', 'formatadaDataBrasil');
// adiciona os ouvintes
$obj->addEventListener('preFormat', 'pre_format');
$obj->addEventListener('posFormat', 'pos_format');
// pega a pessoa de codigo 1
$obj->get(1);

// exibe a data de nascimento
echo $obj->formattedValue('dataNascimento');
// ou pega do array
$arr = $obj->toArray();
echo $arr['dataNascimento'];

@braços e fiquem com Deus!

Comentários

Por Hugo Ferreira da Silva enviado em 08 de outubro de 2009, as 17:42 Obrigado Daniel!

Corrigi o problema e estarei colocando para download, juntamente com outras coisas que modifiquei.

@braços!
Por Daniel Schultz enviado em 08 de outubro de 2009, as 17:07 $this->_addField('dataNasc', 'datanasc', 'date', null, array('format' => '%d/%m/%Y'));

Quando colocamos este formatador direto na entidade, ele acrescenta um erro ao select, mesmo que este não faça qualquer referencia a este campo, acrescentando datanasc='1969-12-31'

Um amigo meu te mandou um email sobre este bug meio maluco.

Grato
Por Hugo Ferreira da Silva enviado em 04 de agosto de 2009, as 21:53 Renato,

sim, você pode colocar dentro do método _initialize.
Por Renato Degelo enviado em 31 de julho de 2009, as 10:10 Posso colocar esse addformatter dentro da entidade para que toda vez que eu instancie ja seja definido o formatador?

Obrigado.

Deixe seu comentário