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