Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 09-09-2010 00:10:43

bandit_rouge
Membre
Date d'inscription: 18-02-2010
Messages: 31

[RESO][Zend_Validate_PostCode][1.10]codepost. lié au choix du pays

Bonjour,

Dans mon formulaire d'inscription:

J'ai un selectbox pour le choix du pays:

Code:

       $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:

Code:

$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

Code:

'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

 

#2 09-09-2010 14:51:05

My_Sic
Membre
Date d'inscription: 06-09-2010
Messages: 49
Site web

Re: [RESO][Zend_Validate_PostCode][1.10]codepost. lié au choix du pays

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é

Code:

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...


http://www.centurion-project.org: Full stack Framework based on Zend Framework; led by:
http://www.octaveoctave.com: an enthusiastic web agency full of passionate.
http://www.cache-pistache.com: French blog on ZF and SF perfomance

Hors ligne

 

#3 09-09-2010 19:24:20

Intiilapa
Membre
Date d'inscription: 03-02-2009
Messages: 95

Re: [RESO][Zend_Validate_PostCode][1.10]codepost. lié au choix du pays

Je pensais à une autre solution. Étendre la méthode Zend_Form::isValid() de la façon suivante :

Code:

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

 

#4 10-09-2010 19:02:28

bandit_rouge
Membre
Date d'inscription: 18-02-2010
Messages: 31

Re: [RESO][Zend_Validate_PostCode][1.10]codepost. lié au choix du pays

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:

Code:

 $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

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages