Après avoir présenté Zend Framework et initié la réalisation de l’application exemple et sa base de données (partie 1 de l’article), voyons désormais le traitement des données et leur restitution, ainsi que le contrôleur et la vue.
Controller et View
Le modèle sert de lien entre le contrôleur et la vue. Le contrôleur, rôle joué par le composant « Zend_Controller », s’occupe de traiter les requêtes du client (« GET » ou « POST ») et de préparer les données. La vue, composant « Zend_View », est en charge de la présentation des données.
Encore une fois l’outil en ligne de commande nous permet de créer les fichiers aux bons endroits dans l’arborescence. Le contrôleur et la vue par défaut (index) sont créés en une seule commande : <
1 |
$ zf create controller Vote |
Cette commande crée la classe du contrôleur « VoteController » dans le fichier « pplication/controllers/VoteController.php », avec l’action « indexAction() » par défaut. La vue correspondant à cette action est également créée, dans le répertoire « application/views/scripts/vote/ ».
Nous modifions l’action « indexAction() » de façon à ce qu’elle récupère les informations nécessaires à l’affichage du résumé et du détail des votes du jour.
1 2 3 4 5 6 7 |
public function indexAction() { $vote = new Application_Model_VoteMapper(); // récupération des votes du jour $this->view->allVotes = $vote->findByDate(date('Y-m-d')); $this->view->votesByRestaurant = $vote->getSummaryArray(date('Y-m-d')); } |
Pour présenter ces informations au client web, on complète la vue « application/views/scripts/vote/index.phtml » :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
<p><a href="<?php echo $this->url( array( 'controller' => 'vote', 'action' => 'addvote' ), 'default', true) ?>">Votez pour un restaurant</a></p> <p>Résumé du jour :</p> <table> <tr> <th>Restaurant</th> <th>Nombre de votes</th> </tr> <?php foreach ($this->votesByRestaurant as $resum): ?> <tr> <td><?php echo $this->escape($resum['restaurantname']) ?></td> <td><?php echo $this->escape($resum['count']) ?></td> </tr> <?php endforeach ?> </table> <br/> <p>Détail des votes du jour : </p> <ul> <?php foreach ($this->allVotes as $vote): ?> <li><?php echo $this->escape($vote->username) ?> : <?php echo $this->escape($vote->restaurantname) ?></li> <?php endforeach ?> </ul> |
Cette vue contient notamment un lien vers le formulaire de vote (que nous n’avons pas encore créé) généré à l’aide du « helper » $this->url().
A cette étape, nous pouvons tester la page correspondant à l’action « indexAction() » du controller « VoteController ». Pour cela, rappelons que par défaut les urls d’une application MVC développée avec Zend Framework sont de la forme « controller/action/parameters ». On peut donc tester l’action d’index du contrôleur « VoteController » en se rendant à l’adresse « http://localhost/vote/index » ou plus simplement « http://localhost/vote », l’action « index » étant utilisée par défaut.
Figure 3 – Page de détail des votes du jour (CLIQUER sur l’image pour l’agrandir)
Elle rassemble bien les enregistrements de test insérés manuellement lors de la création de la base de données, comme le montre la Figure 3.
L’étape suivante consiste à ajouter une page de formulaire permettant aux utilisateurs de voter.
Formulaire de vote
Pour préparer la page qui va accueillir le formulaire de vote, nous utilisons l’outil en ligne de commande pour générer une nouvelle action et une nouvelle vue correspondante.
1 |
$ zf create action Addvote vote |
Afin d’ajouter le formulaire, nous utilisons un outil proposé par zend framework, il s’agit des classes de formulaires « Zend_Form ». Nous pouvons générer un fichier de formulaire de la façon suivante :
1 |
$ zf create form Vote |
Cette commande permet de créer le fichier « application/forms/Vote.php ». Nous le complétons comme suit :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
<?php class Application_Form_Vote extends Zend_Form { public function init() { // La méthode HTTP d'envoi du formulaire $this->setMethod('post'); // Un élément pour le nom d'utilisateur $this->addElement('text', 'username', array( 'label' => 'Votre nom :', 'required' => true, 'filters' => array('StringTrim'), 'validators' => array( array('validator' => 'StringLength', 'options' => array(0, 20)) ) )); // Un élément pour le nom du restaurant $this->addElement('text', 'restaurantname', array( 'label' => 'Votre choix de restaurant :', 'required' => true, 'filters' => array('StringTrim'), 'validators' => array( array('validator' => 'StringLength', 'options' => array(0, 20)) ) )); // Un bouton d'envoi $this->addElement('submit', 'submit', array( 'ignore' => true, 'label' => 'Voter', )); } } |
Les formulaires Zend Framework sont complètement configurables, que ce soit au niveau du rendu graphique que des validateurs par exemple. Ils peuvent par ailleurs intégrer un certain nombre de protections, comme une protection contre les attaques CSRF ou encore contre les robots avec un Captcha.
On peut maintenant ajouter le formulaire dans la vue « application/views/scripts/vote/addvote.phtml » :
1 2 3 4 5 6 7 |
<p> Utilisez le formulaire ci-dessous pour faire part de votre choix </p> <?php $this->form->setAction($this->url()); echo $this->form; |
L’action « addvoteAction() » est complétée pour y ajouter le traitement des données postées par le formulaire de vote :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
public function addvoteAction() { $request = $this->getRequest(); $form = new Application_Form_Vote(); if ($this->getRequest()->isPost()) { if ($form->isValid($request->getPost())) { $vote = new Application_Model_Vote($form->getValues()); $mapper = new Application_Model_VoteMapper(); $mapper->save($vote); return $this->_helper->redirector('index'); } } $this->view->form = $form; } |
Figure 4 – Formulaire d’ajout de vote (CLIQUER sur l’image pour l’agrandir)
Les deux pages que nous souhaitions mettre en place sont maintenant fonctionnelles. Le formulaire se trouve à l’adresse « http://localhost/vote/addvote » et est également accessible par le lien présent sur la page « http://localhost/vote ».
La page de formulaire est représentée en Figure 4.
Attention : dans cet exemple, le système de « layout » (« zend_layout ») n’est pas activé et les pages HTML renvoyées ne sont pas valides. En effet, c’est le squelette du site qui doit contenir (entre autres) l’entête HTML et préciser l’encodage utilisé. Par conséquent, l’utilisation de caractères accentués peut poser problème, mais cela se résout facilement en créant le squelette du site ou en ajoutant temporairement l’entête HTML dans chacune des vues.
Pour aller plus loin
Avec ces deux pages très simples, nous avons pu appréhender quelques bases de Zend Framework. Nous avons mis en place une version minimaliste d’application MVC contenant deux pages et un formulaire. Nous avons utilisé, principalement, les composants « Zend_Db », « Zend_Application », « Zend_Controller », « Zend_View », ou encore « Zend_Form ».
Pour aller plus loin dans l’apprentissage de Zend_Framework, la documentation officielle est toute indiquée. Elle présente indépendamment les différents composants parmi lesquels on peut mentionner « Zend_Layout » pour la réalisation du squelette du site, « Zend_Cache » pour améliorer les performances de l’application, ou encore « Zend_Session », … et des dizaines d’autres !
De plus, comme Zend Framework se veut modulaire, il est relativement aisé d’interchanger les composants pour utiliser des composants externes comme, par exemple, un ORM (ex : Doctrine) ou encore un moteur de Template (ex : Twig, bien que son intégration requière un peu plus de travail). De quoi répondre à tous les besoins !.
Il est possible de retrouver l’intégralité de cet article dans le numéro 152 du mois de Mai 2012 du magazine « Programmez ».