Пагинация результатов запроса к базе данных
При разработке веб-приложений вы часто сталкиваетесь с требованием выводить на странице ограниченное количество записей.
Мы выходим из состояния, когда перечисляем все данные без пагинации.
Для выбора данных из базы данных у нас есть класс ArticleRepository, который
содержит конструктор и метод findPublishedArticles
, возвращающий все
опубликованные статьи, отсортированные в порядке убывания даты
публикации.
Затем в презентере мы вводим класс модели и в методе render
запрашиваем опубликованные статьи, которые передаем в шаблон:
Шаблон default.latte
позаботится о перечислении статей:
Таким образом, мы можем написать все статьи, но это вызовет проблемы, когда количество статей вырастет. В этот момент будет полезно реализовать механизм пагинации.
Это обеспечит разбиение всех статей на несколько страниц, и мы будем показывать только статьи одной текущей страницы. Общее количество страниц и распределение статей рассчитывается самим Paginator, в зависимости от того, сколько статей у нас всего и сколько статей мы хотим отобразить на странице.
На первом этапе мы изменим метод получения статей в классе репозитория, чтобы он возвращал только одностраничные статьи. Мы также добавим новый метод для получения общего количества статей в базе данных, который нам понадобится для установки Paginator:
Следующим шагом будет редактирование презентера. Мы передадим номер
текущей отображаемой страницы в метод render
. В случае, если этот
номер не является частью URL, нам нужно установить значение по умолчанию
для первой страницы.
Мы также расширяем метод render
для получения экземпляра Paginator,
его настройки и выбора нужных статей для отображения в шаблоне. HomePresenter
будет выглядеть следующим образом:
Шаблон уже итерирует статьи на одной странице, просто добавьте ссылки пагинации:
Вот как мы добавили пагинацию с помощью Paginator. Если вместо Nette Database Explorer в качестве слоя базы данных
используется Nette Database Core, мы можем
реализовать подкачку даже без Paginator. Класс Nette\Database\Table\Selection
содержит метод page с
логикой пагинации, взятой из Paginator.
Репозиторий будет выглядеть следующим образом:
Нам не нужно создавать Paginator в презентере, вместо этого мы будем
использовать метод объекта Selection
, возвращаемый репозиторием:
Так как мы не используем Paginator, нам нужно отредактировать раздел, показывающий ссылки пагинации:
Таким образом, мы реализовали механизм пагинации без использования пагинатора.