Zend_Paginator-Usage.xml 21 KB

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