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 :
class Default_Forms_Contact extends Zend_Form
{
public function init()
{
}

public function errormessages()
{
}
}

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 :
public function errormessages()
{
//cette fonction retourne le tableau des retours des validateurs de chaque champs
$errorsMessages = $this->getMessages();
//va afficher à l'écran tout le tableau
Zend_Debug::dump($errorsMessages);
}

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.

class Default_Forms_Contact extends Zend_Form
{
public function init()
{
$this->setMethod('POST');
$this->setName('contact');

$email = new Zend_Form_Element_Text('email');
$email ->setLabel('Email')
->setRequired(TRUE)
->setAttribs(array('maxlength' => '200', 'size' => '60'))
->addFilters(array('StringTrim', 'StripTags'))
->addValidator(new Zend_Validate_EmailAddress())
->setDecorators(array( array('ViewHelper'), // aide de vue ( obligatoire sauf 2 cas )
array('decorator'=>array('1er'=>'HtmlTag'),'options'=>array('tag'=>'td','colspan'=>'3')), // 1er tag = element sans le libellé entouré de td
array('label',array('tag' => 'th')), // le libellé entouré de th
array('decorator'=>array('2eme'=>'HtmlTag'),'options'=>array('tag'=>'tr'))));

$sujet = new Zend_Form_Element_Text('sujet');
$sujet ->setLabel('Sujet')
->setRequired(TRUE)
->setAttribs(array('maxlength' => '100', 'size' => '60'))
->addFilters(array('StringTrim', 'StripTags'))
->addValidators(array( array('validator' => 'StringLength', 'options' => array(2))))
->setDecorators(array( array('ViewHelper'), // aide de vue ( obligatoire sauf 2 cas )
// array('Errors'),
array('decorator'=>array('1er'=>'HtmlTag'),'options'=>array('tag'=>'td','colspan'=>'3')), // 1er tag = element sans le libellé entouré de td
array('label',array('tag' => 'th')), // le libellé entouré de th
array('decorator'=>array('2eme'=>'HtmlTag'),'options'=>array('tag'=>'tr'))));

$message = new Zend_Form_Element_Textarea('message');
$message ->setLabel('Message')
->setRequired(true)
->setAttribs(array('cols' => '43', 'rows' => '5'))
->addFilters(array('StringTrim', 'StripTags'))
->setDecorators(array( array('ViewHelper'), // aide de vue ( obligatoire sauf 2 cas )
// array('Errors'),
array('decorator'=>array('1er'=>'HtmlTag'),'options'=>array('tag'=>'td','colspan'=>'3')), // 1er tag = element sans le libellé entouré de td
array('label',array('tag' => 'th')), // le libellé entouré de th
array('decorator'=>array('2eme'=>'HtmlTag'),'options'=>array('tag'=>'tr'))));

$captcha = new App_Form_Captcha('captcha', array(
'label' => 'Etes-vous humain?',
'captcha' => 'ReCaptcha',
'captchaOptions' => array(
'PrivKey' => '6LfdFAkAAAAAADI6gRCs8A1peMymmMa7Idr2IZoU',
'PubKey' => '6LfdFAkAAAAAAKftMRo2C8lzd9Rp9Tps0ozaA1Aw'
),
/*
'captcha' => array(
'captcha' => 'Image',
'font' => APPLICATION_PATH . '/other/ariblk.ttf',
'imgDir' => APPLICATION_PATH . '/../public/images/captcha/',
'imgUrl' => Zend_Controller_Front::getInstance()->getBaseUrl().'/images/captcha/',
'wordLen' => 7,
'timeout' => 300,
),*/
));
$captcha->setDecorators(array(
array('decorator' => array('td' => 'HtmlTag'), 'options' => array('tag' => 'td')),
array('Label', array('tag' => 'td'))
));

unset($captcha->helper);

$submit = new Zend_Form_Element_Submit('valider');
$submit ->setLabel("Valider")
->setDecorators(array( array('ViewHelper'),
//array('Errors'),
array('decorator'=>array('1er'=>'HtmlTag'),'options'=>array('tag'=>'td',
'colspan'=>'2',
'align'=>'center')),
array('decorator'=>array('2eme'=>'HtmlTag'),'options'=>array('tag'=>'tr'))));

$this->addElements(array($email, $sujet, $message, $captcha, $submit));

$this->setDecorators(
array(
'FormElements',
array('HtmlTag', array('tag' => 'table')),
'Form'
));
}

public function errormessages()
{
echo "

    ";
    //cette fonction retourne le tableau des retours des validateurs de chaque champs
    $errorsMessages = $this->getMessages();
    if(isset($errorsMessages['email']['emailAddressInvalid'])){
    echo "

  • L'adresse e-mail que vous avez entré est invalide.
  • ";
    }
    if(isset($errorsMessages['email']['isEmpty'])){
    echo "

  • Veuillez saisir un E-mail.
  • ";
    }
    if(isset($errorsMessages['message']['stringLengthTooShort'])){
    echo "

  • Le message doit avoir plus de 30 caractères.
  • ";
    }
    if(isset($errorsMessages['message']['isEmpty'])){
    echo "

  • Veuillez saisir un message.
  • ";
    }
    if(isset($errorsMessages['sujet']['stringLengthTooShort'])){
    echo "

  • Le message doit avoir plus de 30 caractères.
  • ";
    }
    if(isset($errorsMessages['sujet']['isEmpty'])){
    echo "

  • Veuillez saisir un sujet.
  • ";
    }
    if(isset($errorsMessages['captcha']['badCaptcha'])){
    echo "

  • Le code entré est faux.
  • ";
    }
    if(isset($errorsMessages['captcha']['missingValue'])){
    echo "

  • Vous devez saisir le code affiché à l'écran.
  • ";
    }
    echo "

";
}
}

Enfin il ne nous reste plus qu’à mettre en forme la vue. Je vous propose cette approche :

Vous avez des suggestions? Des conseils? Ou bien vous voulez que je fasse un sujet bien spécifique à votre demande?

Et bien n'hésitez pas, ce formulaire est fait pour vous.

view->infos))
{
?>

view->infos as $info)
{
echo $info;
}
?>

form->getMessages())
{
?>

form->errormessages(); ?>

form->setAction($this->url());
echo $this->form;
?>

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.