CakePHP: Plugin Locale

Vamos falar um pouco sobre outro plugin para CakePHP que surgiu no coração da Radig: o Locale.

Meu amigo José Agripino já apresentou o plugin no próprio blog da Radig, mas como reescrevi quase que totalmente o plugin nos últimos dias, acredito ser a hora de falar dele novamente.

Nada melhor para ver a utilidade de algo como imaginar uma situação de uso real, então vamos lá…

Cenário 1: você desenvolve um sistema para brasileiros, e quer permitir a entrada de informações em formato local, isto é, datas com dia/mês/ano e números com vírgula separando decimais. O problema é que estes dados são inválidos em um banco de dados convencional (como MySQL e PostgreSQL). Ao tentar salvar uma data formatada com dia/mês/ano você receberá um erro como resposta. Como resolver isso? Use o behavior Locale no seu modelo.

Basta adicionar o behavior Locale no modelo que ele fará a conversão de datas e números para o formato americano.

public $actsAs = array('Locale.Locale');

É possível converter automaticamente datas, datas acompanhadas de horas e decimais/floats.

Cenário 2: você já tem os dados do seu usuário armazenados no banco (formato padrão/americano) e quer apresenta-los em um formato local na sua View, o que fazer? Use o Helper Locale em sua view. Primeiro ative o helper no seu controller:

public $helpers = array('Locale.Locale');

Agora basta usa-lo na view:

echo $this->Locale->date($this->data['User']['birthday']);

É possível formatar data, data com hora, data literal (quarta-feira 18 de abril de 2012, por exemplo), decimais como 53,42 e valores monetários ( R$ 53,42 ).

Além do Behavior e do Helper, você pode carregar as libs Localize e Unlocalize em qualquer parte de seu sistema para converter entre os dois diferentes formatos. As libs são estáticas e suportam aninhamento de método, assim você pode fazer:

echo Localize::setLocale('pt_BR')->decimal(12.45); // 12,45

A unica configuração necessária é a definição do locale de sua aplicação, que pode ser feito no próprio bootstrap.php do Cake:

setlocale(LC_ALL, 'pt_BR');

Assim como outros plugins da Radig, você pode consultar os testes incluídos para ver melhor o funcionamento deste.

Se for utilizar, nos avise, será uma grande satisfação ver que o plugin é util para outros.

Há uma versão compatível com o CakePHP 1.3 e outra com o CakePHP 2.x, basta usar o branch correspondente.

