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.

<?phpclass LivroForm extends TPage{    protected $form; // form        public function __construct( $param )    {        parent::__construct();                // parte da criação do form...        $this->form = new TQuickForm('form_Livro');        // parte da criação dos campos...        $id = new TEntry('id');        $dt_compra = new TDate('dt_compra');        $valor = new TEntry('valor');                // definição de mascara        $dt_compra->setMask('dd/mm/yyyy');                // definição de formato numerico        $valor->setNumericMask(2,',', '.', true);        // restante do construtor     }    // ...?>



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.

<?php    public function onSave( $param )    {        try {            TTransaction::open('samples'); // abre a transação                        $object = new Livro;  // cria um objeto vazio            $data = $this->form->getData(); // obtém os dados do form            $object->fromArray( (array) $data); // carrega o objeto com os dados            // AQUI CONVERSÃO PARA SALVAR OS DADOS            $object->dt_compra = DateTime::createFromFormat('d/m/Y', $object->dt_compra)->format( 'Y-m-d' );            $object->store(); // salva o objeto                        // obtém o id do objeto            $data->id = $object->id;                        $this->form->setData($data); // preenche o formulário            TTransaction::close(); // fecha a transação                        new TMessage('info', TAdiantiCoreTranslator::translate('Record saved'));        }        // ...    }?>



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.

<?php    public function onEdit( $param )    {        try {            if (isset($param['key'])) {                $key = $param['key'];  // obtém o parâmetro $key                TTransaction::open('samples'); // abre a transação                $object = new Livro($key); // instancia o Active Record                // AQUI CONVERSÃO PARA CARREGAR OS DADOS                $object->dt_compra = DateTime::createFromFormat('Y-m-d', $object->dt_compra)->format( 'd/m/Y' );                $this->form->setData($object); // preenche o form                TTransaction::close(); // fecha a transação            }            else {                $this->form->clear();            }        }        // ...    }?>



pastebin.com/jEGBUFkh

Curso Dominando o Adianti Framework

O material mais completo de treinamento do Framework.
Curso em vídeo aulas + Livro completo + Códigos fontes do projeto ERPHouse.
Conteúdo Atualizado!


Dominando o Adianti Framework 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.