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->getPageIndex(); // номер текущей страницы, нумерованный с 0
$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(),
);
Пример использования в приложении вы найдете в кулинарной книге Пагинация результатов базы данных.