Stránkování výsledků databáze
Při tvorbě webových aplikací se velmi často setkáte s požadavkem na omezení počtu vypsaných položek na stránce.
Vyjdeme ze stavu, kdy vypisujeme všechna data bez stránkování. Pro výběr dat z databáze máme třídu
ArticleRepository, která kromě konstruktoru obsahuje metodu findPublishedArticles
, která vrací všechny
publikované články seřazené sestupně podle data publikace.
V presenteru si pak injectujeme modelovou třídu a v render metodě si vyžádáme publikované články, které předáme do šablony:
V šabloně default.latte
se pak postaráme o výpis článků:
Tímto způsobem umíme vypsat všechny články, což však začne působit problémy v momentě, kdy počet článků vzroste. V tom okamžiku se příjde vhod implementace stránkovacího mechanismu.
Ten zajistí, že se všechny články rozdělí do několika stránek a my zobrazíme jen články jedné aktuální stránky. Celkový počet stránek a rozdělení článků si vypočte Paginator sám podle toho, kolik článků celkem máme a kolik článků na stránku chceme zobrazit.
V prvním kroku si upravíme metodu pro získání článků ve třídě repositáře tak, aby nám uměla vracet jen články pro jednu stránku. Také přidáme metodu pro zjištění celkového počtu článku v databázi, kterou budeme potřebovat pro nastavení Paginatoru:
Následně se pustíme do úprav presenteru. Do render metody budeme předávat číslo aktuálně zobrazené stránky. Pro případ, kdy nebude toto číslo součástí URL, nastavíme výchozí hodnotu první stránky.
Dále také render metodu rozšíříme o získání instance Paginatoru, jeho nastavení a výběru správných článků pro zobrazení v šabloně. HomePresenter bude po úpravách vypadat takto:
Šablona nám už nyní iteruje jen nad články jedné stránky, stačí nám přidat stránkovací odkazy:
Takto jsme doplnili stránku o možnost stránkování pomocí Paginatoru. V případě, kdy namísto Nette Database Core jako databázovou vrstvu použijeme Nette Database Explorer, jsme schopni implementovat stránkování i bez
použití Paginatoru. Třída Nette\Database\Table\Selection
totiž obsahuje metodu page s logikou stránkování převzatou
z Paginatoru.
Repozitář bude při tomto způsobu implementace vypadat takto:
V presenteru nemusíme vytvářet Paginator, použijeme místo něj metodu třídy Selection
, kterou nám vrací
repositář:
Protože do šablony nyní neposíláme Paginator, upravíme část zobrazující stránkovací odkazy:
Tímto způsobem jsme implementovali stránkovací mechanismus bez použití Paginatoru.