24 comentários sobre “CakePHP: Plugin Locale

  1. Tentei usar o Locale (banch 2.0) no cake 2.1.3 e só aparece
    “Missing Plugin
    Erro: The application is trying to load a file from the Locale plugin”
    Alguma dica?
    obrigado

      • Não, apenas coloquei os arquivos nas pastas igual a estrutura de pastas baixadas do Github.
        Coloquei o setlocale no bootstrap
        ao colocar no model:
        public $actsAs = array(‘Locale.Locale’);
        já aparece o erro

        • Se você não salvou ele como um Plugin, então ao chamar ele (tanto o Behavior quanto o Helper) você não deve colocar o primeiro Locale nome.
          Fica somente: $actsAs = array(‘Locale’);

          Quando usamos a notação com ponto, o CakePHP entende como sendo uma pasta dentro da pasta Plugin (por isso Locale.Locale, significa Behavior Locale, dentro da pasta Locale em Plugin).

  2. Olá Cauan, cara estou implementando um sistema e estou tentando colocar um código teu em prática, mais estou perdido, é o Módulo de integração do cakephp com o pagseguro, que encontrei no Github, lá os códigos do módulo estão escritos como Libs, mas não importa como eu faça o CakePHP fica me pedindo ele como um Plugin, coloquei todos os arquivos nos mesmos diretórios como aparecem, porém ele me pede “CakePlugin::load(‘PagSeguro’);”, por favor cara, me da uma luz

  3. Bom dia!
    Gostaria de saber como faço para formatar os dados nos inputs. Dá pra fazer com o plugin Locale?
    Estou usando $this->Form->input

    • Acredito que uma hora dessas você já encontrou a resposta, mas bastaria você fazer isso:

      $this->Form->input(‘nome_campo’, array(‘value’ => $this->Locale->date($this->request->data[‘Modelo’][‘nome_campo’])));

      E sua data sairia formatada ;]

  4. Olá Cauan,

    Ótimo trabalho, parabéns!
    Por favor, tira uma dúvida… O Plugin formata a data no padrão “dd/mm/aaaa” quando for recuperado no input do formulário? Como devo tratar?

    Obrigado.

    • Você diz tratar antes de registrar no banco de dados?

      Basta habilitar o behavior Locale no seu modelo:

      public $actsAs = array(‘Locale.Locale’);

      Ele vai formatar campos de datas e numéricos antes de qualquer operação no banco de dados (busca ou registro).

  5. Cauan, estou tentando utilizar o plugin e está formatando os dados normalmente só que quando utilizo dessa forma
    echo $this->Form->input(‘valor_base’, array(‘label’ => ‘Valor’, ‘value’ => $this->Locale->currency($this->request->data[‘ModeloContrato’][‘valor_base’])));
    o input fica em branco só que se eu altero ‘valor_base’ para qualquer outra coisa aí aparece os dados formatados
    Ex.: echo $this->Form->input(‘valor_base_alterado’, array(‘label’ => ‘Valor’, ‘value’ => $this->Locale->currency($this->request->data[‘ModeloContrato’][‘valor_base’])));

    Onde estou errando? Você poderia me ajudar?

    OBS: a versão do cake que estou utilizando é a versão 2.4.6

    • Olá Valter,

      Nunca tive esse tipo de problema, mas tenho uma suspeita: verifique o qual o tipo de input que está sendo gerado no seu primeiro exemplo, desconfio que não seja “text”.
      Tente forçar o tipo:

      echo $this->Form->input(‘valor_base’, array(‘type‘ => ‘text‘, ‘label’ => ‘Valor’, ‘value’ => $this->Locale->currency($this->request->data['ModeloContrato']['valor_base'])));

      • Era isso mesmo, o meu input está como number, que é como o cake traz do banco de dados, ainda não fiz a validação no Model.

        Agora ao salvar o valor no banco está salvando como 0, no model já incluí
        public $actsAs = array(‘Locale.Locale’);
        mas ainda está salvando como 0, se coloco algum valor salva normalmente, se salvo com o valor formatado salva 0.

        Outra coisa que percebi é que se coloco o valor 5,10 ele salva 5.

        O que será que está acontecendo?

        Desde já agradeço pela ajuda!

        Não sei se ajuda mas no meu bootstrap.php está assim:
        CakePlugin::load(‘Locale’);
        setlocale(LC_ALL, ‘pt_BR.utf-8’);
        o diretório do Locale está em app/Plugin/Locale
        OBS: Se eu não coloco o load dá erro e nos tutoriais que li não tem nada falando em colocar o Locale no load. Está certo assim?

  6. Tentei utilizar o plugin, mas mesmo colocando o ‘portuguese’ no setlocale, ainda ocorre a mensagem de erro: Notice (8): Undefined index: [APP\Plugin\Locale\Lib\Localize.php, line 41]

    Mesmo recarregando a página, sempre fica este erro.
    Se retiro o ‘pt-br’ do parâmetro do setlocale, consigo visualizar a data formatada, mas a formatação de currency, segue o padrão americano.

    Sendo assim, quando tento salvar na base mysql, não considera as decimais.

    Tem alguma ideia do que pode estar ocorrendo?

    Grato.

  7. Olá!

    Alguém pode me ajudar.
    Estou usando a versão 2.3.1 e o currency não está funcionando.
    As datas estão ok, mas o valor não formata de jeito nenhum. Um valor de 3.00 fica 300.
    Na entrada no banco se digito 3,00 ele funciona legal, mas um valor maior que mil, exemplo 4500.00, se digito 4.500,00 ele salva como 4.50
    Preciso de uma luz.
    Na view ele não mostra R$ 3,00, fica como 300

    • Olá Roseval,

      Você configurou seu locale corretamente? Usando LC_ALL e não LC_TIME, por exemplo?

      Tente rodar os testes unitários do plugin em sua máquina ( http://endereco/test.php -> Procura por Locale na lateral esquerda ), se funcionar, seu SO está correto e talvez seja problema de configuração. Se algum teste não passar, pode ser um problema de configuração do próprio SO.

      Caso encontre um erro, reporte no Github por favor.

  8. Etou utilizando seu plugin, meu campo no banco de ados mysql está como timestamp, gostaria que exibisse a hora juntamente com a data, pois $this->Locale->date apenas mostra a data formatada sem a hora. Obrigado

Deixe uma resposta

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