déc
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

A propos de l'Auteur: Benjamin Besse

Je suis Analyste Développeur chez Goomeo et je suis passioné par tout ce qui touche aux technologies du Web. J'ai commencé par apprendre l'utilisation du Framework Zend et j'ai continué naturellement via Android. Le tout seulement avec les bases acquises en DUT et Licence professionnelle Informatique.

3 Commentaires Donnez votre avis

  • 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 ;)

Laisser un commentaire

Mots-Clefs