Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Après la saisie d'un nombre 999999999,99 dans une Form,
je la réaffiche avec le nombre au format 999 999 999,99
Je rencontre un problème : comment filtrer les 'whitespaces' avant de renvoyer une seconde fois ma form ?
Comment corriger l'exemple ? je n'ai pas trouvé de filtre qui face çà.
$montant = new Zend_Form_Element_Text('montant', array( 'label' => 'Montant TTC', 'filters'=>array('alnum'), // supprime les whitespaces ... mais aussi la virgule !! 'filters'=>array('localizedtonormalized'), // supprime les whitespace, //mais change la ',' en '.' (fait planter le validator 'float') 'required'=>true, 'validators'=>array( 'NotEmpty', array('StringLength', false, array(1,10) ), 'Float' // la locale fr intervient 1,23 OK 1.23 PAS OK ) ));
Dernière modification par jean (20-10-2010 12:37:41)
Hors ligne
Et si tu passe la locale fr à ton filter localizedtonormalized, cela ne fonctionne-t-il pas ?
Hors ligne
Zend_Locale est déjà stockée en registre dans le bootstrap. C'est pour cela que mon validator 'float' valide 1,23 mais refuse 1.23.
Je pensais qu'un filtre "standard" permettait de supprimer les whitespaces, tout en conservant la notation française ','
Si je ne trouve pas, je vais faire un simple filtre regex.
Dernière modification par jean (20-10-2010 08:59:24)
Hors ligne
Tente ainsi :
$montant = new Zend_Form_Element_Text('montant', array( 'label' => 'Montant TTC', 'filters'=>array('alnum'), 'filters'=>array(array('localizedtonormalized', array('locale' => 'fr'))), 'required'=>true, 'validators'=>array( 'NotEmpty', array('StringLength', false, array(1,10) ), 'Float' ) ));
Hors ligne
@My_Sic : le filtre 'alnum' ne va laisser passer ni le point ni la virgule.
@+
Hors ligne
Nouvel essai avec PregReplace (équivalent d'un filtrer avec un regex).
Là, les valeurs POSTées sont bien filtrées ( 999 999 999,99 devient 999999999,99)
... MAIS IMPOSSIBLE d'afficher un montant lorsque je fais un $this->populate($valeurs)
... la variable $valeurs["montant"]='9 999 999,99' ne s'affiche pas dans la form.
... si j'enlève le filter, la variable $valeurs["montant"]='9 999 999,99' s'affiche dans la form.
Je croyais que les filtres ne s'activaient que lorsqu'on POSTait la form. Est-ce le cas ?
D'où peut venir mon problème ?
$montant = new Zend_Form_Element_Text('montant', array( 'label' => 'Montant TTC', 'filters'=>array(array( 'filter'=>'PregReplace', 'options'=>array( 'match'=>'/\s+/', 'replace'=>'' ))), 'required'=>true, 'validators'=>array( 'NotEmpty', array('StringLength', false, array(1,16) ), 'Float' // la locale fr intervient 1,23 OK 1.23 PAS OK ) ));
Dernière modification par jean (20-10-2010 12:54:08)
Hors ligne
Je pense avoir trouvé la solution à mon problème, mais je voudrais avoir votre avis.
Dans une form, lorsqu'on ajoute un filtre, il est exécuté :
- une première fois lors du render de la form (car je fais un populate des valeurs)
- une seconde fois lors du POST de la form
Donc, si je mets un filtre du type NormalizedToLocalized pour une valeur numérique,
- le populate contient la valeur 99999.99 (format 'en_US')
- le render de la form affiche 99 999,99 (format 'fr_FR')
- le POST de la form réapplique le filtre NormalizedToLocalized sur 99 999,99 et çà pose problème...
ETES VOUS D'ACCORD AVEC LE FONCTIONNEMENT DECRIT ?
Le contournement que j'ai trouvé :
- le populate contient la valeur 99 999,99 (j'effectue la transformation au format fr AVANT le populate)
- la form ne contient aucun filtre
- j'ai juste un Zend_Validate_Float('fr_FR') pour m'assurer que ',' est utilisé au lieu de '.' lors du POST
- APRES avoir récupéré les valeurs, j'effectue la transformation au format 99999.99
AVEZ-VOUS QQ CHOSE DE PLUS SIMPLE A PROPOSER ?
Jean
Dernière modification par jean (21-10-2010 08:36:15)
Hors ligne
Pourquoi ne pas ajouter ton filtre seulement s'il n'y a pas de POST ? Dans l'action évidemment.
Hors ligne
Pages: 1