CakePHP 3.0 – O Fim do Locale

 

A nova versão do meu framework favorito está em estágio avançado e trás uma infinidade de coisas legais.

Dentre as novidades, quero deixar uma dica rápida para um problema comum a qualquer um que não use data/decimais em formato dos EUA: até hoje, para o Cake 1.3 e 2.x eu utilizo o plugin Locale, que já falei a respeito aqui antes.

Com o CakePHP 3.0, o plugin é completamente desnecessário: o novo ORM é capaz de interpretar os dados enviados em formato local para o formato nativo da máquina, de forma transparente.

Você só precisa registrar que os tipos do ORM deve utilizar localização…

Diga ao seu ambiente qual seu locale (pode fazer isso no bootstrap.php):

ini_set('intl.default_locale', 'pt_BR');

Inclua as linhas abaixo no início do seu AppController:

use Cake\Database\Type;
// Habilita o parseamento de datas localizadas
Type::build('date')
 ->useLocaleParser()
 ->setLocaleFormat('dd/MM/yyyy');
Type::build('datetime')
 ->useLocaleParser()
 ->setLocaleFormat('dd/MM/yyyy HH:mm:ss');
Type::build('timestamp')
 ->useLocaleParser()
 ->setLocaleFormat('dd/MM/yyyy HH:mm:ss');
 
// Habilita o parseamento de decimal localizaddos
Type::build('decimal')
 ->useLocaleParser();
Type::build('float')
 ->useLocaleParser();

Pronto, os dados do seu formulário serão interpretados e convertidos antes de serem salvos.

Para alterar a validação de data, você deve usar algo assim:

$validator->add('birthday', 'valid', [
 'rule' => ['date', 'dmy'], // esse é o importante, onde você avisa que a data estará localizada
 'message' => __('Informe uma data válida')
 ]);

E em substituição ao LocaleHelper, você pode formatar suas datas com o método format disponível (já que o registro agora é um objeto), e no caso de float/decimal, você usa a lib Number.

use Cake\I18n\Number;
$data = $user->birthday->format('d/m/Y');
$salary = Number::format($user->salary);

E é isso, sem nenhum plugin, sua aplicação estará falando português (ou qualquer outra linguagem/localização que você deseje utilizar).

7 comentários sobre “CakePHP 3.0 – O Fim do Locale

  1. Cara!
    E para mostrar no input do edit a data dd/mm/yyyy e data + tempo dd/mm/yyyy hh:mm:ss quando utilizando type=”text”?
    Sei que no select é tranquilo, mas para formatar class e deixar arrumadinho e tudo mais, no input text é mais pratico, pelo ao menos para mim. No input só está mostrando dd/mm/yy hh:mm
    Configurei e está tudo funcionando perfeitamente, somente isso que está me deixando careca.
    Na view está ok.
    Se puder ajudar, agradeço!

  2. Olá, estou estudando cakePHP e estou enrolado numa questão: VALIDAÇÃO!
    Segui os procedimentos no book do CAKEPHP, mas quando gravo alguma coisa num form em branco, ele grava no banco um registro em branco, ou seja, a validação não está funcionando. Tentei seguir as convenções do cakePHP. Segue abaixo os arquivos e seus códigos.

    Model
    Nome do arquivo: Aluno.php
    array(
    ‘rule’ => ‘notEmpty’,
    ‘message’ => ‘Digite o nome do aluno’
    )
    );
    }
    ?>
    Controller
    Nome do arquivo: AlunosController.php (abaixo apenas o código para gravar/adicionar novo aluno)
    public function adicionar() {
    //TITULO DA PAGINA
    $this->set(‘title’, ‘Adicionar aluno’);
    $aluno = $this->Alunos->newEntity();
    if ($this->request->is(‘post’)) {
    $aluno = $this->Alunos->patchEntity($aluno, $this->request->data);
    if ($this->Alunos->save($aluno)) {
    $this->Flash->success(__(‘Dados gravados com sucesso.’));
    return $this->redirect([‘action’ => ‘index’]);
    } else {
    $this->Flash->error(__(‘Erro ao gravar dados.’));
    return $this->redirect([‘action’ => ‘adicionar’]);
    }
    }
    $this->set(‘aluno’, $aluno);
    }
    View
    Nome do arquivo: adicionar.ctp
    assign(‘title’, $title);
    }
    ?>
    Gravar Aluno

    Form->create(‘Post’),
    $this->Form->input(‘nome’, array(‘class’=>’form-control’)),
    $this->Form->input(‘endereco’, array(‘class’=>’form-control’)),
    $this->Form->input(‘bairro’, array(‘class’=>’form-control’)),
    $this->Form->input(‘cidade’, array(‘class’=>’form-control’)),
    $this->Form->input(‘uf’, array(‘class’=>’form-control’)),
    $this->Form->input(‘cep’, array(‘class’=>’form-control’))
    ?>

    Form->input(‘data_nasc’, array(‘class’=>’form-control’)),
    $this->Form->input(‘telefone’, array(‘class’=>’form-control’)),
    $this->Form->input(‘celular’, array(‘class’=>’form-control’)),
    $this->Form->input(‘email’, array(‘class’=>’form-control’)),
    $this->Form->input(‘senha’, array(‘class’=>’form-control’))
    ?>

    Form->button(‘Gravar aluno’,
    array(‘class’=>’btn btn-primary’));
    $this->Form->end();
    ?>

  3. Boa tarde, seguir sua dica e funcionou perfeitamente, porém na hora de exibir a data na tela de edição ele exibe a data no formato dd/mm/aa ao invés de dd/mm/aaa. Não é um erro mas é encomodo ver dada neste formato: 21/12/2019, o que você fez para contornar isso?

  4. Cauan, estou usando jQuery Mask para formatar o meu campo de data, então ele chega no formato “dd/mm/YYY” no meu controller, como devo proceder, visto que fiz o que vc falou acima e não funcionou?

    Abs!

    • Opa Tiago, já estou a algum tempo sem trabalhar com o CakePHP (infelizmente), mas de vez em quando vejo os changelog.

      Pelo que entendi, se sua data chega mesmo nesse formato, então é exatamente o caso que eu tinha – as configurações ali deveriam funcionar. Você tem algum erro?

      Acredito que nas versões mais recentes a configuração foi facilitada.

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *