Programmer's Reference Guide
| Введение |
Использование
Разбиение наборов данных на страницы
Для разбиения элементов данных на страницы
Zend_Paginator должен иметь обобщенный доступ к этим
данным. Поэтому доступ к данным осуществляется через адаптеры к
источникам данных. В поставку Zend Framework входят несколько
адаптеров:
| Адаптер | Описание |
|---|---|
| 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>
- <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 предоставляет четыре стиля прокрутки:
| Стиль прокрутки | Описание |
|---|---|
| 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">
- <!-- Ссылка на предыдущую страницу -->
- <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; ?>
- <!-- Ссылка на следующую страницу -->
- <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; ?>
- <!-- Ссылка на первую страницу -->
- <a href="<?= $this->url(array('page' => $this->first)); ?>">First</a> |
- <?php else: ?>
- <span class="disabled">First</span> |
- <?php endif; ?>
- <!-- Ссылка на предыдущую страницу -->
- <a href="<?= $this->url(array('page' => $this->previous)); ?>">< Previous</a> |
- <?php else: ?>
- <span class="disabled">< Previous</span> |
- <?php endif; ?>
- <!-- Ссылка на следующую страницу -->
- <a href="<?= $this->url(array('page' => $this->next)); ?>">Next ></a> |
- <?php else: ?>
- <span class="disabled">Next ></span> |
- <?php endif; ?>
- <!-- Ссылка на последнюю страницу -->
- <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>
Список свойств
Следующие опции доступны внутри скрипта вида для постраничной навигации:
| Свойство | Тип | Описание |
|---|---|---|
| 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 | Общее количество элементов |
| Введение |
