Az adatbázis-eredmények lapozása
Webalkalmazások fejlesztése során gyakran találkozunk azzal a követelménnyel, hogy egy oldalon korlátozott számú rekordot kell kinyomtatni.
Ebből az állapotból akkor jövünk ki, ha az összes adatot lapozás nélkül listázzuk ki. Az adatbázisból való
adatkiválasztáshoz rendelkezésünkre áll az ArticleRepository osztály, amely tartalmazza a konstruktort és a
findPublishedArticles
metódust, amely az összes megjelent cikket a megjelenés dátuma szerinti csökkenő
sorrendben rendezve adja vissza.
A Presenterben ezután befecskendezzük a modell osztályt, és a render metódusban lekérdezzük a publikált cikkeket, amelyeket átadunk a sablonhoz:
A default.latte
sablon ezután gondoskodik a cikkek felsorolásáról:
Ez azonban problémákat okoz, ha a cikkek száma nő. Ekkor hasznos lesz a lapozási mechanizmus megvalósítása.
Ez biztosítja, hogy az összes cikket több oldalra osztjuk, és csak az egyik aktuális oldal cikkeit fogjuk megjeleníteni. Az oldalak teljes számát és a cikkek elosztását maga az Paginator számítja ki, attól függően, hogy összesen hány cikkünk van és hány cikket szeretnénk megjeleníteni az oldalon.
Első lépésben módosítjuk a cikkek kinyerésére szolgáló metódust a tároló osztályban, hogy csak egyoldalas cikkeket adjon vissza. Emellett hozzáadunk egy új metódust az adatbázisban lévő cikkek teljes számának lekérdezéséhez, amire szükségünk lesz a Paginator beállításához:
A következő lépés a bemutató szerkesztése. Az aktuálisan megjelenített oldal számát továbbítjuk a render metódusnak. Abban az esetben, ha ez a szám nem része az URL-nek, akkor az alapértelmezett értéket az első oldalra kell beállítanunk.
A render metódust kibővítjük a Paginator példány megszerzésével, beállításával és a sablonban megjelenítendő megfelelő cikkek kiválasztásával is. A HomePresenter így fog kinézni:
A sablon már egy oldalon belül iterálja a cikkeket, csak a lapozási linkeket kell hozzáadni:
Így adtunk hozzá oldalszámozást a Paginator segítségével. Ha a Nette
Database Core helyett a
Nette Database Explorer-t használjuk adatbázis-rétegként, akkor Paginator nélkül is képesek vagyunk a lapozás
megvalósítására. A Nette\Database\Table\Selection
osztály tartalmazza a Paginatorból átvett paginálási
logikával rendelkező page
metódust.
A tároló így fog kinézni:
Nem kell Paginátort létrehoznunk a Presenterben, helyette az adattár által visszaadott Selection
objektum
metódusát fogjuk használni:
Mivel nem használunk Paginator-t, meg kell szerkesztenünk a lapozási linkeket megjelenítő részt:
Így Paginator használata nélkül valósítottunk meg egy lapozási mechanizmust.