Zend_Paginator-Advanced.xml 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 24249 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.paginator.advanced">
  5. <title>Utilisation avancée</title>
  6. <sect2 id="zend.paginator.advanced.adapters">
  7. <title>Adaptateurs de source de données personnalisée</title>
  8. <para>
  9. À partir d'un moment, vous pourriez avoir besoin de parcourir un type de données
  10. qui n'est pas couvert par les adaptateurs fournis par défaut. Dans ce cas, vous devrez
  11. écrire vos propres adaptateurs.
  12. </para>
  13. <para>
  14. Pour faire ceci, vous devez implémenter
  15. <classname>Zend_Paginator_Adapter_Interface</classname>. Il existe deux méthodes
  16. requises :
  17. </para>
  18. <itemizedlist>
  19. <listitem>
  20. <para><methodname>count()</methodname></para>
  21. </listitem>
  22. <listitem>
  23. <para><methodname>getItems($offset, $itemCountPerPage)</methodname></para>
  24. </listitem>
  25. </itemizedlist>
  26. <para>
  27. De plus, vous voudrez peut-être implémenter un constructeur qui prend votre source
  28. de données comme paramètre et le stocke comme propriété protégée ou privée. La manière
  29. suivant laquelle vous allez spécifiquement faire ceci, vous incombe.
  30. </para>
  31. <para>
  32. Si vous avez déjà utilisé l'interface SPL <ulink
  33. url="http://www.php.net/~helly/php/ext/spl/interfaceCountable.html">Countable</ulink>,
  34. vous êtes familier avec <methodname>count()</methodname>. Utilisé avec
  35. <classname>Zend_Paginator</classname>, il s'agit du nombre total d'éléments dans la
  36. collection de données. De plus, l'instance <classname>Zend_Paginator</classname> fournit
  37. une méthode <methodname>countAllItems()</methodname> qui proxie vers la méthode <methodname>count()</methodname>
  38. de l'adaptateur.
  39. </para>
  40. <para>
  41. La méthode <methodname>getItems()</methodname> est seulement légèrement plus compliquée. Pour
  42. ceci, les paramètres sont un point de départ et un nombre d'éléments à afficher par
  43. page. Vous devez retourner la portion appropriée de données. Pour un tableau, il
  44. s'agirait :
  45. </para>
  46. <para>
  47. <programlisting language="php"><![CDATA[
  48. return array_slice($this->_array, $offset, $itemCountPerPage);
  49. ]]></programlisting></para>
  50. <para>
  51. Regardez les adaptateurs fournis par défaut (ils implémentent tous
  52. <classname>Zend_Paginator_Adapter_Interface</classname>) pour avoir une idée de la
  53. manière d'implémenter votre propre adaptateur.
  54. </para>
  55. </sect2>
  56. <sect2 id="zend.paginator.advanced.scrolling-styles">
  57. <title>Styles de défilement personnalisés</title>
  58. <para>
  59. Créer votre propre style de défilement requiert que vous implémentiez
  60. <classname>Zend_Paginator_ScrollingStyle_Interface</classname>, qui définit une seule
  61. méthode, <methodname>getPages()</methodname>. Et plus spécifiquement :
  62. </para>
  63. <para>
  64. <programlisting language="php"><![CDATA[
  65. public function getPages(Zend_Paginator $paginator, $pageRange = null);
  66. ]]></programlisting></para>
  67. <para>
  68. Cette méthode doit calculer des bornes inférieures et supérieures des numéros de
  69. page dans la plage des pages dites "local" (c'est-à-dire qui sont proches de la page
  70. courante).
  71. </para>
  72. <para>
  73. A moins que votre style étende un autre style de défilement (voir
  74. <classname>Zend_Paginator_ScrollingStyle_Elastic</classname> par exemple), votre style
  75. personnalisé devra inévitablement se terminer par quelque chose de similaire à ceci
  76. :
  77. </para>
  78. <para>
  79. <programlisting language="php"><![CDATA[
  80. return $paginator->getPagesInRange($lowerBound, $upperBound);
  81. ]]></programlisting></para>
  82. <para>
  83. Il n'y a rien de spécial au sujet de cet appel ; c'est simplement une méthode
  84. pratique pour vérifier la validité de la limite inférieure et supérieure et pour
  85. renvoyer un tableau de ces bornes au paginateur.
  86. </para>
  87. <para>
  88. Quand vous êtes prêt à utiliser votre style de défilement, vous devez informer
  89. <classname>Zend_Paginator</classname> dans quel dossier le chercher, en réalisant ceci
  90. :
  91. </para>
  92. <para>
  93. <programlisting language="php"><![CDATA[
  94. $prefix = 'Mon_Paginator_StyleDefilement';
  95. $path = 'Mon/Paginator/StyleDefilement/';
  96. Zend_Paginator::addScrollingStylePrefixPath($prefix, $path);
  97. ]]></programlisting></para>
  98. </sect2>
  99. <sect2 id="zend.paginator.advanced.caching">
  100. <title>Fonctionnalité de mise en cache</title>
  101. <para>
  102. <classname>Zend_Paginator</classname> peut mettre en cache les données qu'il a
  103. déjà fourni, empêchant ainsi l'adaptateur de les rechercher chaque fois qu'ils sont
  104. demandés. Pour informer le paginateur de mettre en cache automatiquement les données
  105. issues de l'adaptateur, fournissez simplement une instance de
  106. <classname>Zend_Cache_Core</classname> à sa méthode <methodname>setCache()</methodname> :
  107. </para>
  108. <para>
  109. <programlisting language="php"><![CDATA[
  110. $paginator = Zend_Paginator::factory($someData);
  111. $fO = array('lifetime' => 3600, 'automatic_serialization' => true);
  112. $bO = array('cache_dir'=>'/tmp');
  113. $cache = Zend_cache::factory('Core', 'File', $fO, $bO);
  114. Zend_Paginator::setCache($cache);
  115. ]]></programlisting></para>
  116. <para>
  117. Tant que Zend_Paginator possède une instance de Zend_Cache_Core, les données
  118. seront mises en cache. Parfois vous ne voudrez pas mettre en cache les données même si
  119. vous avez déjà fourni un instance de cache. Vous pourrez alors utiliser la méthode
  120. <methodname>setCacheEnable()</methodname> :
  121. </para>
  122. <para>
  123. <programlisting language="php"><![CDATA[
  124. $paginator = Zend_Paginator::factory($someData);
  125. // $cache est une instance de Zend_Cache_Core
  126. Zend_Paginator::setCache($cache);
  127. // ... plus loin dans le script
  128. $paginator->setCacheEnable(false);
  129. // le cache est maintenant désactivé
  130. ]]></programlisting></para>
  131. <para>
  132. Quand un cache est paramétré, les données y sont automatiquement stockées et
  133. extraites. Il peut alors être utile de vider le cache manuellement. Vous pouvez réaliser
  134. ceci en appelant <methodname>clearPageItemCache($pageNumber)</methodname>. Si vous ne passer aucun
  135. paramètre, le cache entier sera vidé. Vous pouvez fournir optionnellement un paramètre
  136. représentant le numéro de page à enlever du cache :
  137. </para>
  138. <para>
  139. <programlisting language="php"><![CDATA[
  140. $paginator = Zend_Paginator::factory($someData);
  141. Zend_Paginator::setCache($cache);
  142. $items = $paginator->getCurrentItems();
  143. // la page 1 est maintenant en cache
  144. $page3Items = $paginator->getItemsByPage(3);
  145. // la page 3 est maintenant en cache
  146. // effacer le cache associé à la page 3
  147. $paginator->clearPageItemCache(3);
  148. // effacer tout le cache
  149. $paginator->clearPageItemCache();
  150. ]]></programlisting></para>
  151. <para>
  152. Changer le nombre d'éléments par page videra tout le cache comme s'il était devenu
  153. invalide :
  154. </para>
  155. <para>
  156. <programlisting language="php"><![CDATA[
  157. $paginator = Zend_Paginator::factory($someData);
  158. Zend_Paginator::setCache($cache);
  159. // récupérer des éléments
  160. $items = $paginator->getCurrentItems();
  161. // toutes les données vont être effacées du cache :
  162. $paginator->setItemCountPerPage(2);
  163. ]]></programlisting></para>
  164. <para>
  165. Il est aussi possible de voir les données en cache et de les appeler directement
  166. grâce à la méthode <methodname>getPageItemCache()</methodname> :
  167. </para>
  168. <para>
  169. <programlisting language="php"><![CDATA[
  170. $paginator = Zend_Paginator::factory($someData);
  171. $paginator->setItemCountPerPage(3);
  172. Zend_Paginator::setCache($cache);
  173. // récupérer des éléments
  174. $items = $paginator->getCurrentItems();
  175. $otherItems = $paginator->getItemsPerPage(4);
  176. // voir ces éléments sous la forme d'un tableau à 2-dimensions :
  177. var_dump($paginator->getPageItemCache());
  178. ]]></programlisting>
  179. </para>
  180. </sect2>
  181. <sect2 id="zend.paginator.advanced.aggregator">
  182. <title>Zend_Paginator_AdapterAggregate Interface</title>
  183. <para>
  184. Depending on your application you might want to paginate objects, whose internal data-structure
  185. is equal to existing adapters, but you don't want to break up your encapsulation to allow access
  186. to this data. In other cases an object might be in a "has-an adapter" relationship, rather than
  187. the "is-an adapter" relationsship that <classname>Zend_Paginator_Adapter_Abstract</classname> promotes.
  188. For this cases you can use the <classname>Zend_Paginator_AdapterAggregate</classname> interface that
  189. behaves much like the <classname>IteratorAggregate</classname> interface of the PHP SPL extension.
  190. </para>
  191. <para>
  192. <programlisting language="php"><![CDATA[
  193. interface Zend_Paginator_AdapterAggregate
  194. {
  195. /**
  196. * Return a fully configured Paginator Adapter from this method.
  197. *
  198. * @return Zend_Paginator_Adapter_Abstract
  199. */
  200. public function getPaginatorAdapter();
  201. }
  202. ]]></programlisting>
  203. </para>
  204. <para>
  205. The interface is fairly small and only expects you to return an instance of
  206. <classname>Zend_Paginator_Adapter_Abstract</classname>. An Adapter Aggregate instance is
  207. then recognized by both <methodname>Zend_Paginator::factory()</methodname> and the
  208. constructor of <classname>Zend_Paginator</classname> and handled accordingly.
  209. </para>
  210. </sect2>
  211. </sect1>