Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Matias Rezende

Mudar Formato de Data e Float

Recommended Posts

Pessoal, boa tarde.

 

Estou tendo dificuldades para mudar o formato da data e o formato do float utilizado para validação no ZF. Para criar o form, utilizo este código.

// Data de Nascimento
$this->addElement('text','data_nascimento',
			array(
				'label' => 'Data de Nascimento*',
				'maxlength' => 10,
				'required' => true,
				'filters' => array('StringTrim','StripTags'),
				'validators' => array('Date')));

// Última experiência - Salário
		$this->addElement('text','ult_exp_salario',
			array(
				'label' => 'Último salário*',
				'maxlength' => 10,
				'required' => true,
				'validators' => array('Float')));

Para validar o formulário completo, utilizo o seguinte código.

 

if($form->isValid($request->getPost()))

A data só valida de for no formato YYYY-MM-DD (sendo que o usuário vai digitar DD/MM/YYYY) e o float só valida se for no formato 1000.00 (sendo que o usuário vai digitar 1.000,00).

 

Alguém poderia me ajudar?

 

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

e ai amigo.

você pode tentar configurar o bootstrap colocando essas informações

setlocale (LC_ALL, 'pt_BR');
date_default_timezone_set('America/Sao_Paulo');
setlocale(LC_MONETARY,'ptb'); // formato monetario padrao brasileiro 1.000,00

espero ter ajudado.Abraço

Compartilhar este post


Link para o post
Compartilhar em outros sites

Também estou passando pelo mesmo problema

 

eu creio que a solução está em parametros no validator date:

 

$this->addElement('text','data_nascimento',
                        array(
                                'label' => 'Data de Nascimento*',
                                'maxlength' => 10,
                                'required' => true,
                                'filters' => array('StringTrim','StripTags'),
                                'validators' => array('Date',PARAMETRO_DE_LOCALIZACAO, PARAMETRO_DE_FORMATO_DE_DATA)));

Tenho quase certeza. Ja revirei a internet mas não encontrei a solução.

 

Algúem aí já solucionou isso?

 

[]s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como eu não uso o Zend_Form (prefiro a Smarty), você pode, para o campo de data, tratar o valor obtido, convertendo do padrão DD/MM/AAAA para YY-MM-DD.

 

Acredito que no fórum tenha uma função pronta pra isso, se não tiver, é fácil: Explode pelas barras, inverte com array_reverse() e implode pelos traços. Dá pra fazer numa linha só.

 

Já para o float, você pode fazer transformar de várias formas. Uma delas seria explodir pela vírgula e com um preg_replace() tirar tudo que não for dígito do primeiro índice gerado por explode(), depois une os dois pelo ponto e grava no BD.

 

Para exibir esse resultado, você formata como achar melhor. Após que o João diria para usar printf() ou sprintf() que eu já desisiti de usar. :P

Compartilhar este post


Link para o post
Compartilhar em outros sites

Companheiro Imaggens Studio, obrigado pela resposta.

 

Creio que assim, manualmente não é o ideal para se fazer neh?! O ZF ja deve ter um meio "automágico" de fazer isso.

 

É só alguém que manja mais disso passar o olho nesse tópico que vai responder rapidinho. hehe.

 

Enquanto isso eu sigo procurando. Qualquer coisa eu posto aqui.

 

Obrigado a todos.

 

Filipe.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olha, eu consegui solucionar da data. No bootstrap eu coloquei o seguinte.

$registry = Zend_Registry::getInstance();
$locale = new Zend_Locale('pt_BR');
$registry->set('Zend_Locale', $locale );

E funcionou. Mas do float ainda não resolvi. Se alguém conseguir solucionar o do float, agradeço se compartilhar.

 

Imaggens, a sua solução funciona, mas não vai funcionar o isValid do Zend Form. Por exemplo, utilizando este método que eu coloquei acima, para validar o formulário, utilizo este código.

 

