Zend_Paginator-Usage.xml 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510
  1. <sect1 id="zend.paginator.usage">
  2. <title>Использование</title>
  3. <sect2 id="zend.paginator.usage.paginating">
  4. <title>Разбиение наборов данных на страницы </title>
  5. <para>
  6. Для разбиения элементов данных на страницы
  7. <code>Zend_Paginator</code> должен иметь обобщенный доступ к этим
  8. данным. Поэтому доступ к данным осуществляется через адаптеры к
  9. источникам данных. В поставку Zend Framework входят несколько
  10. адаптеров:
  11. </para>
  12. <table id="zend.paginator.usage.paginating.adapters">
  13. <title>Адаптеры для <code>Zend_Paginator</code></title>
  14. <tgroup cols="2">
  15. <thead>
  16. <row>
  17. <entry>Адаптер</entry>
  18. <entry>Описание</entry>
  19. </row>
  20. </thead>
  21. <tbody>
  22. <row>
  23. <entry>Array</entry>
  24. <entry>Использует PHP-массив</entry>
  25. </row>
  26. <row>
  27. <entry>DbSelect</entry>
  28. <entry>
  29. Использует экземпляр
  30. <link linkend="zend.db.select"><code>Zend_Db_Select</code></link>
  31. </entry>
  32. </row>
  33. <row>
  34. <entry>Iterator</entry>
  35. <entry>
  36. Использует экземпляр
  37. <ulink url="http://www.php.net/~helly/php/ext/spl/interfaceIterator.html"><code>Iterator</code></ulink>
  38. </entry>
  39. </row>
  40. <row>
  41. <entry>Null</entry>
  42. <entry>
  43. Не использовать <code>Zend_Paginator</code>
  44. для разбиения на страницы.
  45. Но и в этом случае вы можете воспользоваться
  46. возможностями постраничной навигации.
  47. </entry>
  48. </row>
  49. </tbody>
  50. </tgroup>
  51. </table>
  52. <para>
  53. При создании экземпляра класса <code>Zend_Paginator</code>, следует
  54. передать адаптер его конструктору:
  55. </para>
  56. <para>
  57. <programlisting language="php"><![CDATA[$paginator = new Zend_Paginator(new Zend_Paginator_Adapter_array($array));]]>
  58. </programlisting>
  59. </para>
  60. <para>
  61. Для удобства вы можете воспользоваться статическим методом
  62. <code>factory()</code> для адаптеров, входящих в поставку Zend
  63. Framework:
  64. </para>
  65. <para>
  66. <programlisting language="php"><![CDATA[$paginator = Zend_Paginator::factory($array);]]>
  67. </programlisting>
  68. </para>
  69. <note>
  70. <para>В случае использования адаптера Null вы должны передавать
  71. его конструктору количество элементов вместо набора данных.</para>
  72. </note>
  73. <para>
  74. Несмотря на то, что экземпляр технически можно
  75. использовать и в таком состоянии, вы должны
  76. будете указывать, какой номер страницы запросил пользователь,
  77. чтобы он мог просматривать данные:
  78. </para>
  79. <para>
  80. <programlisting language="php"><![CDATA[$paginator->setCurrentPageNumber($pageNumber);]]>
  81. </programlisting>
  82. </para>
  83. <para>
  84. Наиболее простым способом отслеживания номера страницы является
  85. использование URL. Мы рекомендуем использовать для этого
  86. совместимый с <code>Zend_Controller_Router_Interface</code>
  87. маршрутизатор, но это не обязательно.
  88. </para>
  89. <para>
  90. Ниже приведен пример маршрута, который можно использовать в
  91. конфигурационном файле INI:
  92. </para>
  93. <para>
  94. <programlisting language="php"><![CDATA[routes.example.route = articles/:articleName/:pageNumber
  95. routes.example.defaults.controller = articles
  96. routes.example.defaults.action = view
  97. routes.example.defaults.pageNumber = 1
  98. routes.example.reqs.articleName = \w+
  99. routes.example.reqs.pageNumber = \d+]]>
  100. </programlisting>
  101. </para>
  102. <para>
  103. Используя этот маршрут и компоненты MVC Zend Framework-а,
  104. вы можете устанавливать номер текущей страницы следующим образом:
  105. </para>
  106. <para>
  107. <programlisting language="php"><![CDATA[$paginator->setCurrentPageNumber($this->_getParam('pageNumber'));]]>
  108. </programlisting>
  109. </para>
  110. <para>
  111. Есть также другие опции, о них читайте в разделе
  112. <link linkend="zend.paginator.configuration">Конфигурация</link>.
  113. </para>
  114. <para>
  115. После этого нужно присвоить экземпляр
  116. <code>Zend_Paginator</code> переменной вида. Если используется
  117. <code>Zend_View</code> с помощником действий ViewRenderer, то
  118. для этого подходит следующий код:
  119. </para>
  120. <para>
  121. <programlisting language="php"><![CDATA[$this->view->paginator = $paginator;]]>
  122. </programlisting>
  123. </para>
  124. </sect2>
  125. <sect2 id="zend.paginator.rendering">
  126. <title>Визуализация страниц через скрипты видов</title>
  127. <para>
  128. Для визуализации элементов страницы (если
  129. вы используете для этого <code>Zend_Paginator</code>)
  130. и отображения постраничной навигации используется скрипт вида.
  131. </para>
  132. <para>
  133. Поскольку <code>Zend_Paginator</code> реализует SPL-интерфейс
  134. <ulink url="http://www.php.net/~helly/php/ext/spl/interfaceIteratorAggregate.html"><code>IteratorAggregate</code></ulink>,
  135. то обход элементов и их отображение производится просто.
  136. </para>
  137. <para>
  138. <programlisting language="php"><![CDATA[<html>
  139. <body>
  140. <h1>Example</h1>
  141. <?php if (count($this->paginator)): ?>
  142. <ul>
  143. <?php foreach ($this->paginator as $item): ?>
  144. <li><?= $item; ?></li>
  145. <?php endforeach; ?>
  146. </ul>
  147. <?php endif; ?>
  148. <?= $this->paginationControl($this->paginator, 'Sliding', 'my_pagination_control.phtml'); ?>
  149. </body>
  150. </html>]]>
  151. </programlisting>
  152. </para>
  153. <para>
  154. Обратите внимание, что в конце вызывается помощник вида.
  155. <code>PaginationControl</code> принимает экземпляр
  156. <code>Zend_Paginator</code>, стиль прокрутки и скрипт вида.
  157. Последние два аргумента являются необязательными.
  158. </para>
  159. <para>
  160. Но несмотря на это, они очень важны. В то время как скрипт вида
  161. используется для определения <emphasis>внешнего вида</emphasis>
  162. постраничной навигации, стиль прокрутки определяет ее
  163. <emphasis>поведение</emphasis>.
  164. Предположим, скрипт вида отображает постраничную навигацию
  165. для результатов поиска следующего вида:
  166. </para>
  167. <para>
  168. <inlinegraphic align="center" valign="middle"
  169. fileref="figures/zend.paginator.usage.rendering.control.png"
  170. format="PNG"/>
  171. </para>
  172. <para>
  173. Что должно происходить, если пользователь нажимает на ссылку "next"
  174. несколько раз? Правильно, тут может быть сколько угодно
  175. вариантов. Номер текущей страницы может оставаться в середине
  176. (как это реализовано, например, в Yahoo!) или перемещаться к концу
  177. ряда при каждом нажатии "next" и затем показываться снова с другого
  178. конца. Количество отображаемых номеров страниц может даже
  179. увеличиваться и уменьшаться, пока пользователь перемещается по ним
  180. (или "прокручивает" их), как это сделано в Google.
  181. </para>
  182. <para>
  183. Zend Framework предоставляет четыре стиля прокрутки:
  184. </para>
  185. <table id="zend.paginator.usage.rendering.scrolling-styles">
  186. <title>Стили прокрутки для <code>Zend_Paginator</code></title>
  187. <tgroup cols="2">
  188. <thead>
  189. <row>
  190. <entry>Стиль прокрутки</entry>
  191. <entry>Описание</entry>
  192. </row>
  193. </thead>
  194. <tbody>
  195. <row>
  196. <entry>All</entry>
  197. <entry>
  198. Возвращает все страницы. Полезен для
  199. постраничной навигации в виде выпадающего списка
  200. с относительно небольшим количеством страниц.
  201. В этом случае предпочтительнее, чтобы в нем
  202. отображались все доступные страницы.
  203. </entry>
  204. </row>
  205. <row>
  206. <entry>Elastic</entry>
  207. <entry>
  208. Скроллинг в стиле Google, в котором количество
  209. отображаемых номеров страниц может увеличиваться и
  210. уменьшаться, пока пользователь перемещается по
  211. страницам.
  212. </entry>
  213. </row>
  214. <row>
  215. <entry>Jumping</entry>
  216. <entry>
  217. Пока пользователь листает страницы, номер текущей
  218. страницы перемещается к концу ряда и показывается
  219. снова в начале нового ряда.
  220. </entry>
  221. </row>
  222. <row>
  223. <entry>Sliding</entry>
  224. <entry>
  225. Скроллинг в стиле Yahoo!, в котором номер текущей
  226. страницы находится в середине ряда или настолько
  227. близко к нему, насколько это возможно. Этот стиль
  228. используется по умолчанию.
  229. </entry>
  230. </row>
  231. </tbody>
  232. </tgroup>
  233. </table>
  234. <para>
  235. Установив используемые по умолчанию скрипт вида, стиль прокрутки и
  236. экземпляр вида, вы можете полностью исключить вызовы
  237. PaginationControl:
  238. </para>
  239. <para>
  240. <programlisting language="php"><![CDATA[Zend_Paginator::setDefaultScrollingStyle('Sliding');
  241. Zend_View_Helper_PaginationControl::setDefaultViewPartial('my_pagination_control.phtml');
  242. $paginator->setView($view);]]>
  243. </programlisting>
  244. </para>
  245. <para>
  246. Если все эти значения установлены, то вы можете вывести
  247. постраничную навигацию в своем скрипте вида с помощью обычной
  248. конструкции <code>echo</code>:
  249. </para>
  250. <para>
  251. <programlisting language="php"><![CDATA[<?= $this->paginator; ?>]]>
  252. </programlisting>
  253. </para>
  254. <sect3 id="zend.paginator.usage.rendering.example-controls">
  255. <title>Примеры постраничной навигации</title>
  256. <para>
  257. Надеемся, следующие примеры помогут вам с созданием постраничной
  258. навигации:
  259. </para>
  260. <para>
  261. Постраничная навигация для результатов поиска
  262. <programlisting language="php"><![CDATA[<!--
  263. См. http://developer.yahoo.com/ypatterns/pattern.php?pattern=searchpagination
  264. -->
  265. <?php if ($this->pageCount): ?>
  266. <div id="paginationControl">
  267. <!-- Ссылка на предыдущую страницу -->
  268. <?php if (isset($this->previous)): ?>
  269. <a href="<?= $this->url(array('page' => $this->previous)); ?>">&lt; Previous</a> |
  270. <?php else: ?>
  271. <span class="disabled">&lt; Previous</span> |
  272. <?php endif; ?>
  273. <!-- Нумерованные ссылки на страницы -->
  274. <?php foreach ($this->pagesInRange as $page): ?>
  275. <?php if ($page != $this->current): ?>
  276. <a href="<?= $this->url(array('page' => $page)); ?>"><?= $page; ?></a> |
  277. <?php else: ?>
  278. <?= $page; ?> |
  279. <?php endif; ?>
  280. <?php endforeach; ?>
  281. <!-- Ссылка на следующую страницу -->
  282. <?php if (isset($this->next)): ?>
  283. <a href="<?= $this->url(array('page' => $this->next)); ?>">Next &gt;</a>
  284. <?php else: ?>
  285. <span class="disabled">Next &gt;</span>
  286. <?php endif; ?>
  287. </div>
  288. <?php endif; ?>]]>
  289. </programlisting>
  290. </para>
  291. <para>
  292. Постраничная навигация для элементов
  293. <programlisting language="php"><![CDATA[<!--
  294. См. http://developer.yahoo.com/ypatterns/pattern.php?pattern=itempagination
  295. -->
  296. <?php if ($this->pageCount): ?>
  297. <div id="paginationControl">
  298. <?= $this->firstItemNumber; ?> - <?= $this->lastItemNumber; ?>
  299. of <?= $this->totalItemCount; ?>
  300. <!-- Ссылка на первую страницу -->
  301. <?php if (isset($this->previous)): ?>
  302. <a href="<?= $this->url(array('page' => $this->first)); ?>">First</a> |
  303. <?php else: ?>
  304. <span class="disabled">First</span> |
  305. <?php endif; ?>
  306. <!-- Ссылка на предыдущую страницу -->
  307. <?php if (isset($this->previous)): ?>
  308. <a href="<?= $this->url(array('page' => $this->previous)); ?>">&lt; Previous</a> |
  309. <?php else: ?>
  310. <span class="disabled">&lt; Previous</span> |
  311. <?php endif; ?>
  312. <!-- Ссылка на следующую страницу -->
  313. <?php if (isset($this->next)): ?>
  314. <a href="<?= $this->url(array('page' => $this->next)); ?>">Next &gt;</a> |
  315. <?php else: ?>
  316. <span class="disabled">Next &gt;</span> |
  317. <?php endif; ?>
  318. <!-- Ссылка на последнюю страницу -->
  319. <?php if (isset($this->next)): ?>
  320. <a href="<?= $this->url(array('page' => $this->last)); ?>">Last</a>
  321. <?php else: ?>
  322. <span class="disabled">Last</span>
  323. <?php endif; ?>
  324. </div>
  325. <?php endif; ?>]]>
  326. </programlisting>
  327. </para>
  328. <para>
  329. Постраничная навигация в виде выпадающего списка
  330. <programlisting language="php"><![CDATA[
  331. <?php if ($this->pageCount): ?>
  332. <select id="paginationControl" size="1">
  333. <?php foreach ($this->pagesInRange as $page): ?>
  334. <?php $selected = ($page == $this->current) ? ' selected="selected"' : ''; ?>
  335. <option value="<?= $this->url(array('page' => $page)); ?>"<?= $selected ?>><?= $page; ?></option>
  336. <?php endforeach; ?>
  337. </select>
  338. <?php endif; ?>
  339. <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/prototype/1.6.0.2/prototype.js"></script>
  340. <script type="text/javascript">
  341. $('paginationControl').observe('change', function() {
  342. window.location = this.options[this.selectedIndex].value;
  343. })
  344. </script>]]>
  345. </programlisting>
  346. </para>
  347. </sect3>
  348. <sect3 id="zend.paginator.usage.rendering.properties">
  349. <title>Список свойств</title>
  350. <para>
  351. Следующие опции доступны внутри скрипта вида для постраничной
  352. навигации:
  353. </para>
  354. <table id="zend.paginator.usage.rendering.properties.table">
  355. <title>Свойства, доступные внутри скрипта вида</title>
  356. <tgroup cols="3">
  357. <thead>
  358. <row>
  359. <entry>Свойство</entry>
  360. <entry>Тип</entry>
  361. <entry>Описание</entry>
  362. </row>
  363. </thead>
  364. <tbody>
  365. <row>
  366. <entry>first</entry>
  367. <entry>integer</entry>
  368. <entry>Номер первой страницы (т.е. 1)</entry>
  369. </row>
  370. <row>
  371. <entry>firstItemNumber</entry>
  372. <entry>integer</entry>
  373. <entry>
  374. Действительный номер первого элемента на
  375. текущей странице
  376. </entry>
  377. </row>
  378. <row>
  379. <entry>firstPageInRange</entry>
  380. <entry>integer</entry>
  381. <entry>
  382. Первая страница в ряде, возвращенном текущим
  383. стилем прокрутки
  384. </entry>
  385. </row>
  386. <row>
  387. <entry>current</entry>
  388. <entry>integer</entry>
  389. <entry>Текущий номер страницы</entry>
  390. </row>
  391. <row>
  392. <entry>currentItemCount</entry>
  393. <entry>integer</entry>
  394. <entry>Количество элементов на текущей странице</entry>
  395. </row>
  396. <row>
  397. <entry>last</entry>
  398. <entry>integer</entry>
  399. <entry>Номер последней страницы</entry>
  400. </row>
  401. <row>
  402. <entry>lastItemNumber</entry>
  403. <entry>integer</entry>
  404. <entry>
  405. Действительный номер последнего элемента на
  406. текущей странице
  407. </entry>
  408. </row>
  409. <row>
  410. <entry>lastPageInRange</entry>
  411. <entry>integer</entry>
  412. <entry>
  413. Последняя страница в ряде, возвращенном текущим
  414. стилем прокрутки
  415. </entry>
  416. </row>
  417. <row>
  418. <entry>next</entry>
  419. <entry>integer</entry>
  420. <entry>Номер следующей страницы</entry>
  421. </row>
  422. <row>
  423. <entry>pageCount</entry>
  424. <entry>integer</entry>
  425. <entry>Общее количество страниц</entry>
  426. </row>
  427. <row>
  428. <entry>pagesInRange</entry>
  429. <entry>array</entry>
  430. <entry>
  431. Массив страниц, возвращенный текущим стилем
  432. прокрутки
  433. </entry>
  434. </row>
  435. <row>
  436. <entry>previous</entry>
  437. <entry>integer</entry>
  438. <entry>Номер предыдущей страницы</entry>
  439. </row>
  440. <row>
  441. <entry>totalItemCount</entry>
  442. <entry>integer</entry>
  443. <entry>Общее количество элементов</entry>
  444. </row>
  445. </tbody>
  446. </tgroup>
  447. </table>
  448. </sect3>
  449. </sect2>
  450. </sect1>
  451. <!--
  452. vim:se ts=4 sw=4 et:
  453. -->