Monthly Archives

4 Articles

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 :
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.

ZF 2.0 c’est pour bientôt

Le Zend Framework 2.0 est en préparation et la société Zend vous propose de participer à un petit questionnaire afin de savoir dans quelle direction la nouvelle version va aller.

Vous pouvez trouver le questionnaire à cette adresse : http://devzone.zend.com/article/11485-Z … y-for-2009

Ne vous en faites pas, le questionnaire n’est pas trop long. J’ai mis 5-10 minutes à le faire et il y a qu’une vingtaine de questions.

Merci de votre participation dans le développement du framework.

L’extension HTTP

by Throrïn 0 Comments

Aujourd’hui j’aimerais vous présenter une extension PHP vraiment utile, il s’agit de l’extension HTTP.

Je l’ai découvert lors d’une recherche d’une autre méthode de redirection que celle que j’avais appris en cours, à savoir la fonction header(‘Redirection : http://mapage.truc.fr’);

Cette fonction était assez limitée. Tout d’abord, quand on met en place les sessions, cette fonction fait tout planter très rapidement. Ensuite, quand on a une grande quantité d’arguments à mettre en GET, c’est vite exaspérant. Alors qu’avec les fonctions http, cela devient tout de suite plus rapide et plus fonctionnel et assez bien pensé.

Attention quand même, cette extension n’est pas installée par défaut dans PHP, il faut le faire soi-même. Je vous conseille de lire la documentation rédigée à cet effet sur le site de PHP disponible à cette adresse :

http://fr2.php.net/manual/fr/book.http.php

Cette extension ne se limite pas qu’aux redirections PHP mais elle sert aussi à créer des adresses respectant les normes, permet la création de requêtes personnalisées ou encore l’envoi de paramètres GET ou POST assez simplement.

Pour toute information complémentaire, je vous renvoie sur la documentation et j’espère que cette extension vous sera utile.

Sensibilation sur les Index

Dans l’article du jour, j’aimerai vous parler des Index dans une base de données.

Comme leur nom l’indique, les index permettent d’indexer des colonnes d’une table. Mais quelle colonne à indexer et pourquoi ? Et bien c’est là la question. Si sur votre application vous avez plusieurs fois des requêtes qui ressortent avec une clause ‘WHERE’ ou ‘INNER JOIN’ faisant référence au même champ, plusieurs fois, il est conseillé de l’indexer.

Pourquoi ? Et bien tout simplement pour une raison d’optimisation. Votre base de données va stoker en mémoire des tables d’index contenant tous ces index. Au lieu d’aller gratter sur le disque-dur du serveur et ainsi le mettre à genoux si on se retrouve avec 1000 clients au même moment, la base de données va regarder en mémoire la table d’index et ressortir votre résultat directement.

Attention tout de même, d’une part, vos select seront optimisés (après les premières requêtes) mais en contrepartie, les enregistrements seront beaucoup plus long car au lieu d’inscrire votre enregistrement sur une table, il sera inscrit sur votre table ciblée mais aussi sur les différentes tables index. Donc réfléchissez bien à cela.

L’astuce consiste à droper les index de la table avant l’enregistrement et à les rajouter après. Ca ne modifiera rien du côté de votre table. Mais vous gagnerez quelques secondes voir quelques heures, selon le nombre d’index que contient votre table, lors de l’enregistrement.

Attention aussi, les clés étrangères ne sont pas indexées, donc cherchez-les bien et indexez-les. C’est l’une des premières causes de ralentissement d’un serveur de bases de données.

Tout ceci je l’ai appris en cours durant la semaine et j’avais envi de vous sensibiliser sur les indexes. C’est l’une des premières causes de ralentissement d’une base de données car la plupart des personnes oublient leur utilité.