Dans la plupart des cas lorsque l’on affiche un listing provenant d’une requête sql on aimerait pouvoir offrir le tri à l’utilisateur. Dans l’article qui suit, je vous propose de découvrir une manière de le faire assez facilement.
Comme exemple nous prendrons le cas d’une liste via l’appelle du contrôleur membres et de l’action liste.
Dans le fichier MembresController.php nous aurons donc une méthode listeAction()
public function listeAction() { $membres = new Default_Model_DbTable_Membres(); $this->view->entries = $membres->fetchAll(); } |
Et dans la vue membres/liste.phtml nous aurons :
<?php $rowCount = count($this->entries); if ($rowCount > 0) { ?> <table> <tr> <th>Nom</th> <th>Adresse</th> <th>Code postal</th> <th>Ville</th> <th>Email</th> </tr> <?php foreach($this->entrie as $entry): ?> <tr> <td><?php echo $this->escape($entry->name) ?></td> <td><?php echo $this->escape($entry->addrese) ?></td> <td><?php echo $entry->postCode ?></td> <td><?php echo $this->escape($entry->cityName) ?></td> <td><?php echo $this->escape($entry->email) ?></td> </tr> <?php endforeach; echo '</table>'; } else { echo '<div>Aucun membre n\'est enregistré!<br />;)<br /></div>'; } ?> |
Jusque là, normalement, rien de bien complexe pour celui qui connait ZF.
Ajoutons deux fichiers (cf pièce jointe) dans le dossier librairy/Gru.
Nous devons ensuite les charger de manière automatique. Pour ce faire, dans le bootstrap.php (dont un extrait possible est présent ci-dessous) ajoutons les informations nécessaires au chargement des fichiers :
protected function _initAutoload() { // nos deux lignes ajoutées $autoloader = Zend_Loader_Autoloader::getInstance(); $autoloader->registerNamespace('Gru'); // fin de l'ajout // Exemple de ce qu'il pourrait y avoir en plus! $autoloader = new Zend_Application_Module_Autoloader(array( 'namespace' => 'Default', 'basePath' => dirname(__FILE__), )); return $autoloader; } protected function _initView() { $view = new Zend_View(); $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('ViewRenderer'); $viewRenderer->setView($view); //début ajout $view->addHelperPath(APPLICATION_PATH . '/../library/Gru/View/Helper/', 'Gru_View_Helper_'); // fin de l'ajout return $view; } |
Maintenant, modifions notre application pour ajouter le tri. Reprenons notre contrôleur et modifions la méthode listeAction().
public function listeAction() { // Gestion du tri $order = new Gru_OrderBy('membre'); //Ajout des clefs de tri $order->addKey('name', 'Nom', 'asc'); $order->addKey('add', 'Adresse'); $order->addKey('postCode', 'Code postal', 'asc'); $order->addKey('cityName', 'Ville', 'asc'); $order->addKey('email', 'Courriel', 'asc'); // injection des requêtes get $order->insertRequestParams($this->getRequest()->getParam('order'), $this->getRequest()->getParam('by')); $this->view->orderKeys = $order->getKeys(); $membres = new Default_Model_DbTable_Membres(); //ne pas oubleir d'ajouter les champs trier au moment de la requête sql $this->view->entries = $membres->fetchAll(null, $order->getSqlKeys()); } |
Et pour finir notre vue :
<?php $rowCount = count($this->entries); if ($rowCount > 0) { ?> <table> <tr> <?php echo $this->orderBy()->th($this->orderKeys, $this->baseUrl('/themes/images/')); ?> </tr> <?php foreach($this->entrie as $entry): ?> <tr> <td><?php echo $this->escape($entry->name) ?></td> <td><?php echo $this->escape($entry->addrese) ?></td> <td><?php echo $entry->postCode ?></td> <td><?php echo $this->escape($entry->cityName) ?></td> <td><?php echo $this->escape($entry->email) ?></td> </tr> <?php endforeach; echo '</table>'; } else { echo '<div>Aucun membre n\'est enregistré!<br />;)<br /></div>'; } ?> |
Dans l’exemple, nous afficherons des icônes suivant le sens du tri, icônes se trouvant dans le répertoire spécifié. Un clic sur les titres permet de trier suivant la colonne cliquée. A noter qu’ici Adresse ne sera pas triable du au fait de la non précision de l’ordre.
Il y aurait moyen d’améliorer le script :
- utilisations de décorateurs
- utilisation de traduction
- Gru_OrderBy devrait être un plugins
- …
En attendant, j’espère que ce bout de code vous facilitera la vie!
Des remarques, des questions? Postez un commentaire!
Similar Posts:
- None Found
echo ‘Aucun membre n’est enregistré!;)’;
n’est pas sur que cette ligne sera correct a cause du « ‘ » du « n’est »
corrigé
Salut et merci pour ce tuto.
Je n’arrive pas à récupérer les deux fichiers, le lien semble être mort. Peux tu les mettre à dispo s’il te plait.
Hello,
le liens est bon seulement c’est ce stupide thème qui donne l’impression que c’est foireux …..
essaye avec le liens direct … : http://grummfy.be/blog/wp/wp-content/uploads/2010/01/zf-tuto-order-by.zip
Super c’est ok 🙂
Merci
Si tu as des remarques ou suggestions, n’hésite pas!
Salut, merci pour le tuto.
Petite remarque, tu n’es pas obligé de faire :
$rowCount = count($this->entries);
if ($rowCount > 0)
Tu peux directement faire :
if ($this->entries)
Certes, mais faire if ($this->entries) m’as toujours poser problèmes car on peux tester tout et n’importe quoi de cette manière … et personellement j’aime que ce qui est testé soit explicite …
sinon merci.