Zend_Paginator-Advanced.xml 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 17632 -->
  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
  10. den mitgelieferten Adaptern abgedeckt wird. In diesem Fall muß man seinen eigenen
  11. schreiben.
  12. </para>
  13. <para>
  14. Um das zu tun, muß man <classname>Zend_Paginator_Adapter_Interface</classname>
  15. implementieren. Es gibt zwei Methoden die hierfür benötigt werden:
  16. </para>
  17. <itemizedlist>
  18. <listitem>
  19. <para>count()</para>
  20. </listitem>
  21. <listitem>
  22. <para>getItems($offset, $itemCountPerPage)</para>
  23. </listitem>
  24. </itemizedlist>
  25. <para>
  26. Zusätzlich kann es gewünscht sein einen Konstruktor zu implementieren der die
  27. Datenquelle als Parameter entgegennimmt und als geschützte oder private Eigenschaft
  28. abspeichert. Wie man das realisieren will liegt komplett in Eigenverantwortung.
  29. </para>
  30. <para>
  31. Wenn man jemals schon das SPL Interface <ulink
  32. url="http://www.php.net/~helly/php/ext/spl/interfaceCountable.html">
  33. <code>Countable</code></ulink> verwendet hat, wird man mit
  34. <methodname>count()</methodname> umgehen können. <classname>Zend_Paginator</classname>
  35. verwendet es als totale Anzahl an Elementen in der Datensammlung. Zusätzlich bietet die
  36. <classname>Zend_Paginator</classname> Instanz eine
  37. <methodname>countAllItems()</methodname> Methode die auf die
  38. <methodname>count()</methodname> Methode des Adapters weiterleitet.
  39. </para>
  40. <para>
  41. Die <methodname>getItems()</methodname> Methode ist nur etwas komplizierter. Hierfür,
  42. wird der Adapter mit einem Offset und der Anzahl an Einträgen die pro Seite dargestellt
  43. werden sollen, gefüttert. Man muß den entsprechenden Bereich an Daten zurückgeben. Für
  44. ein Array wurde das wie folgt funktionieren:
  45. </para>
  46. <para>
  47. <programlisting language="php"><![CDATA[
  48. return array_slice($this->_array, $offset, $itemCountPerPage);
  49. ]]></programlisting>
  50. </para>
  51. <para>
  52. Man sollte einen Blick auf die mitgelieferten Adapter werfen (alle welche
  53. <classname>Zend_Paginator_Adapter_Interface</classname> implementieren) um eine Idee zu
  54. bekommen wie man das selbst implementieren könnte.
  55. </para>
  56. </sect2>
  57. <sect2 id="zend.paginator.advanced.scrolling-styles">
  58. <title>Eigene Scrolling Stile</title>
  59. <para>
  60. Das Erstellen von eigenen Scrolling Stilen erfordert das man
  61. <classname>Zend_Paginator_ScrollingStyle_Interface</classname> implementiert, welche
  62. eine einzelne Methode, <methodname>getPages()</methodname>, definiert. Speziell,
  63. </para>
  64. <para>
  65. <programlisting language="php"><![CDATA[
  66. public function getPages(Zend_Paginator $paginator, $pageRange = null);
  67. ]]></programlisting>
  68. </para>
  69. <para>
  70. Diese Methode sollten eine untere und obere Grenze für die Seitenzahl innerhalb der
  71. sogenannten "lokalen" Seiten berechnen (das sind Seiten nahe der aktuellen Seite).
  72. </para>
  73. <para>
  74. Solange es keinen anderen Scrolling Stil erweitert (siehe zum Beispiel
  75. <classname>Zend_Paginator_ScrollingStyle_Elastic</classname>, wird der eigene Scrolling
  76. Stil üblicherweise mit etwas ähnlichem sie der folgenden Codezeile enden:
  77. </para>
  78. <para>
  79. <programlisting language="php"><![CDATA[
  80. return $paginator->getPagesInRange($lowerBound, $upperBound);
  81. ]]></programlisting>
  82. </para>
  83. <para>
  84. Es ist nichts speziellen an diesem Aufruf; es ist mehr eine übliche Methode um die
  85. Gültigkeit der unteren und oberen Grenze zu prüfen und ein Array des Bereichs an den
  86. Paginator zurückzugeben.
  87. </para>
  88. <para>
  89. Wenn man bereit ist den neuen Scrolling Stil zu benutzen, muß man
  90. <classname>Zend_Paginator</classname> bekanntgeben in welchem Verzeichnis er nachschauen
  91. muß. Um das zu tun muß das folgende ausgeführt werden:
  92. </para>
  93. <para>
  94. <programlisting language="php"><![CDATA[
  95. $prefix = 'My_Paginator_ScrollingStyle';
  96. $path = 'My/Paginator/ScrollingStyle/';
  97. Zend_Paginator::addScrollingStylePrefixPath($prefix, $path);
  98. ]]></programlisting>
  99. </para>
  100. </sect2>
  101. <sect2 id="zend.paginator.advanced.caching">
  102. <title>Caching features</title>
  103. <para>
  104. <classname>Zend_Paginator</classname> kann gesagt werden das es die Daten die Ihm
  105. bereits übergeben wurden, cachen soll, um zu verhindern das der Adapter sie jedes mal
  106. wenn Sie verwendet werden holen muß. Um dem Paginator zu sagen das die Daten des
  107. Adapters automatisch gecacht werden, muß der- <methodname>setCache()</methodname>
  108. Methode nur eine <classname>Zend_Cache_Core</classname> Instanz übergeben werden.
  109. </para>
  110. <para>
  111. <programlisting language="php"><![CDATA[
  112. $paginator = Zend_Paginator::factory($someData);
  113. $fO = array('lifetime' => 3600, 'automatic_serialization' => true);
  114. $bO = array('cache_dir'=>'/tmp');
  115. $cache = Zend_cache::factory('Core', 'File', $fO, $bO);
  116. Zend_Paginator::setCache($cache);
  117. ]]></programlisting>
  118. </para>
  119. <para>
  120. Sobald <classname>Zend_Paginator</classname> eine <classname>Zend_Cache_Core</classname>
  121. Instanz erhalten hat, werden Daten gecacht. Manchmal will man Daten nicht cachen selbst
  122. wenn man bereits eine Cacheinstanz übergeben hat. Man sollte dann hierfür
  123. <methodname>setCacheEnable()</methodname> verwenden.
  124. </para>
  125. <para>
  126. <programlisting language="php"><![CDATA[
  127. $paginator = Zend_Paginator::factory($someData);
  128. // $cache ist eine Zend_Cache_Core Instanz
  129. Zend_Paginator::setCache($cache);
  130. // ... später im Skript
  131. $paginator->setCacheEnable(false);
  132. // Der Cache ist nun ausgeschaltet
  133. ]]></programlisting>
  134. </para>
  135. <para>
  136. Wenn ein Cache gesetzt ist, werden Daten automatisch in Ihm gespeichert und von Ihm
  137. herausgeholt. Es kann nützlich sein den Cache manuell zu entleeren. Das kann durch den
  138. Aufruf von <methodname>clearPageItemCache($pageNumber)</methodname> getan werden. Wenn
  139. kein Parameter übergeben wird, wird der komplette Cache entleert. Optional kann ein
  140. Parameter übergeben werden der die Seitenanzahl repräsentiert die den Cache löschen :
  141. </para>
  142. <para>
  143. <programlisting language="php"><![CDATA[
  144. $paginator = Zend_Paginator::factory($someData);
  145. Zend_Paginator::setCache($cache);
  146. $items = $paginator->getCurrentItems();
  147. // Seite 1 ist nun in Cache
  148. $page3Items = $paginator->getItemsByPage(3);
  149. // Seite 3 ist nun in Cache
  150. // Den Cache für die Ergebnisse der Seite 3 löschen
  151. $paginator->clearPageItemCache(3);
  152. // Alle Cachedaten löschen
  153. $paginator->clearPageItemCache();
  154. ]]></programlisting>
  155. </para>
  156. <para>
  157. Das Ändern das Anzahl der Teile pro Seite wird den kompletten Cache leeren, das er
  158. ungültig geworden wäre :
  159. </para>
  160. <para>
  161. <programlisting language="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. ]]></programlisting>
  169. </para>
  170. <para>
  171. Es ist auch möglich zu sehen welche Daten im Cache sind und direkt nach Ihnen zu fragen.
  172. Hierfür kann <methodname>getPageItemCache()</methodname> verwendet werden:
  173. </para>
  174. <para>
  175. <programlisting language="php"><![CDATA[
  176. $paginator = Zend_Paginator::factory($someData);
  177. $paginator->setItemCountPerPage(3);
  178. Zend_Paginator::setCache($cache);
  179. // Einige Teile holen
  180. $items = $paginator->getCurrentItems();
  181. $otherItems = $paginator->getItemsPerPage(4);
  182. // Die gecachten Teile als zwei-dimensionales Array sehen
  183. var_dump($paginator->getPageItemCache());
  184. ]]></programlisting>
  185. </para>
  186. </sect2>
  187. <sect2 id="zend.paginator.advanced.aggregator">
  188. <title>Zend_Paginator_AdapterAggregate Interface</title>
  189. <para>
  190. Abhängig von der Anwendung kann es gewünscht sein Objekte zu Seiten zu verarbeiten,
  191. dessen interne Datenstruktur identisch zu existierenden Adaptern ist, aber bei denen
  192. man nicht will das die eigene Kapselung gebrochen wird um Zugriff auf diese Daten
  193. zu erlauben. In anderen Fällen könnte ein Objekt in einer "hat einen Adapter" Relation
  194. stehen, statt in einer "ist ein Adapter" Relation die
  195. <classname>Zend_Paginator_Adapter_Abstract</classname> promotet. Für diese Fälle kann
  196. man das <classname>Zend_Paginator_AdapterAggregate</classname> Interface verwenden das
  197. sich so verhält wie das <classname>IteratorAggregate</classname> Interface der SPL
  198. Erweiterung von PHP.
  199. </para>
  200. <para>
  201. <programlisting language="php"><![CDATA[
  202. interface Zend_Paginator_AdapterAggregate
  203. {
  204. /**
  205. * Return a fully configured Paginator Adapter from this method.
  206. *
  207. * @return Zend_Paginator_Adapter_Abstract
  208. */
  209. public function getPaginatorAdapter();
  210. }
  211. ]]></programlisting>
  212. </para>
  213. <para>
  214. Das Interface ist sehr klein und erwartet nur das eine Instanz von
  215. <classname>Zend_Paginator_Adapter_Abstract</classname> zurückgegeben wird. Eine
  216. Aggregate Instanz des Adapters wird dann von beiden erkannt, sowohl
  217. <code>Zend_Paginator::factory</code> als auch dem Konstruktor von Zend_Paginator
  218. und entsprechend behandelt.
  219. </para>
  220. </sect2>
  221. </sect1>
  222. <!--
  223. vim:se ts=4 sw=4 et:
  224. -->