Документация

Начало работы

Модели (models)

Шаблоны (views) и маршрутизация (routes)

Формы

SQL запросы

Сессии и безопасность

Плагины

Постраничная разбивка

Для разделения списка записей на страницы в любой модели можно создать объект класса "Pager". Для этого необходимо вызвать метод "runPager($total, $limit)", где "$total" - общее количество записей в таблице, а "$limit" - количество записей на страницу.

Параметр "$total" можно получить путем подсчета записей методом "countTotal()", и также необходимо знать на каой странице списка мы находимся в данный момент. Для этого в объекте "$mv -> router" есть метод "defineCurrentPage($start_key)".

Пример содержания шаблона "view-events.php"

//Подсчет активных записей (событий) в таблице (если не передавать массив
//с параметрами будут посчитаны все записи)
$total_active = $mv -> events -> countRecords(array("active" => 1));

//Определение текущей страницы
$current_page = $mv -> router -> defineCurrentPage(1);

//Запуск разбивки по 5 записей на страницу 
$mv -> events -> runPager($total_active, 5, $current_page);

При определение текущей страницы, параметр "$start_key" равный "1" говорит о возможной позиции номера страницы в URL. В данном случае мы имеем дело со ссылками вида "events/page/2/","events/page/3/" и указываем маршрутизатору где в URL искать начало конструкции вида "page/номер страницы/". В нашем случае определение страницы начинается после части "events", т.е. с элемента массива с индексом 1 (под индексом 0 стоит "events"). Например для сыылок вида "catalog/books/page/2/" параметр "$start_key" будет равен 2.

Также в метод "defineCurrentPage" можно передать имя GET параметра в котором может быть номер текущей страницы.

//Для URL вида "/news/?page=3" 
$current_page = $mv -> router -> defineCurrentPage("page");

Таким образом, теперь в функцию вывода событий в модели "Events" мы можем добавить постраничную разбивку. Более подробно об извлечении записей написано в разделе Конструктор запросов.

public function displayEvents()
{
    $rows = $this -> select(array("order->desc" => "date", "limit->" => $this -> pager -> getParamsForSelect()));
    $html = "";
    ...
}

Для вывода списка ссылок на другие страницы используется метод "display($path, $smart [,$extra_params])" класса "Pager".
Описание параметров:

  • $path - URL к которому будут добавляться номера страниц ("news", "catalog/books/") к нему в начале добавляется путь от корня проекта
  • $smart - при значении "1" к "$path" будут добавлены параметры вида "page/3/" (true), при "0" (false) - вида "page=3"
  • $extra_params - (необязательный) дополнительные параметры к URL ("active/", "sort=price&order=desc")
<div class="pager">
    <? echo $mv -> events -> pager -> display($mv -> root_path."events/", 1); ?>    
</div>

Итоговый вид шаблона "view-events.php"

<?
$total_active = $mv -> events -> countRecords(array("active" => 1));
$mv -> events -> runPager($total_active, 5, $mv -> router -> defineCurrentPage(1));
include $mv -> views_path."main-header.php";
?>

<div id="content">
    <? echo $mv -> events -> display(); ?>
    <div class="pager">
        <? echo $mv -> events -> pager -> display($mv -> root_path."events/", 1); ?>    
    </div>         
</div>

<?
include $mv -> views_path."main-footer.php";
?>

Методы объекта Pager

  • getTotal(), getLimit(), getStart() - возвращают соответственно общее количество элементов, лимит на страницу, порядковый номер первого элемента в текущем интервале
  • setLimit($limit), setTotal($total) - устанавливают лимит и общее количество элементов (пересчитывают интервалы)
  • getIntervals() - количество интервалов, полученное как общее количество / лимит на страницу
  • getPage() - номер текущей страницы (интервала)
  • display($path, $smart [, $extra_params]) - вывод списка страниц (описан выше)
  • displayLimits($limits, $path [, $options]) - выводит список ссылок с GET параметрами вида "pager-limit=10", $limits - одномерный массив целочисленных значений, $path - начальный URL, к которому добавляются GET параметры. Если передать необязательный параметр $options в виде "options", то вместо ссылок будут выведены опции для тэга select.
  • hasPages() - проверяет есть ли интервалы (количество интервалов > 1)
  • checkPrevNext($type) - проверяет есть ли следующая / предыдущая страница от текущей, параметр $type должен иметь значение "next" или "prev"
  • displayPrevLink($caption, $path) - выводит ссылку на предыдущую страницу если она существует, $caption - текст ссылки, $path - url, к которому будет добавлен параметр вида "page=3"
  • displayNextLink($caption, $path) - аналогично предыдущей функции выводит ссылку на следующую страницу
  • addUrlParams($path) - добавляет GET параметр вида "page=7" (текущую страницу) к переданному URL, самостоятельно подставляет знак "?" или "&" в зависимости от надобности. Обычно используется для переброски параметоров постраничной разбивки в другие модули (сортировщик, фильтр).
  • getUrlParams() - возвращает GET параметр вида "page=12" (текущую страницу), если общее количество страниц больше 1
<?
$limits = array(8, 16, 32, 64);

if(isset($_GET["pager-limit"]) && in_array($_GET["pager-limit"], $limits))
    $limit = $_SESSION["pager-limit"] = intval($_GET["pager-limit"]);
else if(isset($_SESSION["pager-limit"]) && in_array($_SESSION["pager-limit"], $limits))
    $limit = intval($_SESSION["pager-limit"]);
else
    $limit = 16;

$count_products = $mv -> products -> countRecords(array("active" => 1, "parent" => $catalog -> id));
$current_page = $mv -> router -> defineCurrentPage("page");
$mv -> products -> runPager($count_products, $limit, $current_page);

$pager_url = $mv -> root_path."catalog/45/"; 
?>

<div id="pager-and-limiter">
    <div class="limiter">
        Объектов на странице:
        <? echo $mv -> products -> pager -> displayLimits($limits, $pager_url); ?>
    </div>
    <div class="pager">
        Страница
        <?
            echo $mv -> products -> pager -> displayPrevLink("предыдущая", $pager_url);
            echo $mv -> products -> pager -> display($pager_url, false);
            echo $mv -> products -> pager -> displayNextLink("следующая", $pager_url);
        ?>
    </div>
</div>

Предыдущий раздел

Прямые запросы

Следующий раздел

Сортировка