Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Bonjour,
Dans mon formulaire d'inscription:
J'ai un selectbox pour le choix du pays:
$this->addElement('select', 'pays', array( 'filters' => array('StringTrim', 'StripTags'), 'MultiOptions' => array('fr_BE'=>'Belgique','fr_FR'=>'France'), 'value' => Zend_Registry::get('Zend_Translate')->getLocale(), 'label' => 'Pays:', ));
et un champ pour le code postal. J'utilise Zend_Validate_PostCode pour le valider:
$this->addElement('text', 'postal', array( 'filters' => array('StringTrim', 'StripTags'), 'validators' => array( array('StringLength', true, array(0, 50)), array('digits', true), array('PostCode', true, array( Zend_Registry::get('Zend_Translate')->getLocale() ), 'required' => false, 'label' => 'Code postal:' ));
Est-il possible de faire en sorte que le choix du pays modifie dynamiquement l'option de mon validateur PostCode?
un truc du genre
'onchange' => $this->getElement('postal')->setlocal($this->getvalue())
Je sais que c'est pas bon. ;-)
Comment feriez vous ça?
Merci :-)
Dernière modification par bandit_rouge (12-09-2010 18:04:11)
Hors ligne
Une des solutions est de créer ton propre validateur PostCode qui hérite de celui de Zend.
Et puis tu te sert du context qui est passé au validateur pour récupérer la locale du pays sélectionné
class Centurion_Validate_PostCode extends Zend_Validate_PostCode { public function isValid($value, $context = array()) { if (isset($context['pays'])) $this->setlocal($context[]); return parent::isValid($value, $context); } }
Si tu veux coder ça plus proprement (ici 'pays' est codé en dur ce qui n'est pas top) inspire toi de la classe Zend_Validate_Identical qui passe la clé (appelé token dans la class) lors du constructeur.
De manière général, la variable $context est très utile. Par exemple pour vérifier que le champ confirmation de mot de passe est identique au mot de passe initiale...
Hors ligne
Je pensais à une autre solution. Étendre la méthode Zend_Form::isValid() de la façon suivante :
class Form_Register extends Zend_Form { public function isValid($data) { if (isset($data['pays'])) { $this->postal->getValidator('PostCode')->setLocale($data['pays']); } return parent::isValid($data); } }
Une remarque au passage : tu n'as pas besoin de cette ligne « 'required' => false». La valeur par défaut est false, c'est à préciser lorsque tu souhaites qu'il soit obligatoire.
Deuxième remarque : selon le nombre de pays que tu as besoin pour ton application, tu peux trouver une liste de tous les pays dans un xml de la librairie Zend Framework.
Hors ligne
Intiilapa:
Merci pour ta solution. Elle fonctionne nickel chrome
My_Sic:
Merci également pour la tienne.
Pour la confirmation du mot de passe j'ai fait ca:
$this->addElement('password', 'password', array( 'filters' => array('StringTrim', 'StripTags'), 'validators' => array( array('StringLength', true, array(6, 12)) ), 'required' => true, 'label' => 'Mot de passe:' )); // Vérification password $this->addElement('password', 'password2', array( 'filters' => array('StringTrim', 'StripTags'), 'validators' => array( array('StringLength', true, array(6, 12)), array('identical', true, array( 'token' => 'password', 'messages' => array( 'notSame'=>"Le mot de passe n'est pas identique" )))), 'required' => true, 'label' => 'Vérification:' ));
Moins je code mieux je me porte! :-)
Hors ligne
Pages: 1