Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 09-06-2010 12:14:16

maryooman
Membre
Date d'inscription: 15-02-2010
Messages: 106

Désactiver validateur sous certaines conditions

Bonjour,

Sous une condition précise, un certain nombre de champs du formulaire doivent être désactivés, lors d’une mise à jour.

Je sais les désactiver, mais les validateurs m’empêchent de continuer, en me demander de remplir les champs qui sont désactivés …

Voici un exemple simplifié.

Table ITEM
Int         Id
String    Nom
Id          Model
Bool      Payer

Pour désactiver les champs je procède de la façon suivante :
Je teste si  ‘Payer’ est vrai, dans ce cas je redéfini le populate() :

Code:

    function populate(array $values)
    {
        $res = parent::populate($values);
        if ($this->payer->getValue()) {   //regarde si payer est vrai
           $this->model->setOptions(array('disable'=>'disable'));   //desactive model
        }
       return $res;
    }

A partir d’ici, le champ model est bien désactivé.
Et la réponse du validateur est la suivante : ‘Value is required and can't be empty’

Pour info voici le code du champ model :

Code:

public function init() {        

        $id = new Zend_Form_Element_Hidden('id);
         .....

        $model = new Zend_Form_Element_Select('model');
        $model->setLabel('Model *')
                ->setRequired(true)
                ->addValidator('NotEmpty')
                ->addMultiOption('', 'Choose');
        $table = new Model_DbTable_Model();
        foreach ($table ->findForSelect() as $row) {     //donne la liste des models disponibles et leur id
            $model->addMultiOption($row->model, $row->modelName);
        }
       
         .....
         $this->addElements(array($id, ....., $model));
}

EDIT : j'ai rajouter un peu de code pour plus de clareté

J’ai eu l’idée de mettre un attribut de class : $_payer, qui sera mis à false dans le constructeur.
Puis dans le populate() le passer à true.

Code:

self ::$_payer = true ;

Et finalement dans le code de la création du champ model :

Code:

        $model = new Zend_Form_Element_Select('model');
        …
      If (self::$_payer) model->setRequired(false);

Sauf que populate() ne modifie pas l’attribut de class $_payer !!
Note : model->setRequired(false); désactive bien le validateur.

J’eu aussi quelques autres idées, mais rien de significatif.


Je demande votre aide pour m’aider à sortir de ce problème.
Merci d’avance.

Dernière modification par maryooman (09-06-2010 14:27:50)

Hors ligne

 

#2 09-06-2010 13:55:54

nORKy
Membre
Date d'inscription: 06-03-2008
Messages: 1098

Re: Désactiver validateur sous certaines conditions

hmm.. ton champs desactivé ne veut pas dire qu'il ne doit pas être remplis.
Si il n'est pas remplis (desactivé ou non), alors il est normal que ton validateur te donne une erreur.

Soit tu desactives mais tu remplis la valeur (populate devrait le faire), soit carrement, tu ne places pas l'element dans le formulaire


----
Gruiiik !

Hors ligne

 

#3 09-06-2010 14:23:25

maryooman
Membre
Date d'inscription: 15-02-2010
Messages: 106

Re: Désactiver validateur sous certaines conditions

Voici ce qui se passe quand je rajoute la ligne 'disable' dans le populate()

http://img413.imageshack.us/img413/2733/81382850.jpg

Remarquez qu'il est bien rempli

puis quand je clic sur update (en bas de formulaire)

http://img97.imageshack.us/img97/3916/86974046.jpg

La valeur disparais et le validateur rentre en action!


J'ai une préférence pour griser les champs, mais si je peux les faire disparaitre c'est bien


En faite la difficulté est d'indiquer au formulaire qu'il doit ce comporter d'un façon particulière.

En effet mettre

Code:

        $model = new Zend_Form_Element_Select('model');
        $model->setLabel('Model *')
                ->setRequired(true)
                ->addValidator('NotEmpty')
                ->addMultiOption('', 'Choose');
        $table = new Model_DbTable_Model();
        foreach ($table->findForSelect() as $row) {
            $model->addMultiOption($row->model, $row->modelName);
        }


        //ajouter ces 2 lignes 
        $model->setRequired(false);
        $model->setOptions(array('disable'=>'disable'));

Rends le champ désactivé et il n'a plus de validation.

mais comment lui faire comprendre  lorsque le champ 'payer' de la base de donnée est vrai, il dois ajouter les 2 lignes ci-dessus

ce teste je n'arrive à le faire que dans populate() : if ($this->payer->getValue()) {}

Dernière modification par maryooman (09-06-2010 14:35:58)

Hors ligne

 

#4 09-06-2010 14:58:32

nORKy
Membre
Date d'inscription: 06-03-2008
Messages: 1098

Re: Désactiver validateur sous certaines conditions

hmm. ca voudrait dire qu'un navigateur n'envoit pas la valeur d'un champs "disable" ?!

dans ce cas, vaut mieux enlevé le champ, car sinon, tu risques de modifé à cause d'un champs "vide"


----
Gruiiik !

Hors ligne

 

#5 09-06-2010 15:14:43

maryooman
Membre
Date d'inscription: 15-02-2010
Messages: 106

Re: Désactiver validateur sous certaines conditions

Justement comment on enleve un champs ??

Voila un code simple :

Code:

    public function init()
    {
        $this->setName('country');

        $id = new Zend_Form_Element_Hidden('country_id');

        $name = new Form_EText('country_name','Name',true,2,20);
        $nameDoesntExist = new Zend_Validate_Db_NoRecordExists('country', 'country_name');
        
        $submit = new Zend_Form_Element_Submit('submit');
        $submit->setAttrib('id', 'submitbutton');

        $this->addElements(array($id, $name, $submit));
    }

Pour désactiver $name, lorsqu'une condition est remplie, je fais comment ?

Hors ligne

 

#6 09-06-2010 15:59:46

maryooman
Membre
Date d'inscription: 15-02-2010
Messages: 106

Re: Désactiver validateur sous certaines conditions

Je l'ai finalement fait marché en testant dans le controller si payer était à vrai.
J'ai aussi créé un autre formulaire.
J'avais envie de tout faire juste avec un teste, mais bon.

Merci de m'avoir répondu !

Hors ligne

 

#7 10-08-2010 16:04:15

hadesjack
Membre
Date d'inscription: 12-10-2009
Messages: 23

Re: Désactiver validateur sous certaines conditions

mettre le ->setRequired(true); coté controler que quand tu en avais besoin.

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