Zend_Paginator-Advanced.xml 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!-- EN-Revision: 13836 -->
  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>À partir d'un moment, vous pourriez avoir besoin de parcourir un type de données qui n'est pas couvert par
  9. les adaptateurs fournis par défaut. Dans ce cas, vous devrez écrire vos propres adaptateurs.</para>
  10. <para>Pour faire ceci, vous devez implémenter <classname>Zend_Paginator_Adapter_Interface</classname>. Il existe deux
  11. méthodes requises :</para>
  12. <itemizedlist>
  13. <listitem>
  14. <para><code>count()</code></para>
  15. </listitem>
  16. <listitem>
  17. <para><code>getItems($offset, $itemCountPerPage)</code></para>
  18. </listitem>
  19. </itemizedlist>
  20. <para>De plus, vous voudrez peut-être implémenter un constructeur qui prend votre source de données comme
  21. paramètre et le stocke comme propriété protégée ou privée. La manière suivant laquelle vous allez spécifiquement
  22. faire ceci, vous incombe.</para>
  23. <para>Si vous avez déjà utilisé l'interface SPL <ulink
  24. url="http://www.php.net/~helly/php/ext/spl/interfaceCountable.html"><code>Countable</code></ulink>, vous êtes
  25. familier avec <code>count()</code>. Utilisé avec <classname>Zend_Paginator</classname>, il s'agit du nombre total
  26. d'éléments dans la collection de données. De plus, l'instance <classname>Zend_Paginator</classname> fournit une méthode
  27. <code>countAllItems()</code> qui proxie vers la méthode <code>count()</code> de l'adaptateur.</para>
  28. <para>La méthode <code>getItems()</code> est seulement légèrement plus compliquée. Pour ceci, les paramètres
  29. sont un point de départ et un nombre d'éléments à afficher par page. Vous devez retourner la portion appropriée
  30. de données. Pour un tableau, il s'agirait :</para>
  31. <para><programlisting role="php"><![CDATA[
  32. return array_slice($this->_array, $offset, $itemCountPerPage);
  33. ]]></programlisting></para>
  34. <para>Regardez les adaptateurs fournis par défaut (ils implémentent tous
  35. <classname>Zend_Paginator_Adapter_Interface</classname>) pour avoir une idée de la manière d'implémenter votre propre
  36. adaptateur.</para>
  37. </sect2>
  38. <sect2 id="zend.paginator.advanced.scrolling-styles">
  39. <title>Styles de défilement personnalisés</title>
  40. <para>Créer votre propre style de défilement requiert que vous implémentiez
  41. <classname>Zend_Paginator_ScrollingStyle_Interface</classname>, qui définit une seule méthode, <code>getPages()</code>. Et
  42. plus spécifiquement :</para>
  43. <para><programlisting role="php"><![CDATA[
  44. public function getPages(Zend_Paginator $paginator, $pageRange = null);
  45. ]]></programlisting></para>
  46. <para>Cette méthode doit calculer des bornes inférieures et supérieures des numéros de page dans la plage des
  47. pages dites "local" (c'est-à-dire qui sont proches de la page courante).</para>
  48. <para>A moins que votre style étende un autre style de défilement (voir
  49. <classname>Zend_Paginator_ScrollingStyle_Elastic</classname> par exemple), votre style personnalisé devra inévitablement
  50. se terminer par quelque chose de similaire à ceci :</para>
  51. <para><programlisting role="php"><![CDATA[
  52. return $paginator->getPagesInRange($lowerBound, $upperBound);
  53. ]]></programlisting></para>
  54. <para>Il n'y a rien de spécial au sujet de cet appel ; c'est simplement une méthode pratique pour vérifier la
  55. validité de la limite inférieure et supérieure et pour renvoyer un tableau de ces bornes au paginateur.</para>
  56. <para>Quand vous êtes prêt à utiliser votre style de défilement, vous devez informer <classname>Zend_Paginator</classname>
  57. dans quel dossier le chercher, en réalisant ceci :</para>
  58. <para><programlisting role="php"><![CDATA[
  59. $prefix = 'Mon_Paginator_StyleDefilement';
  60. $path = 'Mon/Paginator/StyleDefilement/';
  61. Zend_Paginator::addScrollingStylePrefixPath($prefix, $path);
  62. ]]></programlisting></para>
  63. </sect2>
  64. <sect2 id="zend.paginator.advanced.caching">
  65. <title>Fonctionnalité de mise en cache</title>
  66. <para><classname>Zend_Paginator</classname> peut mettre en cache les données qu'il a déjà fourni, empêchant ainsi
  67. l'adaptateur de les rechercher chaque fois qu'ils sont demandés. Pour informer le paginateur de mettre en cache
  68. automatiquement les données issues de l'adaptateur, fournissez simplement une instance de
  69. <classname>Zend_Cache_Core</classname> à sa méthode <code>setCache()</code> :</para>
  70. <para><programlisting role="php"><![CDATA[
  71. $paginator = Zend_Paginator::factory($someData);
  72. $fO = array('lifetime' => 3600, 'automatic_serialization' => true);
  73. $bO = array('cache_dir'=>'/tmp');
  74. $cache = Zend_cache::factory('Core', 'File', $fO, $bO);
  75. Zend_Paginator::setCache($cache);
  76. ]]></programlisting></para>
  77. <para>Tant que Zend_Paginator possède une instance de Zend_Cache_Core, les données seront mises en cache.
  78. Parfois vous ne voudrez pas mettre en cache les données même si vous avez déjà fourni un instance de cache. Vous
  79. pourrez alors utiliser la méthode <code>setCacheEnable()</code> :</para>
  80. <para><programlisting role="php"><![CDATA[
  81. $paginator = Zend_Paginator::factory($someData);
  82. // $cache est une instance de Zend_Cache_Core
  83. Zend_Paginator::setCache($cache);
  84. // ... plus loin dans le script
  85. $paginator->setCacheEnable(false);
  86. // le cache est maintenant désactivé
  87. ]]></programlisting></para>
  88. <para>Quand un cache est paramétré, les données y sont automatiquement stockées et extraites. Il peut alors être
  89. utile de vider le cache manuellement. Vous pouvez réaliser ceci en appelant
  90. <code>clearPageItemCache($pageNumber)</code>. Si vous ne passer aucun paramètre, le cache entier sera vidé. Vous
  91. pouvez fournir optionnellement un paramètre représentant le numéro de page à enlever du cache :</para>
  92. <para><programlisting role="php"><![CDATA[
  93. $paginator = Zend_Paginator::factory($someData);
  94. Zend_Paginator::setCache($cache);
  95. $items = $paginator->getCurrentItems();
  96. // la page 1 est maintenant en cache
  97. $page3Items = $paginator->getItemsByPage(3);
  98. // la page 3 est maintenant en cache
  99. // effacer le cache associé à la page 3
  100. $paginator->clearPageItemCache(3);
  101. // effacer tout le cache
  102. $paginator->clearPageItemCache();
  103. ]]></programlisting></para>
  104. <para>Changer le nombre d'éléments par page videra tout le cache comme s'il était devenu invalide :</para>
  105. <para><programlisting role="php"><![CDATA[
  106. $paginator = Zend_Paginator::factory($someData);
  107. Zend_Paginator::setCache($cache);
  108. // récupérer des éléments
  109. $items = $paginator->getCurrentItems();
  110. // toutes les données vont être effacées du cache :
  111. $paginator->setItemCountPerPage(2);
  112. ]]></programlisting></para>
  113. <para>Il est aussi possible de voir les données en cache et de les appeler directement grâce à la méthode
  114. <code>getPageItemCache()</code> :</para>
  115. <para><programlisting role="php"><![CDATA[
  116. $paginator = Zend_Paginator::factory($someData);
  117. $paginator->setItemCountPerPage(3);
  118. Zend_Paginator::setCache($cache);
  119. // récupérer des éléments
  120. $items = $paginator->getCurrentItems();
  121. $otherItems = $paginator->getItemsPerPage(4);
  122. // voir ces éléments sous la forme d'un tableau à 2-dimensions :
  123. var_dump($paginator->getPageItemCache());
  124. ]]></programlisting></para>
  125. </sect2>
  126. </sect1>