Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 09-06-2011 10:07:26

Napo_7
Nouveau membre
Date d'inscription: 08-06-2011
Messages: 2

[Résolu][Zend_Db][1.5.0] Un validateur pour plusieurs Champs

Bonjour à tous,

C'est mon premier message sur ce forum, je vous salue donc tous et je me présente,
je suis un développeur php qui s’essaie à Zend (j'avance doucement mais surement).

J'ai un petit souci avec la cretation d'un validateur :
J'ai un formulaire qui contient entre autre 3 champs qui compose une date de naissance

Code:

class FormulaireIns extends Zend_Form {

...

$Jour = new Zend_Dojo_Form_Element_DateTextBox('Jour');
        $Jour->setLabel('DDN :');
        $Jour->setRequired(true)
        ->removeDecorator('HtmlTag') // Enleve les DT et DD (utiliser "Label" pour juste le dt)
        ->addDecorators(array(
                              array('HtmlTag',
                                    array('tag' => 'dd', 'class' => 'DDN')
                                    )
                              )
                        )
        ->setAttrib('size', '1')
        ->setAttrib('maxlength', '2');
        
$Mois = new Zend_Dojo_Form_Element_DateTextBox('Mois');
$Mois->setRequired(true)
        ->removeDecorator('HtmlTag') // Enleve les DT et DD (utiliser "Label" pour juste le dt)
        ->removeDecorator('Label')
        ->addDecorators(array(
                              array('HtmlTag',
                                    array('tag' => 'dd', 'class' => 'DDN') //Ajoute une span autour et lui donne une class DDN
                                    )
                              )
                        )
        ->setAttrib('size', '1')
        ->setAttrib('maxlength', '2');
        
$Annee = new Zend_Dojo_Form_Element_DateTextBox('Annee');
$Annee->setRequired(true)
        ->removeDecorator('HtmlTag') // Enleve les DT et DD (utiliser "Label" pour juste le dt)
        ->removeDecorator('Label')
        ->addDecorators(array(
                              array('HtmlTag',
                                    array('tag' => 'dd', 'class' => 'DDN')
                                    )
                              )
                        )
        ->setAttrib('size', '3')
        ->setAttrib('maxlength', '4');


...

et je souhaite savoir si $Annee-$Mois-$Jour est une date valide

avec ce validateur :

Code:

class ValidDate extends Zend_Validate_Abstract {
    
    const FALSEDATE = "falseDate";
    
    protected $_messageTemplates = array(
    self::FALSEDATE  =>
      "Date de naissance non valide");
        
    public function isValid($value) {
        $this->_setValue($value);
        if(Zend_Date::isDate($value, 'YYYY-MM-dd')) {
                return true;
        } else {
                $this->setErrors(self::FALSEDATE);
                return false;
        }
    }
}

En l'appelant lors de la soumission du formulaire :

Code:

if ($this->_request->isPost()) {
   $formData = $this->_request->getPost();
   if ($form->isValid($formData)) {
...
$DDN = $form->getValue('Annee') . '-' . $form->getValue('Mois') . '-' . $form->getValue('Jour');
                if($form->Jour->addValidator(new ValidDate($DDN))) $row->date_naissance = $DDN;
...

hélas mon validateur est ignoré.

J'ai vue plusieurs fois sur ce forum des post qui ressemblaient au mien mais je n'ai pas trouvé de solution malgré tous... Je dois surement oublier qq chose.

Dernière modification par Napo_7 (09-06-2011 12:07:21)

Hors ligne

 

#2 09-06-2011 11:42:44

Ithier
Membre
Date d'inscription: 05-01-2010
Messages: 85

Re: [Résolu][Zend_Db][1.5.0] Un validateur pour plusieurs Champs

La méthode est un peu bizarre d'ajouter le validateur après. Le mieux je pense est d'ajouter le validateur dans le Zend_Form

Code:

[lang=php]
$Annee->setRequired(true)
        ->removeDecorator('HtmlTag') // Enleve les DT et DD (utiliser "Label" pour juste le dt)
        ->removeDecorator('Label')
        ->addDecorators(array(
                              array('HtmlTag',
                                    array('tag' => 'dd', 'class' => 'DDN')
                                    )
                              )
                        )
        ->setAttrib('size', '3')
        ->setAttrib('maxlength', '4')
        ->addValidator(new ValidDate());

lorsque tu appelleras le isValid de la form la fonction isValid de ton validateur sera automatiquement appelée avec comme paramètre l'année. Ce n'est pas suffisant puisque tu as besoin aussi du mois et du jour, mais le deuxième paramètre de isValid est context qui est un tableau avec le contenu du formulaire, tu peux donc récupérer le mois et le jour.

Code:

[lang=php]
class ValidDate extends Zend_Validate_Abstract {
    
    const FALSEDATE = "falseDate";
    
    protected $_messageTemplates = array(
    self::FALSEDATE  =>
      "Date de naissance non valide");
        
    public function isValid($annee,$context) {
        $value = $annee . '-' . $context['Mois'] . '-' . $context['Jour'];
        $this->_setValue($value);
        if(Zend_Date::isDate($value, 'YYYY-MM-dd')) {
                return true;
        } else {
                $this->setErrors(self::FALSEDATE);
                return false;
        }
    }
}

Voila l'idée, j'espère que cela t'aidera


PS: Je n'ai pas testé le code

Hors ligne

 

#3 09-06-2011 12:06:58

Napo_7
Nouveau membre
Date d'inscription: 08-06-2011
Messages: 2

Re: [Résolu][Zend_Db][1.5.0] Un validateur pour plusieurs Champs

il faut juste initaliser $context=null et ton code fonctionne

(et changer setErrors par _error)

Merci bien

Dernière modification par Napo_7 (09-06-2011 12:15:23)

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