Для разбиения элементов данных на страницы
Zend_Paginator должен иметь обобщенный доступ к этим
данным. Поэтому доступ к данным осуществляется через адаптеры к
источникам данных. В поставку Zend Framework входят несколько
адаптеров:
Таблица 35.1. Адаптеры для Zend_Paginator
| Адаптер | Описание |
|---|---|
| Array | Использует PHP-массив |
| DbSelect |
Использует экземпляр
Zend_Db_Select
|
| Iterator |
Использует экземпляр
Iterator
|
| Null |
Не использовать Zend_Paginator
для разбиения на страницы.
Но и в этом случае вы можете воспользоваться
возможностями постраничной навигации.
|
При создании экземпляра класса Zend_Paginator, следует
передать адаптер его конструктору:
$paginator = new Zend_Paginator(new Zend_Paginator_Adapter_array($array));
Для удобства вы можете воспользоваться статическим методом
factory() для адаптеров, входящих в поставку Zend
Framework:
$paginator = Zend_Paginator::factory($array);
![]() |
Замечание |
|---|---|
В случае использования адаптера Null вы должны передавать его конструктору количество элементов вместо набора данных. |
Несмотря на то, что экземпляр технически можно использовать и в таком состоянии, вы должны будете указывать, какой номер страницы запросил пользователь, чтобы он мог просматривать данные:
$paginator->setCurrentPageNumber($pageNumber);
Наиболее простым способом отслеживания номера страницы является
использование URL. Мы рекомендуем использовать для этого
совместимый с Zend_Controller_Router_Interface
маршрутизатор, но это не обязательно.
Ниже приведен пример маршрута, который можно использовать в конфигурационном файле INI:
routes.example.route = articles/:articleName/:pageNumber
routes.example.defaults.controller = articles
routes.example.defaults.action = view
routes.example.defaults.pageNumber = 1
routes.example.reqs.articleName = \w+
routes.example.reqs.pageNumber = \d+
Используя этот маршрут и компоненты MVC Zend Framework-а, вы можете устанавливать номер текущей страницы следующим образом:
$paginator->setCurrentPageNumber($this->_getParam('pageNumber'));
Есть также другие опции, о них читайте в разделе Конфигурация.
После этого нужно присвоить экземпляр
Zend_Paginator переменной вида. Если используется
Zend_View с помощником действий ViewRenderer, то
для этого подходит следующий код:
$this->view->paginator = $paginator;
Для визуализации элементов страницы (если
вы используете для этого Zend_Paginator)
и отображения постраничной навигации используется скрипт вида.
Поскольку Zend_Paginator реализует SPL-интерфейс
IteratorAggregate,
то обход элементов и их отображение производится просто.
<html>
<body>
<h1>Example</h1>
<?php if (count($this->paginator)): ?>
<ul>
<?php foreach ($this->paginator as $item): ?>
<li><?= $item; ?></li>
<?php endforeach; ?>
</ul>
<?php endif; ?>
<?= $this->paginationControl($this->paginator, 'Sliding', 'my_pagination_control.phtml'); ?>
</body>
</html>
Обратите внимание, что в конце вызывается помощник вида.
PaginationControl принимает экземпляр
Zend_Paginator, стиль прокрутки и скрипт вида.
Последние два аргумента являются необязательными.
Но несмотря на это, они очень важны. В то время как скрипт вида используется для определения внешнего вида постраничной навигации, стиль прокрутки определяет ее поведение. Предположим, скрипт вида отображает постраничную навигацию для результатов поиска следующего вида:
Что должно происходить, если пользователь нажимает на ссылку "next" несколько раз? Правильно, тут может быть сколько угодно вариантов. Номер текущей страницы может оставаться в середине (как это реализовано, например, в Yahoo!) или перемещаться к концу ряда при каждом нажатии "next" и затем показываться снова с другого конца. Количество отображаемых номеров страниц может даже увеличиваться и уменьшаться, пока пользователь перемещается по ним (или "прокручивает" их), как это сделано в Google.
Zend Framework предоставляет четыре стиля прокрутки:
Таблица 35.2. Стили прокрутки для Zend_Paginator
| Стиль прокрутки | Описание |
|---|---|
| All | Возвращает все страницы. Полезен для постраничной навигации в виде выпадающего списка с относительно небольшим количеством страниц. В этом случае предпочтительнее, чтобы в нем отображались все доступные страницы. |
| Elastic | Скроллинг в стиле Google, в котором количество отображаемых номеров страниц может увеличиваться и уменьшаться, пока пользователь перемещается по страницам. |
| Jumping | Пока пользователь листает страницы, номер текущей страницы перемещается к концу ряда и показывается снова в начале нового ряда. |
| Sliding | Скроллинг в стиле Yahoo!, в котором номер текущей страницы находится в середине ряда или настолько близко к нему, насколько это возможно. Этот стиль используется по умолчанию. |
Установив используемые по умолчанию скрипт вида, стиль прокрутки и экземпляр вида, вы можете полностью исключить вызовы PaginationControl:
Zend_Paginator::setDefaultScrollingStyle('Sliding');
Zend_View_Helper_PaginationControl::setDefaultViewPartial('my_pagination_control.phtml');
$paginator->setView($view);
Если все эти значения установлены, то вы можете вывести
постраничную навигацию в своем скрипте вида с помощью обычной
конструкции echo:
<?= $this->paginator; ?>
Надеемся, следующие примеры помогут вам с созданием постраничной навигации:
Постраничная навигация для результатов поиска
<!--
См. http://developer.yahoo.com/ypatterns/pattern.php?pattern=searchpagination
-->
<?php if ($this->pageCount): ?>
<div id="paginationControl">
<!-- Ссылка на предыдущую страницу -->
<?php if (isset($this->previous)): ?>
<a href="<?= $this->url(array('page' => $this->previous)); ?>">< Previous</a> |
<?php else: ?>
<span class="disabled">< Previous</span> |
<?php endif; ?>
<!-- Нумерованные ссылки на страницы -->
<?php foreach ($this->pagesInRange as $page): ?>
<?php if ($page != $this->current): ?>
<a href="<?= $this->url(array('page' => $page)); ?>"><?= $page; ?></a> |
<?php else: ?>
<?= $page; ?> |
<?php endif; ?>
<?php endforeach; ?>
<!-- Ссылка на следующую страницу -->
<?php if (isset($this->next)): ?>
<a href="<?= $this->url(array('page' => $this->next)); ?>">Next ></a>
<?php else: ?>
<span class="disabled">Next ></span>
<?php endif; ?>
</div>
<?php endif; ?>
Постраничная навигация для элементов
<!--
См. http://developer.yahoo.com/ypatterns/pattern.php?pattern=itempagination
-->
<?php if ($this->pageCount): ?>
<div id="paginationControl">
<?= $this->firstItemNumber; ?> - <?= $this->lastItemNumber; ?>
of <?= $this->totalItemCount; ?>
<!-- Ссылка на первую страницу -->
<?php if (isset($this->previous)): ?>
<a href="<?= $this->url(array('page' => $this->first)); ?>">First</a> |
<?php else: ?>
<span class="disabled">First</span> |
<?php endif; ?>
<!-- Ссылка на предыдущую страницу -->
<?php if (isset($this->previous)): ?>
<a href="<?= $this->url(array('page' => $this->previous)); ?>">< Previous</a> |
<?php else: ?>
<span class="disabled">< Previous</span> |
<?php endif; ?>
<!-- Ссылка на следующую страницу -->
<?php if (isset($this->next)): ?>
<a href="<?= $this->url(array('page' => $this->next)); ?>">Next ></a> |
<?php else: ?>
<span class="disabled">Next ></span> |
<?php endif; ?>
<!-- Ссылка на последнюю страницу -->
<?php if (isset($this->next)): ?>
<a href="<?= $this->url(array('page' => $this->last)); ?>">Last</a>
<?php else: ?>
<span class="disabled">Last</span>
<?php endif; ?>
</div>
<?php endif; ?>
Постраничная навигация в виде выпадающего списка
<?php if ($this->pageCount): ?>
<select id="paginationControl" size="1">
<?php foreach ($this->pagesInRange as $page): ?>
<?php $selected = ($page == $this->current) ? ' selected="selected"' : ''; ?>
<option value="<?= $this->url(array('page' => $page)); ?>"<?= $selected ?>><?= $page; ?></option>
<?php endforeach; ?>
</select>
<?php endif; ?>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/prototype/1.6.0.2/prototype.js"></script>
<script type="text/javascript">
$('paginationControl').observe('change', function() {
window.location = this.options[this.selectedIndex].value;
})
</script>
Следующие опции доступны внутри скрипта вида для постраничной навигации:
Таблица 35.3. Свойства, доступные внутри скрипта вида
| Свойство | Тип | Описание |
|---|---|---|
| first | integer | Номер первой страницы (т.е. 1) |
| firstItemNumber | integer | Действительный номер первого элемента на текущей странице |
| firstPageInRange | integer | Первая страница в ряде, возвращенном текущим стилем прокрутки |
| current | integer | Текущий номер страницы |
| currentItemCount | integer | Количество элементов на текущей странице |
| last | integer | Номер последней страницы |
| lastItemNumber | integer | Действительный номер последнего элемента на текущей странице |
| lastPageInRange | integer | Последняя страница в ряде, возвращенном текущим стилем прокрутки |
| next | integer | Номер следующей страницы |
| pageCount | integer | Общее количество страниц |
| pagesInRange | array | Массив страниц, возвращенный текущим стилем прокрутки |
| previous | integer | Номер предыдущей страницы |
| totalItemCount | integer | Общее количество элементов |



![[Замечание]](images/note.png)