Пагінація результатів запиту до бази даних
Під час розробки веб-додатків ви часто стикаєтеся з вимогою виводити на сторінці обмежену кількість записів.
Ми виходимо зі стану, коли перераховуємо всі дані без пагінації. Для
вибору даних із бази даних у нас є клас 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, нам потрібно відредагувати розділ, що показує посилання пагінації:
Таким чином, ми реалізували механізм пагінації без використання пагінатора.