MZZ.Framework 0.3.x: Документация
Разделы

5.5 Постраничный вывод списков

Класс pager предназначен для постраничного вывода коллекций объектов. Он автоматически получает из запроса номер текущей страницы, и также автоматически добавляет в запрос LIMIT с нужными параметрами. Приведём прототип конструктора пейджера:

public function __construct($baseurl, $page, $perPage, $roundItems = 2, $reverse = false)

Для использования пейджера — необходимо подключить плагин 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)}&nbsp;<strong>{$current.page}</strong>&nbsp;{else}&nbsp;<a href="{$current.url}">{$current.page}</a>&nbsp;{/if}</span>
{/foreach}
<span class="pageNumber">{if !is_null($pager->getNext())}<a href="{$pager->getNext()}">Следующая</a>{else}Следующая{/if}</span>