Страница на резултатите от заявките за база данни
Когато разработвате уеб приложения, често се сблъсквате с изискването за извеждане на ограничен брой записи на една страница.
Излизаме от състояние, в което изписваме всички данни без страниране.
За да изберем данни от базата данни, разполагаме с класа 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, трябва да редактираме раздела, показващ връзките за страниране:
По този начин реализирахме механизъм за страниране, без да използваме пейджинатора.