{"id":222,"date":"2010-01-10T04:23:44","date_gmt":"2010-01-10T02:23:44","guid":{"rendered":"http:\/\/grummfy.be\/blog\/?p=222"},"modified":"2010-01-10T15:47:17","modified_gmt":"2010-01-10T13:47:17","slug":"tri-de-listing-sql-via-des-liens-dans-zend-framework","status":"publish","type":"post","link":"https:\/\/grummfy.be\/blog\/222","title":{"rendered":"Tri de listing sql via des liens dans Zend Framework"},"content":{"rendered":"<p style=\"text-align: justify;\">Dans la plupart des cas lorsque l&rsquo;on affiche un listing provenant d&rsquo;une requ\u00eate sql on aimerait pouvoir offrir le tri \u00e0 l&rsquo;utilisateur. Dans l&rsquo;article qui suit, je vous propose de d\u00e9couvrir une mani\u00e8re de le faire assez facilement.<\/p>\n<p><!--more--><\/p>\n<p style=\"text-align: justify;\">Comme exemple nous prendrons le cas d&rsquo;une liste via l&rsquo;appelle du contr\u00f4leur membres et de l&rsquo;action liste.<\/p>\n<p style=\"text-align: justify;\">Dans le fichier <em>MembresController.php<\/em> nous aurons donc une m\u00e9thode <em>listeAction()<\/em><\/p>\n<pre lang=\"php\">\r\npublic function listeAction()\r\n{\r\n\t$membres = new Default_Model_DbTable_Membres();\r\n\t$this->view->entries = $membres->fetchAll();\r\n}\r\n<\/pre>\n<p>Et dans la vue <em>membres\/liste.phtml<\/em> nous aurons :<\/p>\n<pre lang=\"php\">\r\n<?php\r\n\r\n$rowCount = count($this->entries);\r\nif ($rowCount > 0)\r\n{\r\n?>\r\n<table>\r\n\t<tr>\r\n\t\t<th>Nom<\/th>\r\n\t\t<th>Adresse<\/th>\r\n\t\t<th>Code postal<\/th>\r\n\t\t<th>Ville<\/th>\r\n\t\t<th>Email<\/th>\r\n\t<\/tr>\r\n<?php foreach($this->entrie as $entry): ?>\r\n\t<tr>\r\n\t\t<td><?php echo $this->escape($entry->name) ?><\/td>\r\n\t\t<td><?php echo $this->escape($entry->addrese) ?><\/td>\r\n\t\t<td><?php echo $entry->postCode ?><\/td>\r\n\t\t<td><?php echo $this->escape($entry->cityName) ?><\/td>\r\n\t\t<td><?php echo $this->escape($entry->email) ?><\/td>\r\n\t<\/tr>\r\n<?php\r\n\tendforeach;\r\n\techo '<\/table>';\r\n}\r\nelse\r\n{\r\n\techo '<div>Aucun membre n\\'est enregistr\u00e9!<br \/>;)<br \/><\/div>';\r\n}\r\n?>\r\n<\/pre>\n<p>Jusque l\u00e0, normalement, rien de bien complexe pour celui qui connait ZF.<\/p>\n<p style=\"text-align: justify;\">Ajoutons deux fichiers (cf <a rel=\"attachment wp-att-223\" href=\"http:\/\/grummfy.be\/blog\/222\/zf-tuto-order-by\">pi\u00e8ce jointe<\/a>) dans le dossier librairy\/Gru.<\/p>\n<p style=\"text-align: justify;\">\nNous devons ensuite les charger de mani\u00e8re automatique. Pour ce faire, dans le bootstrap.php (dont un extrait possible est pr\u00e9sent ci-dessous) ajoutons les informations n\u00e9cessaires au chargement des fichiers :<\/p>\n<pre lang=\"php\">\r\n\tprotected function _initAutoload()\r\n\t{\r\n\t\t\/\/ nos deux lignes ajout\u00e9es\r\n\t\t$autoloader = Zend_Loader_Autoloader::getInstance();\r\n\t\t$autoloader->registerNamespace('Gru');\r\n\t\t\/\/ fin de l'ajout\r\n\r\n\t\t\/\/ Exemple de ce qu'il pourrait y avoir en plus!\r\n\t\t$autoloader = new Zend_Application_Module_Autoloader(array(\r\n\t\t\t'namespace' => 'Default',\r\n\t\t\t'basePath'  => dirname(__FILE__),\r\n\t\t));\r\n\t\treturn $autoloader;\r\n\t}\r\n\r\n\tprotected function _initView()\r\n\t{\r\n\t\t$view = new Zend_View();\r\n\t\t$viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('ViewRenderer');\r\n\t\t$viewRenderer->setView($view);\r\n\r\n\t\t\/\/d\u00e9but ajout\r\n\t\t$view->addHelperPath(APPLICATION_PATH . '\/..\/library\/Gru\/View\/Helper\/', 'Gru_View_Helper_');\r\n\t\t\/\/ fin de l'ajout\r\n\r\n\t\treturn $view;\r\n\t}\r\n<\/pre>\n<p>Maintenant, modifions notre application pour ajouter le tri. Reprenons notre contr\u00f4leur et modifions la m\u00e9thode <em>listeAction().<\/em><\/p>\n<pre lang=\"php\">\r\npublic function listeAction()\r\n{\r\n\t\/\/ Gestion du tri\r\n\t$order = new Gru_OrderBy('membre');\r\n\r\n\t\/\/Ajout des clefs de tri\r\n\t$order->addKey('name', 'Nom', 'asc');\r\n\t$order->addKey('add', 'Adresse');\r\n\t$order->addKey('postCode', 'Code postal', 'asc');\r\n\t$order->addKey('cityName', 'Ville', 'asc');\r\n\t$order->addKey('email', 'Courriel', 'asc');\r\n\r\n\t\/\/ injection des requ\u00eates get\r\n\t$order->insertRequestParams($this->getRequest()->getParam('order'), $this->getRequest()->getParam('by'));\r\n\r\n\t$this->view->orderKeys = $order->getKeys();\r\n\r\n\r\n\r\n\t$membres = new Default_Model_DbTable_Membres();\r\n\t\/\/ne pas oubleir d'ajouter les champs trier au moment de la requ\u00eate sql\r\n\t$this->view->entries = $membres->fetchAll(null, $order->getSqlKeys());\r\n}\r\n<\/pre>\n<p>Et pour finir notre vue :<\/p>\n<pre lang=\"php\">\r\n<?php\r\n\r\n$rowCount = count($this->entries);\r\nif ($rowCount > 0)\r\n{\r\n?>\r\n<table>\r\n\t<tr>\r\n\t\t<?php echo $this->orderBy()->th($this->orderKeys, $this->baseUrl('\/themes\/images\/')); ?>\r\n\t<\/tr>\r\n<?php foreach($this->entrie as $entry): ?>\r\n\t<tr>\r\n\t\t<td><?php echo $this->escape($entry->name) ?><\/td>\r\n\t\t<td><?php echo $this->escape($entry->addrese) ?><\/td>\r\n\t\t<td><?php echo $entry->postCode ?><\/td>\r\n\t\t<td><?php echo $this->escape($entry->cityName) ?><\/td>\r\n\t\t<td><?php echo $this->escape($entry->email) ?><\/td>\r\n\t<\/tr>\r\n<?php\r\n\tendforeach;\r\n\techo '<\/table>';\r\n}\r\nelse\r\n{\r\n\techo '<div>Aucun membre n\\'est enregistr\u00e9!<br \/>;)<br \/><\/div>';\r\n}\r\n?>\r\n<\/pre>\n<p>Dans l&rsquo;exemple, nous afficherons des ic\u00f4nes suivant le sens du tri, ic\u00f4nes se trouvant dans le r\u00e9pertoire sp\u00e9cifi\u00e9. Un clic sur les titres permet de trier suivant la colonne cliqu\u00e9e. A noter qu&rsquo;ici Adresse ne sera pas triable du au fait de la non pr\u00e9cision de l&rsquo;ordre.<\/p>\n<p style=\"text-align: justify;\">Il y aurait moyen d&rsquo;am\u00e9liorer le script :<\/p>\n<ul>\n<li>utilisations de d\u00e9corateurs<\/li>\n<li>utilisation de traduction<\/li>\n<li>Gru_OrderBy devrait \u00eatre un plugins<\/li>\n<li>&#8230;<\/li>\n<\/ul>\n<p style=\"text-align: justify;\">En attendant, j&rsquo;esp\u00e8re que ce bout de code vous facilitera la vie!<\/p>\n<p style=\"text-align: justify;\">Des remarques, des questions? Postez un commentaire!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Dans la plupart des cas lorsque l&rsquo;on affiche un listing provenant d&rsquo;une requ\u00eate sql on aimerait pouvoir offrir le tri \u00e0 l&rsquo;utilisateur. Dans l&rsquo;article qui suit, je vous propose de d\u00e9couvrir une mani\u00e8re de le faire assez facilement.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"webmentions_disabled_pings":false,"webmentions_disabled":false,"footnotes":""},"categories":[9,10,5],"tags":[110,24,64],"class_list":["post-222","post","type-post","status-publish","format-standard","hentry","category-dev","category-php","category-projet","tag-php","tag-programmation","tag-zf"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/grummfy.be\/blog\/wp-json\/wp\/v2\/posts\/222","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/grummfy.be\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/grummfy.be\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/grummfy.be\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/grummfy.be\/blog\/wp-json\/wp\/v2\/comments?post=222"}],"version-history":[{"count":4,"href":"https:\/\/grummfy.be\/blog\/wp-json\/wp\/v2\/posts\/222\/revisions"}],"predecessor-version":[{"id":228,"href":"https:\/\/grummfy.be\/blog\/wp-json\/wp\/v2\/posts\/222\/revisions\/228"}],"wp:attachment":[{"href":"https:\/\/grummfy.be\/blog\/wp-json\/wp\/v2\/media?parent=222"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/grummfy.be\/blog\/wp-json\/wp\/v2\/categories?post=222"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/grummfy.be\/blog\/wp-json\/wp\/v2\/tags?post=222"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}