ИспользованиеРазбиение наборов данных на страницыДля разбиения наборов данных на страницы Zend_Paginator должен иметь обобщенный доступ к этим данным. Поэтому доступ к данным осуществляется через адаптеры к источникам данных. В поставку Zend Framework по умолчанию входят несколько адаптеров:
При создании экземпляра класса Zend_Paginator следует передавать адаптер его конструктору: Для удобства вы можете воспользоваться фабричным методом factory() для получения адаптеров, входящих в поставку Zend Framework:
Несмотря на то, что на этом этапе экземпляр формально уже пригоден к использованию, на практике вы должны будете еще передавать номер страницы, запрошенный пользователем, чтобы он мог просматривать данные: Наиболее простым способом отслеживания номера страницы является использование URL. Мы рекомендуем использовать для этого совместимый с Zend_Controller_Router_Interface маршрутизатор, но это не является обязательным требованием. Ниже приведен пример маршрута, который можно использовать в конфигурационном файле INI: Используя этот маршрут и MVC-компоненты Zend Framework-а, вы можете устанавливать номер текущей страницы следующим образом:
Есть также другие опции, о них читайте в разделе Конфигурация. После этого нужно присвоить экземпляр Zend_Paginator переменной вида. Если используется Zend_View с помощником действий ViewRenderer, то для этого подходит следующий код:
Адаптеры DbSelect и DbTableSelectХотя большинство адаптеров довольно просто в использовании, адаптеры баз данных требуют дополнительных пояснений насчет извлечения данных и подсчета количества строк. При использовании адаптеры DbSelect и DbTableSelect нет необходимости самостоятельно извлекать данные. Оба адаптера сами выполняют извлечение данных и подсчет общего количества страниц. Если полученные результаты выборки требуют дополнительной обработки, то адаптер может быть расширен с переопределением метода getItems(). Эти адаптеры не извлекают все записи из базы данных для того, чтобы посчитать их. Вместо этого адаптеры используют исходный запрос для получения соответствующего COUNT-запроса, этот запрос выполняется для получения общего количества строк. Таким образом, производится еще один дополнительный запрос к базе данных, но это во много раз быстрее, чем извлечение всего результата и использование count(), особенно в случае больших объемов данных. Адаптеры баз данных будут пытаться строить наиболее эффективный запрос, который будет выполняться практически на всех современных СУРБД. Но в зависимости от используемой базы данных или даже выбранной структуры могут быть более эффективные пути получения количества строк. На этот случай адаптеры баз данных дают возможность устанавливать свой COUNT-запрос. Например, если вы фиксируете количество постов в блоге в отдельной таблице, то можете достичь более быстрого получения их количества, написав следующий код:
Этот подход может не дать большого выигрыша в производительности в случае небольшого объема данных или простых запросов на извлечение. Однако в случае сложных запросов и больших объемов данных подобный подход может дать значительный выигрыш в производительности. Рендеринг страниц через скрипты видовДля визуализации элементов страницы (если вы используете для этого Zend_Paginator) и отображения постраничной навигации используется скрипт вида. Поскольку Zend_Paginator реализует SPL-интерфейс » IteratorAggregate, то обход элементов и их отображение производится элементарно.
Обратите внимание, что в конце вызывается помощник вида. PaginationControl принимает экземпляр Zend_Paginator, стиль прокрутки, скрипт вида и массив дополнительных параметров. Второй и третий параметры очень важны. В то время как скрипт вида используется для определения внешнего вида постраничной навигации, стиль прокрутки определяет ее поведение. Предположим, скрипт вида отображает постраничную навигацию для результатов поиска следующего вида:
![]() Что должно происходить, если пользователь нажимает на ссылку "next" несколько раз? Действительно, тут может быть сколько угодно вариантов. Номер текущей страницы может оставаться в середине (как это реализовано, например, в Yahoo!) или перемещаться к концу ряда при каждом нажатии "next" и затем показываться снова с другого конца. Количество отображаемых номеров страниц может даже увеличиваться и уменьшаться, пока пользователь перемещается по ним (или "прокручивает" их), как это сделано в Google. Zend Framework предоставляет четыре стиля прокрутки:
Четвертый и последний параметр предназначается для ассоциативного массива дополнительных переменных, которые должны быть доступны в вашем скрипте вида (через $this). Например, эти значения могут включать в себя дополнительные параметры URL для подстановки в ссылки постраничной навигации. Установив используемые по умолчанию скрипт вида, стиль прокрутки и экземпляр вида, вы можете полностью исключить вызовы PaginationControl:
Если все эти значения установлены, то вы можете вывести постраничную навигацию в своем скрипте вида с помощью обычной конструкции echo:
Примеры постраничной навигацииНадеемся, следующие примеры помогут начать работать с Zend_Paginator: Постраничная навигация для результатов поиска:
Постраничная навигация для элементов:
Постраничная навигация в виде выпадающего списка:
Список свойствСледующие опции доступны внутри скрипта вида для постраничной навигации:
|