5.5 Постраничный вывод списков
Класс pager предназначен для постраничного вывода коллекций объектов. Он автоматически получает из запроса номер текущей страницы, и также автоматически добавляет в запрос LIMIT с нужными параметрами. Приведём прототип конструктора пейджера:
public function __construct($baseurl, $page, $perPage, $roundItems = 2, $reverse = false)
$baseurl- базовый урл, тот урл, на который будут ссылаться страницы пейджера. Переменная page в эту ссылку подставляется автоматически.$page- номер текущей страницы.$perPage- число элементов на странице.$roundItems- число номеров страниц, выводимых вокруг текущего номера.$reverse- обратная нумерация.
Для использования пейджера — необходимо подключить плагин pagerPlugin к мапперу, который будет получать коллекцию:
fileLoader::load('modules/pager/plugins/pagerPlugin'); $pager = new pager('/news', 10, 10); $mapper->attach(new pagerPlugin($pager)); $newsArray = $newsMapper->searchAll();
Для упрощения процесса добавления пейджера, в класс simpleController добавлен специальный метод setPager:
<?php class simpleController { [...] /** * Метод установки пейджера для получаемой коллекции объектов * * @param mapper $item маппер, который возвращает требуемую коллекцию объектов * @param integer $per_page число объектов на странице * @param boolean $reverse флаг, изменяющий порядок страниц на противоположный (от больших к меньшим) * @param integer $round_items число выводимых номеров страниц рядом с текущим (Например: ... 4 5 6 _7_ 8 9 10 ... -> $roundItems = 3) * @return pager */ public function setPager(mapper $mapper, $per_page = 20, $reverse = false, $round_items = 2) { fileLoader::load('modules/pager/plugins/pagerPlugin'); $pager = new pager($this->request->getRequestUrl(), $this->request->getInteger('page', SC_REQUEST), $per_page, $round_items, $reverse); $mapper->attach(new pagerPlugin($pager)); $this->smarty->assign('pager', $pager); return $pager; } } ?>
Как видно из реализации - для установки пейджера достаточно лишь передать маппер, который будет извлекать данные. Пример использования этого метода (класс newsListController:
<?php class newsListController extends simpleController { protected function getView() { $newsFolderMapper = $this->toolkit->getMapper('news', 'newsFolder'); $path = $this->request->getString('name'); $newsFolder = $newsFolderMapper->searchByPath($path); if (empty($newsFolder)) { return $this->forward404($newsFolderMapper); } $config = $this->toolkit->getConfig('news'); $this->setPager($newsFolderMapper, $config->get('items_per_page'), true); $this->smarty->assign('news', $newsFolderMapper->getItems($newsFolder)); $this->smarty->assign('folderPath', $newsFolder->getTreePath()); $this->smarty->assign('rootFolder', $newsFolderMapper->searchByPath('root')); $this->smarty->assign('newsFolder', $newsFolder); return $this->smarty->fetch('news/list.tpl'); } } ?>
После этого - нужно передать пейджер в шаблон, в случае если пейджер устанавливается вручную. Если пейджер устанавливается методом simpleController'а, то этого делать не нужно. Затем в шаблоне следует расположить следующий код:
{$pager->toString()}
Это выведет в нужном месте пейджер. Сам шаблон пейджера находится в www/templates/pager.tpl, естественно изменять его вы можете как вам требуется:
{add file="pager.css"} <span class="pageNumber">{if !is_null($pager->getPrev())}<a href="{$pager->getPrev()}">Предыдущая</a>{else}Предыдущая{/if}</span> {foreach from=$pages item=current} <span class="pageNumber">{if not empty($current.skip)}...{elseif not empty($current.current)} <strong>{$current.page}</strong> {else} <a href="{$current.url}">{$current.page}</a> {/if}</span> {/foreach} <span class="pageNumber">{if !is_null($pager->getNext())}<a href="{$pager->getNext()}">Следующая</a>{else}Следующая{/if}</span>