Paginator
Нужно разбить вывод данных на страницы? Поскольку арифметика пагинации бывает коварной, вам поможет Nette\Utils\Paginator.
Установка:
composer require nette/utils
Создадим объект пагинатора и зададим несколько базовых сведений:
$paginator = new Nette\Utils\Paginator;
$paginator->setPage(1); // номер текущей страницы
$paginator->setItemsPerPage(30); // число элементов на странице
$paginator->setItemCount(356); // общее число элементов (если известно)
Страницы нумеруются начиная с 1. Это можно изменить методом
setBase():
$paginator->setBase(0); // нумерация с 0
Теперь объект предоставляет все основные сведения, нужные для создания элементов пагинации. Например, вы можете передать его в шаблон и использовать там.
$paginator->isFirst(); // мы на первой странице?
$paginator->isLast(); // мы на последней странице?
$paginator->getPage(); // номер текущей страницы
$paginator->getFirstPage(); // номер первой страницы
$paginator->getLastPage(); // номер последней страницы
$paginator->getFirstItemOnPage(); // порядковый номер первого элемента на странице
$paginator->getLastItemOnPage(); // порядковый номер последнего элемента на странице
$paginator->getBase(); // база нумерации страниц (по умолчанию 1)
$paginator->getPageCount(); // общее число страниц
$paginator->getItemsPerPage(); // число элементов на странице
$paginator->getItemCount(); // общее число элементов (если известно)
Пагинатор помогает в составлении SQL-запросов. Методы getLength() и
getOffset() возвращают значения, используемые в конструкциях
LIMIT и OFFSET:
$result = $database->query(
'SELECT * FROM items LIMIT ? OFFSET ?',
$paginator->getLength(),
$paginator->getOffset(),
);
Если вам нужна пагинация в обратном порядке (то есть страница
1 соответствует наибольшему смещению), используйте
getCountdownOffset():
$result = $database->query(
'SELECT * FROM items LIMIT ? OFFSET ?',
$paginator->getLength(),
$paginator->getCountdownOffset(),
);
Пример использования в приложении можно найти в рецепте Постраничный вывод результатов из базы данных.