Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
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
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 :
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 :
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
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
[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.
[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
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
Pages: 1