$request = $this->getRequest();
$form = $this->_getTrabalheForm();
if($this->getRequest()->isPost())
{	
    if($form->isValid($request->getPost()))
    {
        // aqui dentro só vai entrar os dados se fizer a validação. Se não passar da validação, já vai exibir os erros e os valores dentro preenchidos anteriormente.
    }
}

Não sei como funciona o Smarty, mas o Zend Form é muito bom.

 

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

A Smarty é biblioteca de templates apenas. Com ela eu separo o HTML do PHP.

 

Com o Zend_Form fica organizado? Fica. Mas fica "junto", já que o PHP renderiza o HTML. Eu já não curto isso. :(

 

Sobre a validação de dinheiro, você poderia tentar uma versão modificada de money_format() (já que nativamente não funciona em ambientes Windows)

 

Pra aplicar essa função você pode fazer assim (exemplo de como eu faço):

 

$data = $this -> clean( $request -> getPost() )

$data['campo_html_do_dinheiro'] = money_format( $formato, $data['campo_html_do_dinheiro'] );

Detalhe, aqui, estou assumindo a money_format() nativa. Se usar a adaptada, troque para a chamada de função adequada.

 

E esse meu método clean() é um validador Zend_Filter, se precisar usar, segue:

 

public function clean( $data, $turn_on_entities = TRUE ) {
   if( empty( $data ) ) {
       throw new Zend_Exception( 'clean(): O array informado como argumento aparenta estar vazio' );
   }

   // Criando cadeia de Filtros

   $chain = new Zend_Filter();
   $chain -> addFilter( new Zend_Filter_StringTrim() )
          -> addFilter( new Zend_Filter_StripTags() )
          -> addFilter( new Zend_Filter_StripNewlines() );

   if( $turn_on_entities ) {
       $chain -> addFilter( new Zend_Filter_HtmlEntities() );
   }

   // Filtrando...

   foreach( $data as $k => $v ) {
       $data[ $k ] = $chain -> filter( $v );
   }

   return $data;
}

Você pode tirar se quiser. a getPost() retorna exatamente o mesmo que $_POST (chaves sendo os nomesdos campos HTML e os valores, os valores).

 

E sobre o uso de Zend_Locale, eu usava, mas estava querendo outra alternativa pois "engrandece" os sistema e 10 MB :blink:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fala Matias,

 

Ja tento usar Zend_Currency? funciona perfeitamente pra mim.

 

outra coisa, prq não usa dojo para validar o seu formulário, eu prefiro usar dojo. E faz uma mascará para seu campo ultimo salario, assim o usuario nao precisa se preocupar com virgulas e pontos, menos trabalho com validators...

 

se você setou locale no bootstrap, não precisa passar nenhum parametro para o Zend_Currency().

 

tipo assim

$ult_exp_salario = $form->getValue('ult_exp_salario');
$sal = new Zend_Currency('pt_BR');
$usal = $sal->toCurrency($ult_exp_salario);

Espero que te ajude

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ja tento usar Zend_Currency? funciona perfeitamente pra mim.

 

Nunca tinha ouvido falar. Vou olhar.

 

outra coisa, prq não usa dojo para validar o seu formulário, eu prefiro usar dojo.

 

Não sei como funciona o Dojo. Vou dar uma olhada.

 

E faz uma mascará para seu campo ultimo salario, assim o usuario nao precisa se preocupar com virgulas e pontos, menos trabalho com validators...

 

Então... concordo em fazer a máscara. Tem algum exemplo no ZF? Agora, que o validators vai ter menos trabalho... aí não concordo. Eu não posso depender do JS nunca para validar um formulário, porque o usuário pode navegar com o JS desabilitado. Aí a segurança do sistema foi pro espaço. Então, mesmo colocando a máscara (que eu quero colocar na data e no float), eu preciso validar o campo.

 

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fala Matias,

 

Não quis dizer para substituir validators por uma simples mascara...me expressei mal

Dojo é muito simples cara, tipo, o Zend suporta Dojo.

 

ao invés disso

<?php

class Form_MyForm extends Zend_Form
{

}

Você usa isso, da uma olhada na referencia do ZF sobre como abilitar dojo, ou amanha posto como

<?php
class Form_Login extends Zend_Dojo_Form
{
    public function init()
    {
        $this->setMethod('post');
        $this->setName('myform');

	    $this->addElement(
			'ValidationTextBox',
			'login',
		    array(
				'label' => 'Email:',
				'required' => true,
				'invalidMessage' => 'Enter your email here.',
				'trim' => true,
				'regExp' => '[a-z0-9._%+-]+@[a-z0-9-]+\.[a-z]{2,4}',
		));

	    $this->addElement(
			'PasswordTextBox',
			'password',
		    array(
				'label' => 'Password:',
				'required' => true,
				'trim' => true,
				'lowercase' => true,
				'maxLength' => '20',
				'regExp' => '^[a-z0-9.]{8,}$',
				'invalidMessage' => 'Invalid password; Must be at least 8 alphanumeric characters.',
		));

	    $this->addElement(
			'Button',
			'send',
		    array(
				'value' => 'Login',
				'type' => 'submit',
		));
    }
}

Flw

Compartilhar este post


Link para o post
Compartilhar em outros sites

Isso sim é bem interessante, assim, pelo menos eu entendo que, o ZF se encarrega de gerar o formulário E o JavaScript responsável pela validação.

 

Certo? Se for, como fica o HTML? Porque eu sou meio chato com isso, gosto tudo 100% correto em XHTML 1.1 <_<

 

Se for certinho vou dar um jeito de implementar isso na Smarty...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Imaggens

 

Só pra eu entender, pra você o correto é o JS ser o responsável pela validação, e não o ZF (PHP)? Este é o seu problema com o Zend Form?

 

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então... concordo em fazer a máscara. Tem algum exemplo no ZF? Agora, que o validators vai ter menos trabalho... aí não concordo. Eu não posso depender do JS nunca para validar um formulário, porque o usuário pode navegar com o JS desabilitado. Aí a segurança do sistema foi pro espaço. Então, mesmo colocando a máscara (que eu quero colocar na data e no float), eu preciso validar o campo.

 

Então, se você utilizar Zend_Currency, ele ira converter o valor do campo para moeda automaticamente. Então se o usuário estiver com js desabilitado(e sua mascará não funcionar), e ele entrar o valor de "3000", será automaticamente convertido para "R$3.000,00", "154000" para "R$154.000,00". Mas tem uma coisa, se ele entrar "300099" o numero retornado será "R$300,099.00", para obter-se "R$3,000.99" deverá haver um "." para identificar o float point.

 

Fala ai se conseguiu utilizar o Zend_Currency ou o Dojo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Isso sim é bem interessante, assim, pelo menos eu entendo que, o ZF se encarrega de gerar o formulário E o JavaScript responsável pela validação.

 

Certo? Se for, como fica o HTML? Porque eu sou meio chato com isso, gosto tudo 100% correto em XHTML 1.1 <_<

 

Se for certinho vou dar um jeito de implementar isso na Smarty...

 

Imaggens, só para lembrar que para Zend_Form_Dojo ser implementado o js do usuário deve estar ativo no browser.

Se javascript estiver habilitado, Dojo fará a validação do formulário.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Imaggens

 

Só pra eu entender, pra você o correto é o JS ser o responsável pela validação, e não o ZF (PHP)? Este é o seu problema com o Zend Form?

 

Carlos Eduardo

 

Nem sonhando. Tem de haver validação em conjunto. SEMPRE!

 

Eu só acho que para se gerar um HTML com Zend_Form requer uma codificação extra, ao meu ver desnecessária, pois eu teria de me acostumar a uma sintaxe extra para fazer algo que eu faço com HTML na mão.

 

Mas foi bom saber dessa variante _Dojo...

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.