Estender classe CFormatter

Olá Amigos

Estou tentando estender a classe CFormatter para criar um novo tipo de formatação e aproveitar que ela já tem uma certa integração com outros componentes como o CGridView no sentido de que preciso formatar outros valores além de data, hora, numero, etc e gostaria da ajuda de vocês, pois não estou conseguindo fazer a minha aplicação entender que quero usar esta nova classe.

Criei uma classe assim





<?php


  class Formatter extends CFormatter {


    /**

 	* Formata o valor informado no formato de CEP.

 	* @param mixed $value Valor a ser formatado.

 	* @return string CEP formatado

 	* @see cepFormat

 	*/

    public function formatCep($value) {

      if (preg_match('^[0-9]{5}+-[0-9]{3}^', $value)) {

        return $value;

      } else {

        return substr($value, 0, 5) . '-' . substr($value, 5, 3);

      }

    }


  }


?>



com o objetivo de utilizá-la da seguinte forma:





      $this->widget('GridView', array(

        'id' => 'tabela-preco-grid',

        'dataProvider' => $model->search(),

        'filter' => $model,

        'columns' => array(

          array(

            'name' => 'id',

            'type' => 'raw',

            'filter' => FALSE,

          ),          

          array(

            'name' => 'cep_inicial',

            'type' => 'cep',

            'filter' => FALSE,

          ),


        ),

      ));



Note que no campo cep_inicial (string sem formatação) o a propriedade type está setada como cep.

Percebi que ele faz isso através da classe CFormatter.

Acontece que não estou conseguindo fazer minha aplicação entender a extensão da minha classe.

Alguém poderia me ajudar com isso?

Obrigado.

Você tem duas opções.

A primeira é utilizar a propriedade formatter do GridView:




      $this->widget('GridView', array(

        'id' => 'tabela-preco-grid',

        'dataProvider' => $model->search(),

        'filter' => $model,

        'formatter' => new Formatter,

        'columns' => array(

          array(

            'name' => 'id',

            'type' => 'raw',

            'filter' => FALSE,

          ),          

          array(

            'name' => 'cep_inicial',

            'type' => 'cep',

            'filter' => FALSE,

          ),


        ),

      ));



Note que neste caso, estou assumindo que a sua classe Formatter está em um diretório onde o autoload irá procurar por classes (por exemplo, em protected/components).

A segunda opção é configurar a propriedade format, da CWebApplication. Para isso, no seu config/main.php faça:


return array(

    'components'=>array(

        ...

        'format' => new Formatter,

        ...

);



Perfeito

Obrigado!

E como fazer o contrário? Mostrar formatado mas gravar sem formato?

Só usando beforeSave() ou existe outra forma melhor?

existe o Behavior (http://www.yiiframew…eRecordBehavior)

Vc pode extender esta classe, usar os eventos, fazendo códigos mais genéricos e anexar a diferentes ActiveRecords.

Um excelente exemplo de como fazer é a extensão do Ricardo (http://www.yiiframew…tetime-behavior)

Obrigado pela resposta, Daniel.

Mas no final das contas tudo termina com o beforeSave() e afterFind().

Tá entendido.