29
2009
Zend_Form et messages d’erreur
Aujourd’hui je vais vous faire un petit tutoriel qui m’a été demandé. Ce tuto a pour thème les messages d’erreur des formulaires. Comme vous le voyez sur mon site, j’ai regroupé tous les messages d’erreur en haut du formulaire et certains se demandent comment cela marche. Bon ma méthode n’est surement pas la meilleure mais elle est bien pratique.
Tout d’abord sachez qu’il va falloir modifier vos classes formulaire et ajouter une nouvelle méthode. Ce qui donnera le squelette suivant :
| PHP | | copy code | | ? |
| 01 | class Default_Forms_Contact extends Zend_Form |
| 02 | { |
| 03 | public function init() |
| 04 | { |
| 05 | } |
| 06 | |
| 07 | public function errormessages() |
| 08 | { |
| 09 | } |
| 10 | } |
Dedans ce n’est pas compliqué, vous devrez récupérer la liste des erreurs comme ceci. Par contre, le plus dur arrive, en fonction des validateurs et des champs ciblés, vous voulez peut-être mettre un message différent. La meilleure méthode pour faire ressortir toute la liste des erreurs en cours et les ajouter à notre liste de test est de faire comme ceci :
| PHP | | copy code | | ? |
| 1 | public function errormessages() |
| 2 | { |
| 3 | //cette fonction retourne le tableau des retours des validateurs de chaque champs |
| 4 | $errorsMessages = $this->getMessages(); |
| 5 | //va afficher à l'écran tout le tableau |
| 6 | Zend_Debug::dump($errorsMessages); |
| 7 | } |
Pour finir voici un exemple concret d’une de mes classes formulaire avec la liste des messages d’erreur. Je sais à la longue sa peut devenir très contraignant mais je fais du cas par cas.
| PHP | | copy code | | ? |
| 001 | class Default_Forms_Contact extends Zend_Form |
| 002 | { |
| 003 | public function init() |
| 004 | { |
| 005 | $this->setMethod('POST'); |
| 006 | $this->setName('contact'); |
| 007 | |
| 008 | $email = new Zend_Form_Element_Text('email'); |
| 009 | $email ->setLabel('Email') |
| 010 | ->setRequired(TRUE) |
| 011 | ->setAttribs(array('maxlength' => '200', 'size' => '60')) |
| 012 | ->addFilters(array('StringTrim', 'StripTags')) |
| 013 | ->addValidator(new Zend_Validate_EmailAddress()) |
| 014 | ->setDecorators(array( array('ViewHelper'), // aide de vue ( obligatoire sauf 2 cas ) |
| 015 | array('decorator'=>array('1er'=>'HtmlTag'),'options'=>array('tag'=>'td','colspan'=>'3')), // 1er tag = element sans le libellé entouré de td |
| 016 | array('label',array('tag' => 'th')), // le libellé entouré de th |
| 017 | array('decorator'=>array('2eme'=>'HtmlTag'),'options'=>array('tag'=>'tr')))); |
| 018 | |
| 019 | $sujet = new Zend_Form_Element_Text('sujet'); |
| 020 | $sujet ->setLabel('Sujet') |
| 021 | ->setRequired(TRUE) |
| 022 | ->setAttribs(array('maxlength' => '100', 'size' => '60')) |
| 023 | ->addFilters(array('StringTrim', 'StripTags')) |
| 024 | ->addValidators(array( array('validator' => 'StringLength', 'options' => array(2)))) |
| 025 | ->setDecorators(array( array('ViewHelper'), // aide de vue ( obligatoire sauf 2 cas ) |
| 026 | // array('Errors'), |
| 027 | array('decorator'=>array('1er'=>'HtmlTag'),'options'=>array('tag'=>'td','colspan'=>'3')), // 1er tag = element sans le libellé entouré de td |
| 028 | array('label',array('tag' => 'th')), // le libellé entouré de th |
| 029 | array('decorator'=>array('2eme'=>'HtmlTag'),'options'=>array('tag'=>'tr')))); |
| 030 | |
| 031 | $message = new Zend_Form_Element_Textarea('message'); |
| 032 | $message ->setLabel('Message') |
| 033 | ->setRequired(true) |
| 034 | ->setAttribs(array('cols' => '43', 'rows' => '5')) |
| 035 | ->addFilters(array('StringTrim', 'StripTags')) |
| 036 | ->setDecorators(array( array('ViewHelper'), // aide de vue ( obligatoire sauf 2 cas ) |
| 037 | // array('Errors'), |
| 038 | array('decorator'=>array('1er'=>'HtmlTag'),'options'=>array('tag'=>'td','colspan'=>'3')), // 1er tag = element sans le libellé entouré de td |
| 039 | array('label',array('tag' => 'th')), // le libellé entouré de th |
| 040 | array('decorator'=>array('2eme'=>'HtmlTag'),'options'=>array('tag'=>'tr')))); |
| 041 | |
| 042 | $captcha = new App_Form_Captcha('captcha', array( |
| 043 | 'label' => 'Etes-vous humain?', |
| 044 | 'captcha' => 'ReCaptcha', |
| 045 | 'captchaOptions' => array( |
| 046 | 'PrivKey' => '6LfdFAkAAAAAADI6gRCs8A1peMymmMa7Idr2IZoU', |
| 047 | 'PubKey' => '6LfdFAkAAAAAAKftMRo2C8lzd9Rp9Tps0ozaA1Aw' |
| 048 | ), |
| 049 | /* |
| 050 | 'captcha' => array( |
| 051 | 'captcha' => 'Image', |
| 052 | 'font' => APPLICATION_PATH . '/other/ariblk.ttf', |
| 053 | 'imgDir' => APPLICATION_PATH . '/../public/images/captcha/', |
| 054 | 'imgUrl' => Zend_Controller_Front::getInstance()->getBaseUrl().'/images/captcha/', |
| 055 | 'wordLen' => 7, |
| 056 | 'timeout' => 300, |
| 057 | ),*/ |
| 058 | )); |
| 059 | $captcha->setDecorators(array( |
| 060 | array('decorator' => array('td' => 'HtmlTag'), 'options' => array('tag' => 'td')), |
| 061 | array('Label', array('tag' => 'td')) |
| 062 | )); |
| 063 | |
| 064 | |
| 065 | unset($captcha->helper); |
| 066 | |
| 067 | $submit = new Zend_Form_Element_Submit('valider'); |
| 068 | $submit ->setLabel("Valider") |
| 069 | ->setDecorators(array( array('ViewHelper'), |
| 070 | //array('Errors'), |
| 071 | array('decorator'=>array('1er'=>'HtmlTag'),'options'=>array('tag'=>'td', |
| 072 | 'colspan'=>'2', |
| 073 | 'align'=>'center')), |
| 074 | array('decorator'=>array('2eme'=>'HtmlTag'),'options'=>array('tag'=>'tr')))); |
| 075 | |
| 076 | $this->addElements(array($email, $sujet, $message, $captcha, $submit)); |
| 077 | |
| 078 | $this->setDecorators( |
| 079 | array( |
| 080 | 'FormElements', |
| 081 | array('HtmlTag', array('tag' => 'table')), |
| 082 | 'Form' |
| 083 | )); |
| 084 | } |
| 085 | |
| 086 | public function errormessages() |
| 087 | { |
| 088 | echo "<ul>"; |
| 089 | //cette fonction retourne le tableau des retours des validateurs de chaque champs |
| 090 | $errorsMessages = $this->getMessages(); |
| 091 | if(isset($errorsMessages['email']['emailAddressInvalid'])){ |
| 092 | echo "<li>L'adresse e-mail que vous avez entré est invalide.</li>"; |
| 093 | } |
| 094 | if(isset($errorsMessages['email']['isEmpty'])){ |
| 095 | echo "<li>Veuillez saisir un E-mail.</li>"; |
| 096 | } |
| 097 | if(isset($errorsMessages['message']['stringLengthTooShort'])){ |
| 098 | echo "<li>Le message doit avoir plus de 30 caractères.</li>"; |
| 099 | } |
| 100 | if(isset($errorsMessages['message']['isEmpty'])){ |
| 101 | echo "<li>Veuillez saisir un message.</li>"; |
| 102 | } |
| 103 | if(isset($errorsMessages['sujet']['stringLengthTooShort'])){ |
| 104 | echo "<li>Le message doit avoir plus de 30 caractères.</li>"; |
| 105 | } |
| 106 | if(isset($errorsMessages['sujet']['isEmpty'])){ |
| 107 | echo "<li>Veuillez saisir un sujet.</li>"; |
| 108 | } |
| 109 | if(isset($errorsMessages['captcha']['badCaptcha'])){ |
| 110 | echo "<li>Le code entré est faux.</li>"; |
| 111 | } |
| 112 | if(isset($errorsMessages['captcha']['missingValue'])){ |
| 113 | echo "<li>Vous devez saisir le code affiché à l'écran.</li>"; |
| 114 | } |
| 115 | echo "</ul>"; |
| 116 | } |
| 117 | } |
Enfin il ne nous reste plus qu’à mettre en forme la vue. Je vous propose cette approche :
| PHP | | copy code | | ? |
| 01 | <div id="contenutexte"> |
| 02 | <div class="boite_contact"> |
| 03 | <div id="texte-contact"> |
| 04 | Vous avez des suggestions? Des conseils? Ou bien vous voulez que je fasse un sujet bien spécifique à votre demande? |
| 05 | |
| 06 | Et bien n'hésitez pas, ce formulaire est fait pour vous. |
| 07 | </div> |
| 08 | view->infos)) |
| 09 | { |
| 10 | ?> |
| 11 | <div class="success"> |
| 12 | view->infos as $info) |
| 13 | { |
| 14 | echo $info; |
| 15 | } |
| 16 | ?> |
| 17 | </div> |
| 18 | form->getMessages()) |
| 19 | { |
| 20 | ?> |
| 21 | <div class="warning">form->errormessages(); ?></div> |
| 22 | form->setAction($this->url()); |
| 23 | echo $this->form; |
| 24 | ?> |
| 25 | </div> |
| 26 | </div> |
Par contre si vous trouvez des arrangements à cette méthode je suis preneur, je sais que je ne maîtrise pas encore parfaitement cette technologie mais comme on peut le voir, chacun peut faire fonctionner comme il le désir le framework Zend.
Bonnes fêtes de fin d’année.
Articles Connexes
3 Commentaires Donnez votre avis
Laisser un commentaire
Catégories
- Actualités (11)
- Android (5)
- Bases de Données (4)
- Développement (1)
- PasteQR (2)
- PHP (8)
- Systèmes et Réseau (5)
- Technologies Web (5)
- Tests (2)
- Zend Framework (30)
Commentaires récents
- (@Fritte7) (@Fritte7) dans PasteQR passe en 1.1.0
- roux dans ZendX Jquery Dialog
- Fritte7 dans Gérer des évènements dans une listview.
- Fierfeu dans Introduction à Zend Framework 2.0
- Christophe B. dans Gérer des évènements dans une listview.
Mots-Clefs
Active Directory AJAX Android Apache2 APC Bootstrap Chrome Configuration CSS Eclipse Firefox Google html HTTP Installation Internet Internet Exporer Java Javascript JQuery JQuery UI Linux Mémoire Mac MySQL Navigateur Opera PDO Pear Phing PHP Safari SGBD SMTP SQL Ubuntu View Helper Windows Server XML Zend Cache Zend DB Zend Form Zend Framework ZendX ZF 2.0
WP Cumulus Flash tag cloud by Roy Tanck requires Flash Player 9 or better.

Publié par Throrïn





errormessages() ne respecte pas le MVC : les et n’ont rien à faire des un model ou controlleur. De plus, tu peux déjà mettre la traduction dans le validateur lui même :
‘validators’ => array(
array(‘notEmpty’,true,array(
‘messages’=>array(
Zend_Validate_NotEmpty::IS_EMPTY=>’Merci de saisir votre nom de famille’
)
)),
et donc tu peux après venir récupérer ces messages, les mettre dans un tableau, ou dans un placeholder, et les afficher : ce sera à la vue de définir comment elle veut les afficher (avec des ul, li ou n’importe quoi d’autre).
Cette méthode est vielle et obsolète, maintenant je retourne le tableau des erreurs à ma vue en JSON et je l’affiche comme je veux grâce à JQuery (formulaires en ajax uniquement) le tout grâce aux Contextes Zend.
Dans ce cas il serait peux être utile de le préciser en début de post