Постраничная разбивка
Для разделения списка записей на страницы в любой модели можно создать объект класса "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>
Предыдущий раздел
Прямые запросы