Zend_Paginator-Advanced.xml 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 14978 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.paginator.advanced">
  5. <title>Advanced usage</title>
  6. <sect2 id="zend.paginator.advanced.adapters">
  7. <title>Eigene Adapter für Quelldaten</title>
  8. <para>
  9. An irgendeinem Punkt kann es passieren das man auf einen Datentyp stößt der nicht von den
  10. mitgelieferten Adaptern abgedeckt wird. In diesem Fall muß man seinen eigenen schreiben.
  11. </para>
  12. <para>
  13. Um das zu tun, muß man <classname>Zend_Paginator_Adapter_Interface</classname> implementieren. Es gibt
  14. zwei Methoden die hierfür benötigt werden:
  15. </para>
  16. <itemizedlist>
  17. <listitem>
  18. <para>count()</para>
  19. </listitem>
  20. <listitem>
  21. <para>getItems($offset, $itemCountPerPage)</para>
  22. </listitem>
  23. </itemizedlist>
  24. <para>
  25. Zusätzlich kann es gewünscht sein einen Konstruktor zu implementieren der die Datenquelle als
  26. Parameter entgegennimmt und als geschützte oder private Eigenschaft abspeichert. Wie man das
  27. realisieren will liegt komplett in Eigenverantwortung.
  28. </para>
  29. <para>
  30. Wenn man jemals schon das SPL Interface
  31. <ulink url="http://www.php.net/~helly/php/ext/spl/interfaceCountable.html"><code>Countable</code></ulink>
  32. verwendet hat, wird man mit <code>count()</code> umgehen können. <classname>Zend_Paginator</classname> verwendet
  33. es als totale Anzahl an Elementen in der Datensammlung. Zusätzlich bietet die
  34. <classname>Zend_Paginator</classname> Instanz eine <code>countAllItems()</code> Methode die auf die
  35. <code>count()</code> Methode des Adapters weiterleitet.
  36. </para>
  37. <para>
  38. Die <code>getItems()</code> Methode ist nur etwas komplizierter. Hierfür, wird der Adapter mit einem
  39. Offset und der Anzahl an Einträgen die pro Seite dargestellt werden sollen, gefüttert. Man muß den
  40. entsprechenden Bereich an Daten zurückgeben. Für ein Array wurde das wie folgt funktionieren:
  41. </para>
  42. <para>
  43. <programlisting role="php"><![CDATA[
  44. return array_slice($this->_array, $offset, $itemCountPerPage);
  45. ]]>
  46. </programlisting>
  47. </para>
  48. <para>
  49. Man sollte einen Blick auf die mitgelieferten Adapter werfen (alle welche
  50. <classname>Zend_Paginator_Adapter_Interface</classname> implementieren) um eine Idee zu bekommen wie man das
  51. selbst implementieren könnte.
  52. </para>
  53. </sect2>
  54. <sect2 id="zend.paginator.advanced.scrolling-styles">
  55. <title>Eigene Scrolling Stile</title>
  56. <para>
  57. Das Erstellen von eigenen Scrolling Stilen erfordert das man
  58. <classname>Zend_Paginator_ScrollingStyle_Interface</classname> implementiert, welche eine eizelne Methode,
  59. <code>getPages()</code>, definiert. Speziell,
  60. </para>
  61. <para>
  62. <programlisting role="php"><![CDATA[
  63. public function getPages(Zend_Paginator $paginator, $pageRange = null);
  64. ]]>
  65. </programlisting>
  66. </para>
  67. <para>
  68. Diese Methode sollten eine untere und obere Grenze für die Seitenzahl innerhalb der sogenannten
  69. "lokalen" Seiten berechnen (das sind Seiten nahe der aktuellen Seite).
  70. </para>
  71. <para>
  72. Solange es keinen anderen Scrolling Stil erweitert (siehe zum Beispiel
  73. <classname>Zend_Paginator_ScrollingStyle_Elastic</classname>, wird der eigene Scrolling Stil üblicherweise mit
  74. etwas ähnlichem sie der folgenden Codezeile enden:
  75. </para>
  76. <para>
  77. <programlisting role="php"><![CDATA[
  78. return $paginator->getPagesInRange($lowerBound, $upperBound);
  79. ]]>
  80. </programlisting>
  81. </para>
  82. <para>
  83. Es ist nichts speziellen an diesem Aufruf; es ist mehr eine übliche Methode um die Gültigkeit der
  84. unteren und oberen Grenze zu prüfen und ein Array des Bereichs an den Paginator zurückzugeben.
  85. </para>
  86. <para>
  87. Wenn man bereit ist den neuen Scrolling Stil zu benutzen, muß man <classname>Zend_Paginator</classname>
  88. bekanntgeben in welchem Verzeichnis er nachschauen muß. Um das zu tun muß das folgende ausgeführt
  89. werden:
  90. </para>
  91. <para>
  92. <programlisting role="php"><![CDATA[
  93. $prefix = 'My_Paginator_ScrollingStyle';
  94. $path = 'My/Paginator/ScrollingStyle/';
  95. Zend_Paginator::addScrollingStylePrefixPath($prefix, $path);
  96. ]]>
  97. </programlisting>
  98. </para>
  99. </sect2>
  100. <sect2 id="zend.paginator.advanced.caching">
  101. <title>Caching features</title>
  102. <para>
  103. <classname>Zend_Paginator</classname> kann gesagt werden das es die Daten die Ihm bereits übergeben wurden,
  104. cachen soll, um zu verhindern das der Adapter sie jedes mal wenn Sie verwendet werden holen muß.
  105. Um dem Paginator zu sagen das die Daten des Adapters automatisch gecacht werden, muß der-
  106. <code>setCache()</code> Methode nur eine <classname>Zend_Cache_Core</classname> Instanz übergeben werden.
  107. </para>
  108. <para>
  109. <programlisting role="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. ]]>
  116. </programlisting>
  117. </para>
  118. <para>
  119. Sobald <classname>Zend_Paginator</classname> eine <classname>Zend_Cache_Core</classname> Instanz erhalten hat, werden Daten gecacht. Manchmal will
  120. man Daten nicht cachen selbst wenn man bereits eine Cacheinstanz übergeben hat. Man sollte dann
  121. hierfür <code>setCacheEnable()</code> verwenden.
  122. </para>
  123. <para>
  124. <programlisting role="php"><![CDATA[
  125. $paginator = Zend_Paginator::factory($someData);
  126. // $cache ist eine Zend_Cache_Core Instanz
  127. Zend_Paginator::setCache($cache);
  128. // ... später im Skript
  129. $paginator->setCacheEnable(false);
  130. // Der Cache ist nun ausgeschaltet
  131. ]]>
  132. </programlisting>
  133. </para>
  134. <para>
  135. Wenn ein Cache gesetzt ist, werden Daten automatisch in Ihm gespeichert und von Ihm herausgeholt.
  136. Es kann nützlich sein den Cache manuell zu entleeren. Das kann durch den Aufruf von
  137. <code>clearPageItemCache($pageNumber)</code> getan werden. Wenn kein Parameter übergeben wird,
  138. wird der komplette Cache entleert. Optional kann ein Parameter übergeben werden der die
  139. Seitenanzahl repräsentiert die den Cache löschen :
  140. </para>
  141. <para>
  142. <programlisting role="php"><![CDATA[
  143. $paginator = Zend_Paginator::factory($someData);
  144. Zend_Paginator::setCache($cache);
  145. $items = $paginator->getCurrentItems();
  146. // Seite 1 ist nun in Cache
  147. $page3Items = $paginator->getItemsByPage(3);
  148. // Seite 3 ist nun in Cache
  149. // Den Cache für die Ergebnisse der Seite 3 löschen
  150. $paginator->clearPageItemCache(3);
  151. // Alle Cachedaten löschen
  152. $paginator->clearPageItemCache();
  153. ]]>
  154. </programlisting>
  155. </para>
  156. <para>
  157. Das Ändern das Anzahl der Teile pro Seite wird den kompletten Cache leeren, das er ungültig
  158. geworden wäre :
  159. </para>
  160. <para>
  161. <programlisting role="php"><![CDATA[
  162. $paginator = Zend_Paginator::factory($someData);
  163. Zend_Paginator::setCache($cache);
  164. // Einige Teile holen
  165. $items = $paginator->getCurrentItems();
  166. // Alle Cachedaten werden ausgegeben :
  167. $paginator->setItemCountPerPage(2);
  168. ]]>
  169. </programlisting>
  170. </para>
  171. <para>
  172. Es ist auch möglich zu sehen welche Daten im Cache sind und direkt nach Ihnen zu fragen. Hierfür
  173. kann <code>getPageItemCache()</code> verwendet werden:
  174. </para>
  175. <para>
  176. <programlisting role="php"><![CDATA[
  177. $paginator = Zend_Paginator::factory($someData);
  178. $paginator->setItemCountPerPage(3);
  179. Zend_Paginator::setCache($cache);
  180. // Einige Teile holen
  181. $items = $paginator->getCurrentItems();
  182. $otherItems = $paginator->getItemsPerPage(4);
  183. // Die gecachten Teile als zwei-dimensionales Array sehen
  184. var_dump($paginator->getPageItemCache());
  185. ]]>
  186. </programlisting>
  187. </para>
  188. </sect2>
  189. </sect1>
  190. <!--
  191. vim:se ts=4 sw=4 et:
  192. -->