Conversão de datas e valores monetários Ao longo de muito tempo ajudando a responder dúvidas aqui no fórum, percebemos algumas questões repetidas, como é o caso de conversões de formatos de data e também de valores monetários no momento de salvar e editar formulários. Por isso resolvi escrever este artigo, para explicar como tratar valores em Reais, e também datas no formato brasileiro sempre que formos editar e salvar registro...
PD
Conversão de datas e valores monetários  
Fechado
Ao longo de muito tempo ajudando a responder dúvidas aqui no fórum, percebemos algumas questões repetidas, como é o caso de conversões de formatos de data e também de valores monetários no momento de salvar e editar formulários. Por isso resolvi escrever este artigo, para explicar como tratar valores em Reais, e também datas no formato brasileiro sempre que formos editar e salvar registros em um formulário.

Inicialmente, vou explicar somente alguns trechos do programa, e no final colocarei um link para o programa completo. Neste cenário apresentado, temos um programa simples de cadastro de filmes com campos como: id, título, autor, data da compra, e valor. Claro que em um programa real precisaríamos de muitas outras informações, mas como o propósito aqui não é construir um programa real para cadastro de livros, e sim demonstrar conversões de valores, ele vai servir bem.

Começamos pelo método construtor, onde temos a definição do formulário e dos campos. O campo de data (dt_compra) é do tipo TDate. Para que ele seja apresentado com a máscara correta no formulário, é preciso executar o método setMask() indicando a máscara correta para o formato brasileiro. Já o campo de valor é do tipo TEntry, e nesse caso utilizamos o método setNumericMask() para definir a quantidade de separadores decimais, os caracteres separadores e um booleano ao final. Este booleano indica se a máscara deve ser removida no post (TRUE) ou não. É importante utilizarmos TRUE, para que o valor seja recebido no Post sem a formatação.

  1. <?php
  2. class LivroForm extends TPage
  3. {
  4.     protected $form// form
  5.     
  6.     public function __construct$param )
  7.     {
  8.         parent::__construct();
  9.         
  10.         // parte da criação do form...
  11.         $this->form = new TQuickForm('form_Livro');
  12.         // parte da criação dos campos...
  13.         $id = new TEntry('id');
  14.         $dt_compra = new TDate('dt_compra');
  15.         $valor = new TEntry('valor');
  16.         
  17.         // definição de mascara
  18.         $dt_compra->setMask('dd/mm/yyyy');
  19.         
  20.         // definição de formato numerico
  21.         $valor->setNumericMask(2,',''.'true);
  22.         // restante do construtor 
  23.     }
  24.     // ...
  25. ?>



Já na continuação da classe, no método onSave(), precisamos realizar a conversão dos valores antes de salvar os dados do formulário. O campo numérico (valor) não precisa ser convertido, pois a função setNumericMask() já indicou em seu último parâmetro (TRUE), que a formatação deve ser removida. Já o campo de data (dt_compra) precisa ser convertido do formato d/m/Y para Y-m-d, que é o mais usado em bases de dados. Para isso, usamos o método DateTime::format() que é nativo do PHP.

  1. <?php
  2.     public function onSave$param )
  3.     {
  4.         try {
  5.             TTransaction::open('samples'); // abre a transação
  6.             
  7.             $object = new Livro;  // cria um objeto vazio
  8.             $data $this->form->getData(); // obtém os dados do form
  9.             $object->fromArray( (array) $data); // carrega o objeto com os dados
  10.             // AQUI CONVERSÃO PARA SALVAR OS DADOS
  11.             $object->dt_compra DateTime::createFromFormat('d/m/Y'$object->dt_compra)->format'Y-m-d' );
  12.             $object->store(); // salva o objeto
  13.             
  14.             // obtém o id do objeto
  15.             $data->id $object->id;
  16.             
  17.             $this->form->setData($data); // preenche o formulário
  18.             TTransaction::close(); // fecha a transação
  19.             
  20.             new TMessage('info'TAdiantiCoreTranslator::translate('Record saved'));
  21.         }
  22.         // ...
  23.     }
  24. ?>



Assim como convertemos o valor no momento de salvar, também precisamos fazer no momento de carregar os dados para o formulário. Neste caso, o campo de data (dt_compra) que na base de dados está no formato Y-m-d, precisa ser convertido para o formato usado no formulário que é d/m/Y. Para tal, também vamos usar o método DateTime::format() que é nativo do PHP.

  1. <?php
  2.     public function onEdit$param )
  3.     {
  4.         try {
  5.             if (isset($param['key'])) {
  6.                 $key $param['key'];  // obtém o parâmetro $key
  7.                 TTransaction::open('samples'); // abre a transação
  8.                 $object = new Livro($key); // instancia o Active Record
  9.                 // AQUI CONVERSÃO PARA CARREGAR OS DADOS
  10.                 $object->dt_compra DateTime::createFromFormat('Y-m-d'$object->dt_compra)->format'd/m/Y' );
  11.                 $this->form->setData($object); // preenche o form
  12.                 TTransaction::close(); // fecha a transação
  13.             }
  14.             else {
  15.                 $this->form->clear();
  16.             }
  17.         }
  18.         // ...
  19.     }
  20. ?>



pastebin.com/jEGBUFkh

Curso completo Meu Negócio Pronto
Use para si, ou transforme em um negócio: Inclui aulas e códigos-fontes
Gestor de conteúdo (SITE) + Loja Virtual (E-Commerce) + Emissor de Notas para infoprodutos


Meu negócio pronto Quero me inscrever agora!

Comentários (2)


AR

Pablo,
Tenho um formulário mestre detalhes que ao inserir itens do detalhe perde a formatação dos campos do mestre.

Ao inserir o primeiro item, perde parcialmente e ao inserir o segundo item perde completamente a formatação dos campos do mestre.
AR

Pablo,
Tenho um formulário mestre detalhes que ao inserir itens do detalhe perde a formatação dos campos do mestre.

Ao inserir o primeiro item, perde parcialmente e ao inserir o segundo item perde completamente a formatação dos campos do mestre.