Zend_Paginator-Usage.xml 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506
  1. <!-- EN-Revision: 13836 -->
  2. <sect1 id="zend.paginator.usage">
  3. <title>Utilisation</title>
  4. <sect2 id="zend.paginator.usage.paginating">
  5. <title>Paginer des collections de données</title>
  6. <para>Afin de pouvoir paginer des éléments, <classname>Zend_Paginator</classname> doit posséder une manière générique
  7. d'accéder aux sources de données. De ce fait, tous les accès aux données se font via des adaptateurs de sources.
  8. Plusieurs adaptateurs existent par défaut :</para>
  9. <table id="zend.paginator.usage.paginating.adapters">
  10. <title>Adaptateurs pour <classname>Zend_Paginator</classname></title>
  11. <tgroup cols="2">
  12. <thead>
  13. <row>
  14. <entry>Adaptateur</entry>
  15. <entry>Description</entry>
  16. </row>
  17. </thead>
  18. <tbody>
  19. <row>
  20. <entry><code>Array</code></entry>
  21. <entry>Utilise un tableau PHP</entry>
  22. </row>
  23. <row>
  24. <entry><code>DbSelect</code></entry>
  25. <entry>Utilise une instance de <link linkend="zend.db.select"><classname>Zend_Db_Select</classname></link>
  26. qui retourne un tableau</entry>
  27. </row>
  28. <row>
  29. <entry><code>DbTableSelect</code></entry>
  30. <entry>Utilise une instance <link
  31. linkend="zend.db.table.fetch-all"><classname>Zend_Db_Table_Select</classname></link>, qui retournera une
  32. instance de <classname>Zend_Db_Table_Rowset_Abstract</classname>. Ceci fournit aussi des informations
  33. supplémentaires sur le jeu de résultats, tel que les noms de colonne.</entry>
  34. </row>
  35. <row>
  36. <entry><code>Iterator</code></entry>
  37. <entry>Utilise une instance implémentant <ulink
  38. url="http://www.php.net/~helly/php/ext/spl/interfaceIterator.html"><code>Iterator</code></ulink></entry>
  39. </row>
  40. <row>
  41. <entry><code>Null</code></entry>
  42. <entry>N'utilise pas <classname>Zend_Paginator</classname> pour la pagination. En revanche, les options et
  43. capacités de contrôle de la pagination restent disponibles.</entry>
  44. </row>
  45. </tbody>
  46. </tgroup>
  47. </table>
  48. <note>
  49. <para>Plutôt que de sélectionner chaque ligne correspondant à une requête fournie, les adaptateurs
  50. <code>DbSelect</code> et <code>DbTableSelect</code> récupèrent seulement la quantité de données nécessaire
  51. pour l'affichage de la page courante.</para>
  52. <para>A cause de ceci, une seconde requête est générée dynamiquement pour déterminer le nombre total de
  53. lignes correspondantes. Cependant, il est possible de directement fournir un nombre ou un requête de
  54. dénombrement vous-même. Regardez la méthode <code>setRowCount()</code> de l'adaptateur <code>DbSelect</code>
  55. pour de plus amples informations.</para>
  56. </note>
  57. <para>Pour créer une instance de <classname>Zend_Paginator</classname>, vous devez spécifier un adaptateur à son
  58. constructeur:</para>
  59. <para><programlisting role="php"><![CDATA[
  60. $paginator = new Zend_Paginator(new Zend_Paginator_Adapter_Array($array));
  61. ]]></programlisting></para>
  62. <para>Pour une meilleure intégration, vous pouvez utiliser la fabrique <code>factory()</code>:</para>
  63. <para><programlisting role="php"><![CDATA[
  64. $paginator = Zend_Paginator::factory($array);
  65. ]]></programlisting></para>
  66. <note>
  67. <para>Pour l'adaptateur <code>Null</code>, il faut spécifier un chiffre à son constructeur en lieu et place
  68. de la collection de données.</para>
  69. </note>
  70. <para>Bien que l'instance soit techniquement utilisable dans l'état, dans votre contrôleur d'action vous devrez
  71. informer le paginateur du numéro de page demandé par l'utilisateur. Ceci lui permet d'avancer à travers les
  72. données paginées.</para>
  73. <para><programlisting role="php"><![CDATA[
  74. $paginator->setCurrentPageNumber($page);
  75. ]]></programlisting></para>
  76. <para>La manière la plus simple de suivre et scruter cette valeur est via l'URL. Nous recommandons l'utilisation
  77. d'un routeur compatible avec <classname>Zend_Controller_Router_Interface</classname>, mais ceci n'est pas
  78. nécessaire.</para>
  79. <para>Voici une route que vous pourriez définir dans un fichier de configuration INI:</para>
  80. <para><programlisting role="php"><![CDATA[
  81. routes.example.route = articles/:articleName/:page
  82. routes.example.defaults.controller = articles
  83. routes.example.defaults.action = view
  84. routes.example.defaults.page = 1
  85. routes.example.reqs.articleName = \w+
  86. routes.example.reqs.page = \d+
  87. ]]></programlisting></para>
  88. <para>Avec une telle route (et en utilisant les composants MVC de Zend Framework), vous pourriez spécifier le
  89. numéro de la page de cette manière :</para>
  90. <para><programlisting role="php"><![CDATA[
  91. $paginator->setCurrentPageNumber($this->_getParam('page'));
  92. ]]></programlisting></para>
  93. <para>Il y a d'autres options disponibles, voyez <link linkend="zend.paginator.configuration">la
  94. configuration</link> pour plus de détails.</para>
  95. <para>Enfin, il faut passer l'instance du paginateur à votre vue. Si vous utilisez <classname>Zend_View</classname> avec
  96. l'aide d'action <code>ViewRenderer</code>, ceci fonctionnera :</para>
  97. <para><programlisting role="php"><![CDATA[
  98. $this->view->paginator = $paginator;
  99. ]]></programlisting></para>
  100. </sect2>
  101. <sect2 id="zend.paginator.rendering">
  102. <title>Rendre des pages avec les scripts de vue</title>
  103. <para>Le script de vue va être utilisé pour rendre les éléments de la page (bien sûr si
  104. <classname>Zend_Paginator</classname> est utilisé à cet effet), et pour afficher les éléments relatifs au contrôle de la
  105. pagination.</para>
  106. <para>Comme <classname>Zend_Paginator</classname> implémente l'interface SPL <ulink
  107. url="http://www.php.net/~helly/php/ext/spl/interfaceIteratorAggregate.html"><code>IteratorAggregate</code></ulink>,
  108. boucler sur les éléments et les afficher est très simple.</para>
  109. <para><programlisting role="php"><![CDATA[
  110. <html>
  111. <body>
  112. <h1>Example</h1>
  113. <?php if (count($this->paginator)): ?>
  114. <ul>
  115. <?php foreach ($this->paginator as $item): ?>
  116. <li><?= $item; ?></li>
  117. <?php endforeach; ?>
  118. </ul>
  119. <?php endif; ?>
  120. <?= $this->paginationControl($this->paginator, 'Sliding', 'my_pagination_control.phtml'); ?>
  121. </body>
  122. </html>
  123. ]]></programlisting></para>
  124. <para>Notez l'appel à l'aide de vue en fin de script. <code>PaginationControl</code> accepte jusqu'à quatre
  125. paramètres : l'instance du paginateur, un type de défilement (optionnel), un partial de vue (optionnel) et un
  126. tableau de paramètres additionnels.</para>
  127. <para>Les second et troisième paramètres sont très importants. Alors que le partial est utiliser pour déterminer
  128. comment <emphasis>présenter</emphasis> les données, le type de défilement définira la manière dont ils se
  129. <emphasis>comportent</emphasis>. Disons que le partial ressemble à un contrôle de recherche, comme ce qui suit
  130. :</para>
  131. <para><inlinegraphic align="center" fileref="figures/zend.paginator.usage.rendering.control.png" format="PNG"
  132. valign="middle" /></para>
  133. <para>Que se passe-t-il lorsque l'utilisateur clique sur le lien "next" quelques fois? Plusieurs choses peuvent
  134. arriver. Le numéro de la page courante pourrait rester au milieu (comme c'est le cas sur Yahoo!), ou il pourrait
  135. aussi bien avancer à la fin de la fourchette des pages et apparaître encore à gauche lorsque l'utilisateur
  136. clique alors sur "next". Le nombre de pages pourrait alors s'étendre ou se comprimer alors que l'utilisateur
  137. avance ("scroll") à travers (comme chez Google).</para>
  138. <para>Il existe 4 types de défilement intégrés dans Zend Framework :</para>
  139. <table id="zend.paginator.usage.rendering.scrolling-styles">
  140. <title>Types de défilement pour <classname>Zend_Paginator</classname></title>
  141. <tgroup cols="2">
  142. <thead>
  143. <row>
  144. <entry>Type de défilement</entry>
  145. <entry>Description</entry>
  146. </row>
  147. </thead>
  148. <tbody>
  149. <row>
  150. <entry>All</entry>
  151. <entry>Retourne toutes les pages. Très pratique lorsqu'il y a peu de pages totales.</entry>
  152. </row>
  153. <row>
  154. <entry>Elastic</entry>
  155. <entry>Un défilement de type Google qui s'étend et se contracte au fur et à mesure que
  156. l'utilisateur avance dans les pages de résultats.</entry>
  157. </row>
  158. <row>
  159. <entry>Jumping</entry>
  160. <entry>Alors que l'utilisateur défile, le nombre de pages avance à la fin d'une échelle donnée,
  161. puis recommence au début de l'échelle suivante.</entry>
  162. </row>
  163. <row>
  164. <entry>Sliding</entry>
  165. <entry>Un défilement de type Yahoo! qui positionne la page en cours au centre d'une échelle de
  166. pages, le plus justement et près possible. Ce type de défilement est le type par défaut.</entry>
  167. </row>
  168. </tbody>
  169. </tgroup>
  170. </table>
  171. <para>Le quatrième et dernier paramètre est réservé pour un tableau associatif optionnel de variables
  172. supplémentaires que vous voulez rendre disponible dans vos partiels de vues (disponible via <code>$this</code>).
  173. Par exemple, ces valeurs permettent d'inclure des paramètres d'URL supplémentaires pour les liens de
  174. pagination.</para>
  175. <para>En spécifiant le partial de vue par défaut, le défilement et l'instance de vue, vous pouvez alors vous
  176. affranchir totalement des appels à <code>PaginationControl</code> :</para>
  177. <para><programlisting role="php"><![CDATA[
  178. Zend_Paginator::setDefaultScrollingStyle('Sliding');
  179. Zend_View_Helper_PaginationControl::setDefaultViewPartial(
  180. 'my_pagination_control.phtml'
  181. );
  182. $paginator->setView($view);
  183. ]]></programlisting></para>
  184. <para>Utilisez dès lors un simple <code>echo</code> dans le script de vue pour le rendu du paginateur
  185. complet:</para>
  186. <para><programlisting role="php"><![CDATA[
  187. <?= $this->paginator; ?>
  188. ]]></programlisting></para>
  189. <note>
  190. <para>Bien sûr, il est possible d'utiliser Zend_paginator avec d'autres moteurs de templates. Par exemple,
  191. avec Smarty vous pourriez faire ceci :</para>
  192. <para><programlisting role="php"><![CDATA[
  193. $smarty->assign('pages', $paginator->getPages());
  194. ]]></programlisting></para>
  195. <para>Vous pouvez ainsi accéder aux valeurs du paginateur grâce à un template comme ceci :</para>
  196. <para><programlisting role="php"><![CDATA[
  197. {$pages.pageCount}
  198. ]]></programlisting></para>
  199. </note>
  200. <sect3 id="zend.paginator.usage.rendering.example-controls">
  201. <title>Exemples de contrôles de pagination</title>
  202. <para>Voici quelques exemples qui vous aideront à démarrer avec le paginateur:</para>
  203. <para>Pagination de recherche :<programlisting role="php"><![CDATA[
  204. <!--
  205. Voir http://developer.yahoo.com/ypatterns/pattern.php?pattern=searchpagination
  206. -->
  207. <?php if ($this->pageCount): ?>
  208. <div class="paginationControl">
  209. <!-- Previous page link -->
  210. <?php if (isset($this->previous)): ?>
  211. <a href="<?= $this->url(array('page' => $this->previous)); ?>">
  212. &lt; Previous
  213. </a> |
  214. <?php else: ?>
  215. <span class="disabled">&lt; Previous</span> |
  216. <?php endif; ?>
  217. <!-- Numbered page links -->
  218. <?php foreach ($this->pagesInRange as $page): ?>
  219. <?php if ($page != $this->current): ?>
  220. <a href="<?= $this->url(array('page' => $page)); ?>"><?= $page; ?></a> |
  221. <?php else: ?>
  222. <?= $page; ?> |
  223. <?php endif; ?>
  224. <?php endforeach; ?>
  225. <!-- Next page link -->
  226. <?php if (isset($this->next)): ?>
  227. <a href="<?= $this->url(array('page' => $this->next)); ?>">Next &gt;</a>
  228. <?php else: ?>
  229. <span class="disabled">Next &gt;</span>
  230. <?php endif; ?>
  231. </div>
  232. <?php endif; ?>
  233. ]]></programlisting></para>
  234. <para>Pagination d'objets :<programlisting role="php"><![CDATA[
  235. <!--
  236. Voir http://developer.yahoo.com/ypatterns/pattern.php?pattern=itempagination
  237. -->
  238. <?php if ($this->pageCount): ?>
  239. <div class="paginationControl">
  240. <?= $this->firstItemNumber; ?> - <?= $this->lastItemNumber; ?>
  241. of <?= $this->totalItemCount; ?>
  242. <!-- First page link -->
  243. <?php if (isset($this->previous)): ?>
  244. <a href="<?= $this->url(array('page' => $this->first)); ?>">First</a> |
  245. <?php else: ?>
  246. <span class="disabled">First</span> |
  247. <?php endif; ?>
  248. <!-- Previous page link -->
  249. <?php if (isset($this->previous)): ?>
  250. <a href="<?= $this->url(array('page' => $this->previous)); ?>">
  251. &lt; Previous
  252. </a> |
  253. <?php else: ?>
  254. <span class="disabled">&lt; Previous</span> |
  255. <?php endif; ?>
  256. <!-- Next page link -->
  257. <?php if (isset($this->next)): ?>
  258. <a href="<?= $this->url(array('page' => $this->next)); ?>">Next &gt;</a> |
  259. <?php else: ?>
  260. <span class="disabled">Next &gt;</span> |
  261. <?php endif; ?>
  262. <!-- Last page link -->
  263. <?php if (isset($this->next)): ?>
  264. <a href="<?= $this->url(array('page' => $this->last)); ?>">Last</a>
  265. <?php else: ?>
  266. <span class="disabled">Last</span>
  267. <?php endif; ?>
  268. </div>
  269. <?php endif; ?>
  270. ]]></programlisting></para>
  271. <para>Pagination Dropdown :<programlisting role="php"><![CDATA[
  272. <?php if ($this->pageCount): ?>
  273. <select id="paginationControl" size="1">
  274. <?php foreach ($this->pagesInRange as $page): ?>
  275. <?php $selected = ($page == $this->current) ? ' selected="selected"' : ''; ?>
  276. <option value="<?= $this->url(array('page' => $page)); ?>"<?= $selected ?>>
  277. <?= $page; ?>
  278. </option>
  279. <?php endforeach; ?>
  280. </select>
  281. <?php endif; ?>
  282. <script type="text/javascript"
  283. src="http://ajax.googleapis.com/ajax/libs/prototype/1.6.0.2/prototype.js">
  284. </script>
  285. <script type="text/javascript">
  286. $('paginationControl').observe('change', function() {
  287. window.location = this.options[this.selectedIndex].value;
  288. })
  289. </script>
  290. ]]></programlisting></para>
  291. </sect3>
  292. <sect3 id="zend.paginator.usage.rendering.properties">
  293. <title>Liste des propriétés</title>
  294. <para>Les options suivantes sont disponibles pour contrôler la pagination dans les partials de vue :</para>
  295. <table id="zend.paginator.usage.rendering.properties.table">
  296. <title>Propriétés disponibles aux partials de vue</title>
  297. <tgroup cols="3">
  298. <thead>
  299. <row>
  300. <entry>Propriété</entry>
  301. <entry>Type</entry>
  302. <entry>Description</entry>
  303. </row>
  304. </thead>
  305. <tbody>
  306. <row>
  307. <entry>first</entry>
  308. <entry>entier</entry>
  309. <entry>Numéro de la première page</entry>
  310. </row>
  311. <row>
  312. <entry>firstItemNumber</entry>
  313. <entry>entier</entry>
  314. <entry>Numéro absolu du premier objet(item) dans cette page</entry>
  315. </row>
  316. <row>
  317. <entry>firstPageInRange</entry>
  318. <entry>entier</entry>
  319. <entry>Première page dans l'échelle retournée par le type de défilement</entry>
  320. </row>
  321. <row>
  322. <entry>current</entry>
  323. <entry>entier</entry>
  324. <entry>Numéro de la page en cours</entry>
  325. </row>
  326. <row>
  327. <entry>currentItemCount</entry>
  328. <entry>entier</entry>
  329. <entry>Nombre d'objets sur cette page</entry>
  330. </row>
  331. <row>
  332. <entry>itemCountPerPage</entry>
  333. <entry>integer</entry>
  334. <entry>Nombre d'objets maximum à afficher par page</entry>
  335. </row>
  336. <row>
  337. <entry>last</entry>
  338. <entry>entier</entry>
  339. <entry>Numéro de la dernière page</entry>
  340. </row>
  341. <row>
  342. <entry>lastItemNumber</entry>
  343. <entry>entier</entry>
  344. <entry>Numéro absolu du dernier objet sur cette page</entry>
  345. </row>
  346. <row>
  347. <entry>lastPageInRange</entry>
  348. <entry>entier</entry>
  349. <entry>Dernière page dans l'échelle retournée par le type de défilement</entry>
  350. </row>
  351. <row>
  352. <entry>next</entry>
  353. <entry>entier</entry>
  354. <entry>Numéro de la page suivante</entry>
  355. </row>
  356. <row>
  357. <entry>pageCount</entry>
  358. <entry>entier</entry>
  359. <entry>Nombre de pages</entry>
  360. </row>
  361. <row>
  362. <entry>pagesInRange</entry>
  363. <entry>tableau (array)</entry>
  364. <entry>Tableau des pages retournées par le type de défilement</entry>
  365. </row>
  366. <row>
  367. <entry>previous</entry>
  368. <entry>entier</entry>
  369. <entry>Numéro de la page précédente</entry>
  370. </row>
  371. <row>
  372. <entry>totalItemCount</entry>
  373. <entry>entier</entry>
  374. <entry>Nombre total d'objets</entry>
  375. </row>
  376. </tbody>
  377. </tgroup>
  378. </table>
  379. </sect3>
  380. </sect2>
  381. </sect1>