Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 30-07-2008 16:20:24

zanyth
Membre
Date d'inscription: 17-07-2008
Messages: 13

[zend_Form & Validate] Problème validator perso ...

Bonjour a tous, je rencontre un petit probleme : dans mon formulaire, il y a un select qui a par defaut la valeur "0" mais qui ne doit pas contenir cette valeur lorsque l'utilisateur valide le fomulaire (il doit donc en choisir une autre dans la liste)

je me suis dit que c'etait le travail d'un validator que je devrais créer (et que ça me ferait un bon exercice d'en faire un).

Voila donc ma classe de validation :

Code:

require_once 'Zend/Validate/Abstract.php';

class ValidateSelect extends Zend_Validate_Abstract
{
     
    const MUST_BE_SELECTED = 'mustBeSelected';


    protected $_messageTemplates = array(
    self::MUST_BE_SELECTED    => "a value must be selected");

    public function isValid($value)
    {
           $this->_setValue($value);

        [b]echo "tururururur";exit;[/b]
    
        if ($value==0)
        {
            echo "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
            $this->error(self::MUST_BE_SELECTED);
            return false;
        }
        
        return true;
    }

}

et voici son ajout à mon élément de formulaire :


Code:

           $validSelect=new Zend_Validate();
           $validSelect->addValidator(new ValidateSelect());

           $performingphysician = new Zend_Form_Element_Select('idphysician');
           $performingphysician->setLabel($local->translate('exams.exam_performingphysicianname'))
           ->addValidator($validSelect)
           ->addMultiOption(0, $aucun); (...)

et j'ai aussi essayé avec ça :

Code:

            $performingphysician = new Zend_Form_Element_Select('idphysician');
           $performingphysician->setLabel($local->translate('exams.exam_performingphysicianname'))
           ->addValidator(new ValidateSelect())
           ->addMultiOption(0, $aucun); (...)

Mais ça me pose le meme probleme : mon validator ne sert a rien ... ""tururururur" ne s'affiche que lorsque le résultat de mon select est valide (donc différent de zéro) ... s'il n'est pas valide, le processus passe outre le isValid() et enchaine sur addAction() (et me fait planter mon application le résultat du from n'étant pas valide)

Code:

elseif ($form->isValid($formData))
            {
                $addAction = new examinations_AddAction();
                $addAction->setActionController( $this );

}

Comment expliquez vous que mon validator ne se déclenche que si les données sont valides ?

Comment puis-je éviter ce soucis ? (je pense que la solution se situe au niveau de l'ajout du validator à mon élément mais je n'ai rien trouvé qui pouvait m'aider sur ce sujet ...)

Dernière modification par zanyth (30-07-2008 16:21:55)

Hors ligne

 

#2 30-07-2008 16:38:56

vg33
Membre
Date d'inscription: 30-07-2008
Messages: 46

Re: [zend_Form & Validate] Problème validator perso ...

Je pense que ton validateur se déclenche quand même si la donnée n'est pas valide. Essaye en rajoutant un exit après le 'aaaaaaaaaaa';
De plus, n'oublie pas que les données des formulaires sont des string.
Ecris donc :

Code:

if ($value == '0')

De plus, error() est protected ; l'appel est donc :

Code:

$this->_error();

Dernière modification par vg33 (30-07-2008 16:42:04)

Hors ligne

 

#3 30-07-2008 16:53:27

zanyth
Membre
Date d'inscription: 17-07-2008
Messages: 13

Re: [zend_Form & Validate] Problème validator perso ...

Merci pour ta réponse, j'avoue y avoir cru pour l'utilisation des guillemets ... mais cela ne marche toujours pas ...

voici le nouveau code de mon isValid()

Code:

          $this->_setValue($value);

        echo "$value tururururur";
        if ($value==null)
        {
            echo "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";exit;
            $this->_error(self::MUST_BE_SELECTED);
            return false;
        }
        
        if ($value=='0')
        {
            echo "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";exit;
            $this->_error(self::MUST_BE_SELECTED);
            return false;
        }

        if ($value=="Aucun")
        {
                        echo "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";exit;
            $this->_error(self::MUST_BE_SELECTED);
            return false;
        }
        exit;
        
        
        return true;

mais je n'ai comme retour que "turururu" ou un message d'erreur de mon application.

edit :


J'ai vraiment du mal a comprendre ce qu'il se passe ... apparement, mon validateur serait appeler par la méthode mere "$form->isValid($formData)" que si le résultat est déjà correct ... sinon il serait ignorer par cette derniere ...

Comment assignez vous vos validators persos a vos elemetns ?!

Dernière modification par zanyth (30-07-2008 17:07:37)

Hors ligne

 

#4 30-07-2008 23:05:10

Mat
Membre
Lieu: Clermont-Ferrand
Date d'inscription: 20-07-2008
Messages: 15
Site web

Re: [zend_Form & Validate] Problème validator perso ...

A verifier, mais je pense que le problème vient du fait que ton élément n'a pas la propriété "required" a true, ce qui fait que si une valeur zero/nulle est postée c'est considéré comme inexistant. Et vu qu'il n'est pas obligatoire de passer une valeur pour ton element, c'est considéré comme ok et ça ne passe pas par les validateurs.

Essaie avec :

Code:

$element->setRequired(true);

Une fois que tu auras validé ton exercice de validateurs, je te conseillerai de regarder aussi les validateurs qui existent par defaut. Le Zend_Validate_InArray te permettrait de ne valider que les valeurs que tu as defini pour les options de ton <select>.
En reprenant ton exemple :

Code:

$element = new Zend_Form_Element_Select('idphysician');
$valeursValides = array( 1 => "toto", 2 => "titi", 3 => "tutu");

$element->addValidator(new Zend_Validate_InArray(array_keys($valeursValides));
$element->setRequired(true);
$element->addMultiOption("", "valeur par defaut");
$element->addMultiOptions($valeursValides);

Dernière modification par Mat (30-07-2008 23:07:37)

Hors ligne

 

#5 31-07-2008 09:24:37

zanyth
Membre
Date d'inscription: 17-07-2008
Messages: 13

Re: [zend_Form & Validate] Problème validator perso ...

Merci pour ton aide !

En fait le setRequired(true) me fait tout le travail. Si je laisse le select "vide" il me dit qu'il y a un probleme. Mission accomplie donc !

Cepedant ca ne change rien a l'affaire de mon validator perso (qui ne se lance tjrs pas) donc je vais laisser (un peu) tomber, si vous avez des idées pour résoudre ce pb je suis tout de même preneur !!

Hors ligne

 

#6 31-07-2008 14:46:37

zanyth
Membre
Date d'inscription: 17-07-2008
Messages: 13

Re: [zend_Form & Validate] Problème validator perso ...

Rebondissement dans l'histoire !!

avec

Code:

           ->setRequired(true)
           ->addValidator($validNotEmpty)
           ->addValidator(new ValidateSelect())
           ->addMultiOption(0, $aucun);

Mon validator marche correctement

Code:

           $validNotEmpty=new Zend_Validate_NotEmpty();
           $validNotEmpty->setMessage($local->translate('error.string.empty'));

et si j'enleve "->setRequired(true)" ou ->addValidator($validNotEmpty) (ou si je remplace ->addValidator($validNotEmpty) par ->addValidator('NotEmpty')) et beh mon validateur ne se declenche pas ...

C vraiment fou ...


Edit : Ma solution (si ça peut en aider) :

Code:

           ->setRequired(true)
           ->addValidator($validSelect, true) //true : arrete toutes les validations de cet element si l'element n'est pas validSelect
           ->addValidator($validNotEmpty)
           ->addMultiOption(0, $aucun);

Re-Edit : Ah tiens ! On ne peut pas utiliser les balises de gras dans les balises de codes ?!

Dernière modification par zanyth (31-07-2008 15:02:59)

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