Zend_Paginator-Usage.xml 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 14978 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.paginator.usage">
  5. <title>Verwendung</title>
  6. <sect2 id="zend.paginator.usage.paginating">
  7. <title>Seitendarstellung von Datensammlungen</title>
  8. <para>
  9. Um Elemente in Seiten darzustellen muß <classname>Zend_Paginator</classname> einen generellen Weg des
  10. Zugriffs auf diese Daten haben. Für diesen Zweck, läuft jeder Datenzugriff über Datenquellen
  11. Adapter. Verschiedene Adapter werden mit dem Zend Framework standardmäßig ausgeliefert:
  12. </para>
  13. <table id="zend.paginator.usage.paginating.adapters">
  14. <title>Adapter für <classname>Zend_Paginator</classname></title>
  15. <tgroup cols="2">
  16. <thead>
  17. <row>
  18. <entry>Adapter</entry>
  19. <entry>Beschreibung</entry>
  20. </row>
  21. </thead>
  22. <tbody>
  23. <row>
  24. <entry>Array</entry>
  25. <entry>Verwendet ein PHP Array</entry>
  26. </row>
  27. <row>
  28. <entry>DbSelect</entry>
  29. <entry>
  30. Verwendet eine Instanz von
  31. <link linkend="zend.db.select"><classname>Zend_Db_Select</classname></link>,
  32. welche ein Array zurückgibt
  33. </entry>
  34. </row>
  35. <row>
  36. <entry>DbTableSelect</entry>
  37. <entry>
  38. Verwendet eine Instanz von
  39. <link linkend="zend.db.table.fetch-all"><classname>Zend_Db_Table_Select</classname></link>,
  40. welche eine Instanz von <classname>Zend_Db_Table_Rowset_Abstract</classname> zurückgibt.
  41. Das gibt zusätzliche Information pber das Ergebnisset, wie z.B. die Namen der Spalten.
  42. </entry>
  43. </row>
  44. <row>
  45. <entry>Iterator</entry>
  46. <entry>
  47. Verwendet eine Instanz von
  48. <ulink url="http://www.php.net/~helly/php/ext/spl/interfaceIterator.html"><code>Iterator</code></ulink>
  49. </entry>
  50. </row>
  51. <row>
  52. <entry>Null</entry>
  53. <entry>
  54. <classname>Zend_Paginator</classname> nicht für das Verwalten von seitenweisen Daten verwenden.
  55. Man kann trotzdem die Vorteile des Features der Seitenkontrolle verwenden.
  56. </entry>
  57. </row>
  58. </tbody>
  59. </tgroup>
  60. </table>
  61. <note>
  62. <para>
  63. Statt jede passende Zeile einer gegebenen Abfrage auszuwählen, empfangen die DbSelect und
  64. DbTableSelect Adapter nur die kleinste Anzahl an Daten die für die Darstellung der aktuellen
  65. Seite notwendig sind.
  66. </para>
  67. <para>
  68. Deswegen wird dynamisch eine zweite Abfrage erzeugt um die komplette Anzahl an passenden
  69. Zeilen festzustellen. Trotzdem ist es möglich die Anzahl oder die Abfrage für die Anzahl
  70. selbst direkt zu übergeben. Siehe die <code>setRowCount()</code> Methode im DbSelect
  71. Adapter für weitere Informationen.
  72. </para>
  73. </note>
  74. <para>
  75. Um eine Instanz von <classname>Zend_Paginator</classname> zu erstellen, muß ein Adapter an den Konstruktor
  76. übergeben werden:
  77. </para>
  78. <para>
  79. <programlisting role="php"><![CDATA[
  80. $paginator = new Zend_Paginator(new Zend_Paginator_Adapter_Array($array));
  81. ]]>
  82. </programlisting>
  83. </para>
  84. <para>
  85. Der Einfachheit halber kann man für die mit dem Zend Framework mitgelieferten Adapter die
  86. statische <code>factory()</code> verwenden:
  87. </para>
  88. <para>
  89. <programlisting role="php"><![CDATA[
  90. $paginator = Zend_Paginator::factory($array);
  91. ]]>
  92. </programlisting>
  93. </para>
  94. <note>
  95. <para>
  96. Im Falle des Null Adapters, muß dem Konstruktor eine Elementanzahl mitgegeben werden da keine
  97. Datensammlung vorliegt.
  98. </para>
  99. </note>
  100. <para>
  101. Auch wenn die Instanz in diesem Fall technische zu verwenden ist, muß in der Controller Aktion
  102. der Seitendarstellung mitgeteilt werden welche Seitennummer der Benutzer angefragt hat. Das
  103. erlaubt Ihm auf die seitenweisen Daten zuzugreifen.
  104. </para>
  105. <para>
  106. <programlisting role="php"><![CDATA[
  107. $paginator->setCurrentPageNumber($page);
  108. ]]>
  109. </programlisting>
  110. </para>
  111. <para>
  112. Der einfachste Weg um diesen Wert zu verfolgen ist über eine URL. Auch wenn wir empfehlen einen
  113. <classname>Zend_Controller_Router_Interface</classname>-kompatiblen Router zu verwenden um dies zu
  114. bewerkstelligen, ist das keine Notwendigkeit.
  115. </para>
  116. <para>
  117. Das folgende ist eine Beispielroute die in einer INI Konfigurationsdatei verwendet werden könnte:
  118. </para>
  119. <para>
  120. <programlisting role="php"><![CDATA[
  121. routes.example.route = articles/:articleName/:page
  122. routes.example.defaults.controller = articles
  123. routes.example.defaults.action = view
  124. routes.example.defaults.page = 1
  125. routes.example.reqs.articleName = \w+
  126. routes.example.reqs.page = \d+
  127. ]]>
  128. </programlisting>
  129. </para>
  130. <para>
  131. Mit der obigen Route (und der Verwendung der Zend Framework MVC Komponenten), kann die aktuelle
  132. Seitenzahl wie folgt gesetzt werden:
  133. </para>
  134. <para>
  135. <programlisting role="php"><![CDATA[
  136. $paginator->setCurrentPageNumber($this->_getParam('page'));
  137. ]]>
  138. </programlisting>
  139. </para>
  140. <para>
  141. Es sind auch andere Optionen vorhanden; siehe
  142. <link linkend="zend.paginator.configuration">Konfiguration</link> für zusätzliche Informationen.
  143. </para>
  144. <para>
  145. Schlußendlich muß die Paginator Instanz der View angehängt werden. Wenn <classname>Zend_View</classname> mit
  146. dem ViewRenderer Action Helfer verwendet wird, dann funktioniert das folgende:
  147. </para>
  148. <para>
  149. <programlisting role="php"><![CDATA[
  150. $this->view->paginator = $paginator;
  151. ]]>
  152. </programlisting>
  153. </para>
  154. </sect2>
  155. <sect2 id="zend.paginator.rendering">
  156. <title>Seiten mit View Skripten darstellen</title>
  157. <para>
  158. Das View Skript wird verwendet um die Seitenelemente darzustellen (wenn <classname>Zend_Paginator</classname>
  159. verwendet wird um das zu tun) und die Seitenkontrollen anzuzeigen.
  160. </para>
  161. <para>
  162. Weil <classname>Zend_Paginator</classname> Das SPL Interface
  163. <ulink url="http://www.php.net/~helly/php/ext/spl/interfaceIteratorAggregate.html"><code>IteratorAggregate</code></ulink>
  164. integriert, ist das Durchlaufen von Elementen und deren Darstellung einfach.
  165. </para>
  166. <para>
  167. <programlisting role="php"><![CDATA[
  168. <html>
  169. <body>
  170. <h1>Beispiel</h1>
  171. <?php if (count($this->paginator)): ?>
  172. <ul>
  173. <?php foreach ($this->paginator as $item): ?>
  174. <li><?php echo $item; ?></li>
  175. <?php endforeach; ?>
  176. </ul>
  177. <?php endif; ?>
  178. <?php echo $this->paginationControl($this->paginator,
  179. 'Sliding',
  180. 'my_pagination_control.phtml'); ?>
  181. </body>
  182. </html>
  183. ]]>
  184. </programlisting>
  185. </para>
  186. <para>
  187. Der Aufruf des View Helfers fast am Ende ist zu beachten. PaginationControl nimmt bis zu vier
  188. Parameter: die Paginator Instanz, einen Scrolling Stil, eine partielle View und ein Array von
  189. zusätzlichen Parametern.
  190. </para>
  191. <para>
  192. Die zweiten und dritten Parameter sind sehr wichtig. Wobei die partielle View verwendet wird
  193. um festzustellen wie die Seitenkontrollen <emphasis>aussehen</emphasis> sollten, und der
  194. Scrolling Stil verwendet wird um zu kontrollieren wie er sich <emphasis>verhalten</emphasis>
  195. sollte. Angenommen die partielle View ist im Stil einer Suchseiten Kontrolle, wie anbei:
  196. </para>
  197. <para>
  198. <inlinegraphic align="center" valign="middle"
  199. fileref="figures/zend.paginator.usage.rendering.control.png"
  200. format="PNG"/>
  201. </para>
  202. <para>
  203. Was passiert wenn der Benutzer den "next" Link ein paar Mal anklickt? Nun, viele Dinge könnten
  204. geschehen. Die aktuelle Seitennummer könnte in der Mitte stehen wärend man durchklickt (wie Sie
  205. es auf Yahoo macht!), oder Sie könnte bis zum Ende des Seitenbereichs ansteigen und dann auf der
  206. linken Seite erscheinen wenn der Benutzer ein weiteres Mal "next" klickt. Die Seitennummer könnte
  207. sogar größer und kleiner werden wärend der Benutzer auf sie zugreift (oder "scrollt). (wie es auf
  208. Google geschieht).
  209. </para>
  210. <para>
  211. Es gibt view Scrolling Stile die mit dem Zend Framework geliefert werden:
  212. </para>
  213. <table id="zend.paginator.usage.rendering.scrolling-styles">
  214. <title>Scrolling Stile für <classname>Zend_Paginator</classname></title>
  215. <tgroup cols="2">
  216. <thead>
  217. <row>
  218. <entry>Scrolling Stil</entry>
  219. <entry>Beschreibung</entry>
  220. </row>
  221. </thead>
  222. <tbody>
  223. <row>
  224. <entry>All</entry>
  225. <entry>
  226. Gibt alle Seiten zurück. Das ist für Seitenkontrollen mit Dropdownmenüs nützlich
  227. wenn Sie relativ wenig Seiten haben. In diesen Fällen ist es oft gewünscht alle
  228. vorhandenen Seiten dem Benutzer auf einmal anzuzeigen.
  229. </entry>
  230. </row>
  231. <row>
  232. <entry>Elastic</entry>
  233. <entry>
  234. Eine Google-artiger Scrolling Stil der sich erweitert und verkleinert wenn ein
  235. Benutzer durch die Seiten scrollt.
  236. </entry>
  237. </row>
  238. <row>
  239. <entry>Jumping</entry>
  240. <entry>
  241. Wenn Benutzer scrollen, steigt die Seitenzahl bis zum Ende eines gegebenen
  242. Bereichs, und startet anschließend wieder beim Beginn eines neuen Bereichs.
  243. </entry>
  244. </row>
  245. <row>
  246. <entry>Sliding</entry>
  247. <entry>
  248. Ein Yahoo!-artiger Scrolling Stil der die aktuelle Seitenzahl in der Mitte des
  249. Seitenbereichs platziert, oder so nahe wie möglich. Das ist der Standardstil.
  250. </entry>
  251. </row>
  252. </tbody>
  253. </tgroup>
  254. </table>
  255. <para>
  256. Der vierte und letzte Parameter ist reserviert für ein assoziatives Array an zusätzlichen
  257. Variablen das in der partiellen View vorhanden sein sill (über <code>$this</code>). Für
  258. Instanzen, können diese Werte extra URL Parameter für Seitendarstellungslinks enthalten.
  259. </para>
  260. <para>
  261. Durch das Setzen von einer standardmäßigen partiellen View, einem standardmäßigen Scrolling Stil
  262. und einer View Instanz kann dei Aufruf der PaginationControl komplett eliminiert werden:
  263. </para>
  264. <para>
  265. <programlisting role="php"><![CDATA[
  266. Zend_Paginator::setDefaultScrollingStyle('Sliding');
  267. Zend_View_Helper_PaginationControl::setDefaultViewPartial(
  268. 'my_pagination_control.phtml'
  269. );
  270. $paginator->setView($view);
  271. ]]>
  272. </programlisting>
  273. </para>
  274. <para>
  275. Wenn alle diese Werte gesetzt sind, kann die Seitenkontrolle im View Skript mit einem einfachen
  276. echo Statement dargestellt werden:
  277. </para>
  278. <para>
  279. <programlisting role="php"><![CDATA[
  280. <?php echo $this->paginator; ?>
  281. ]]>
  282. </programlisting>
  283. </para>
  284. <note>
  285. <para>
  286. Natürlich ist es möglich <classname>Zend_Paginator</classname> mit anderen Template Engines zu
  287. verwenden. Mit Smarty zum Beispiel, würde man das folgendermaßen bewerkstelligen:
  288. </para>
  289. <para>
  290. <programlisting role="php"><![CDATA[
  291. $smarty->assign('pages', $paginator->getPages());
  292. ]]>
  293. </programlisting>
  294. </para>
  295. <para>
  296. Man könnte die Seitenverte von einem Template wie folgt erhalten:
  297. </para>
  298. <para>
  299. <programlisting role="php"><![CDATA[
  300. {$pages.pageCount}
  301. ]]>
  302. </programlisting>
  303. </para>
  304. </note>
  305. <sect3 id="zend.paginator.usage.rendering.example-controls">
  306. <title>Beispiel der Seitenkontrolle</title>
  307. <para>
  308. Das folgende Beispiel von Seitenkontrollen wird Ihnen hoffentlich helfen um erstmals
  309. anzufangen:
  310. </para>
  311. <para>
  312. Such-Seitendarstellung
  313. <programlisting role="php"><![CDATA[
  314. <!--
  315. Siehe http://developer.yahoo.com/ypatterns/pattern.php?pattern=searchpagination
  316. -->
  317. <?php if ($this->pageCount): ?>
  318. <div class="paginationControl">
  319. <!-- Vorheriger Seitenlink -->
  320. <?php if (isset($this->previous)): ?>
  321. <a href="<?php echo $this->url(array('page' => $this->previous)); ?>">
  322. &lt; Vorher
  323. </a> |
  324. <?php else: ?>
  325. <span class="disabled">&lt; Vorher</span> |
  326. <?php endif; ?>
  327. <!-- Anzahl an Seitenlinks -->
  328. <?php foreach ($this->pagesInRange as $page): ?>
  329. <?php if ($page != $this->current): ?>
  330. <a href="<?php echo $this->url(array('page' => $page)); ?>">
  331. <?php echo $page; ?>
  332. </a> |
  333. <?php else: ?>
  334. <?php echo $page; ?> |
  335. <?php endif; ?>
  336. <?php endforeach; ?>
  337. <!-- Nächster Seitenlink -->
  338. <?php if (isset($this->next)): ?>
  339. <a href="<?php echo $this->url(array('page' => $this->next)); ?>">
  340. Nächster &gt;
  341. </a>
  342. <?php else: ?>
  343. <span class="disabled">Nächster &gt;</span>
  344. <?php endif; ?>
  345. </div>
  346. <?php endif; ?>
  347. ]]>
  348. </programlisting>
  349. </para>
  350. <para>
  351. Element Seitendarstellung
  352. <programlisting role="php"><![CDATA[
  353. <!--
  354. Siehe http://developer.yahoo.com/ypatterns/pattern.php?pattern=itempagination
  355. -->
  356. <?php if ($this->pageCount): ?>
  357. <div class="paginationControl">
  358. <?php echo $this->firstItemNumber; ?> - <?php echo $this->lastItemNumber; ?>
  359. of <?php echo $this->totalItemCount; ?>
  360. <!-- First page link -->
  361. <?php if (isset($this->previous)): ?>
  362. <a href="<?php echo $this->url(array('page' => $this->first)); ?>">
  363. First
  364. </a> |
  365. <?php else: ?>
  366. <span class="disabled">First</span> |
  367. <?php endif; ?>
  368. <!-- Vorheriger Seitenlink -->
  369. <?php if (isset($this->previous)): ?>
  370. <a href="<?php echo $this->url(array('page' => $this->previous)); ?>">
  371. &lt; Vorheriger
  372. </a> |
  373. <?php else: ?>
  374. <span class="disabled">&lt; Vorheriger</span> |
  375. <?php endif; ?>
  376. <!-- Next page link -->
  377. <?php if (isset($this->next)): ?>
  378. <a href="<?php echo $this->url(array('page' => $this->next)); ?>">
  379. Nächster &gt;
  380. </a> |
  381. <?php else: ?>
  382. <span class="disabled">Nächster &gt;</span> |
  383. <?php endif; ?>
  384. <!-- Last page link -->
  385. <?php if (isset($this->next)): ?>
  386. <a href="<?php echo $this->url(array('page' => $this->last)); ?>">
  387. Last
  388. </a>
  389. <?php else: ?>
  390. <span class="disabled">Last</span>
  391. <?php endif; ?>
  392. </div>
  393. <?php endif; ?>
  394. ]]>
  395. </programlisting>
  396. </para>
  397. <para>
  398. Dropdown Seitendarstellung
  399. <programlisting role="php"><![CDATA[
  400. <?php if ($this->pageCount): ?>
  401. <select id="paginationControl" size="1">
  402. <?php foreach ($this->pagesInRange as $page): ?>
  403. <?php $selected = ($page == $this->current) ? ' selected="selected"' : ''; ?>
  404. <option value="<?php
  405. echo $this->url(array('page' => $page)); ?>"<?php echo $selected ?>>
  406. <?php echo $page; ?>
  407. </option>
  408. <?php endforeach; ?>
  409. </select>
  410. <?php endif; ?>
  411. <script type="text/javascript"
  412. src="http://ajax.googleapis.com/ajax/libs/prototype/1.6.0.2/prototype.js">
  413. </script>
  414. <script type="text/javascript">
  415. $('paginationControl').observe('change', function() {
  416. window.location = this.options[this.selectedIndex].value;
  417. })
  418. </script>
  419. ]]>
  420. </programlisting>
  421. </para>
  422. </sect3>
  423. <sect3 id="zend.paginator.usage.rendering.properties">
  424. <title>Tabelle von Eigenschaften</title>
  425. <para>
  426. Die folgenden Optionen von für eine Seitenkontrolle bei View Partials vorhanden:
  427. </para>
  428. <table id="zend.paginator.usage.rendering.properties.table">
  429. <title>Eigenschaften die bei View Partials vorhanden sind</title>
  430. <tgroup cols="3">
  431. <thead>
  432. <row>
  433. <entry>Eigenschaft</entry>
  434. <entry>Typ</entry>
  435. <entry>Beschreibung</entry>
  436. </row>
  437. </thead>
  438. <tbody>
  439. <row>
  440. <entry>first</entry>
  441. <entry>integer</entry>
  442. <entry>Erste Seitennummer (z.B., 1)</entry>
  443. </row>
  444. <row>
  445. <entry>firstItemNumber</entry>
  446. <entry>integer</entry>
  447. <entry>
  448. Absolute Nummer des ersten Elements auf dieser Seite
  449. </entry>
  450. </row>
  451. <row>
  452. <entry>firstPageInRange</entry>
  453. <entry>integer</entry>
  454. <entry>
  455. Erste Seite des Bereichs der vom Scrolling Stil zurückgegeben wird
  456. </entry>
  457. </row>
  458. <row>
  459. <entry>current</entry>
  460. <entry>integer</entry>
  461. <entry>Aktuelle Seitenzahl</entry>
  462. </row>
  463. <row>
  464. <entry>currentItemCount</entry>
  465. <entry>integer</entry>
  466. <entry>Anzahl der Elemente auf dieser Seite</entry>
  467. </row>
  468. <row>
  469. <entry>itemCountPerPage</entry>
  470. <entry>integer</entry>
  471. <entry>Maximale Anzahl der Elemente die auf jeder Seite vorhanden sind</entry>
  472. </row>
  473. <row>
  474. <entry>last</entry>
  475. <entry>integer</entry>
  476. <entry>Letzte Seitennummer</entry>
  477. </row>
  478. <row>
  479. <entry>lastItemNumber</entry>
  480. <entry>integer</entry>
  481. <entry>
  482. Absolute Zahl des letzten Elements auf dieser Seite
  483. </entry>
  484. </row>
  485. <row>
  486. <entry>lastPageInRange</entry>
  487. <entry>integer</entry>
  488. <entry>
  489. Letzte Seite im Bereich der vom Scrolling Stil zurückgegeben wird
  490. </entry>
  491. </row>
  492. <row>
  493. <entry>next</entry>
  494. <entry>integer</entry>
  495. <entry>Nächste Seitenzahl</entry>
  496. </row>
  497. <row>
  498. <entry>pageCount</entry>
  499. <entry>integer</entry>
  500. <entry>Anzahl an Seiten</entry>
  501. </row>
  502. <row>
  503. <entry>pagesInRange</entry>
  504. <entry>array</entry>
  505. <entry>
  506. Array von Seiten das vom Scrolling Stil zurückgegeben wird
  507. </entry>
  508. </row>
  509. <row>
  510. <entry>previous</entry>
  511. <entry>integer</entry>
  512. <entry>Vorherige Seitenzahl</entry>
  513. </row>
  514. <row>
  515. <entry>totalItemCount</entry>
  516. <entry>integer</entry>
  517. <entry>Komplette Anzahl an Elementen</entry>
  518. </row>
  519. </tbody>
  520. </tgroup>
  521. </table>
  522. </sect3>
  523. </sect2>
  524. </sect1>
  525. <!--
  526. vim:se ts=4 sw=4 et:
  527. -->