Paginazione dei risultati del database
Quando si sviluppano applicazioni Web, capita spesso di dover stampare un numero limitato di record in una pagina.
Si esce da questo stato quando si elencano tutti i dati senza paginazione. Per selezionare i dati dal database, abbiamo la
classe ArticleRepository, che contiene il costruttore e il metodo findPublishedArticles
, che restituisce tutti gli
articoli pubblicati ordinati in ordine decrescente di data di pubblicazione.
Nel Presenter iniettiamo poi la classe Model e nel metodo render chiediamo gli articoli pubblicati che passiamo al template:
Il modello default.latte
si occuperà di elencare gli articoli:
In questo modo, possiamo scrivere tutti gli articoli, ma questo causerà problemi quando il numero di articoli crescerà. A quel punto, sarà utile implementare il meccanismo di paginazione.
In questo modo, tutti gli articoli saranno suddivisi in più pagine e verranno mostrati solo gli articoli di una pagina corrente. Il numero totale di pagine e la distribuzione degli articoli sono calcolati da Paginator stesso, a seconda di quanti articoli abbiamo in totale e di quanti articoli vogliamo visualizzare nella pagina.
Nel primo passo, modificheremo il metodo per ottenere gli articoli nella classe repository, in modo da restituire solo articoli a pagina singola. Aggiungeremo anche un nuovo metodo per ottenere il numero totale di articoli nel database, che ci servirà per impostare un Paginator:
Il passo successivo è modificare il presentatore. Inoltreremo il numero della pagina attualmente visualizzata al metodo render. Nel caso in cui questo numero non faccia parte dell'URL, occorre impostare il valore predefinito alla prima pagina.
Espandiamo inoltre il metodo render per ottenere l'istanza di Paginator, impostandola e selezionando gli articoli corretti da visualizzare nel template. HomePresenter avrà questo aspetto:
Il template itera già gli articoli in una pagina, basta aggiungere i link di paginazione:
Ecco come abbiamo aggiunto la paginazione utilizzando Paginator. Se si utilizza Nette Database Explorer al posto di Nette Database Core come livello di database, siamo in grado di implementare la
paginazione anche senza Paginator. La classe Nette\Database\Table\Selection
contiene il metodo page con la logica di paginazione presa
da Paginator.
Il repository avrà questo aspetto:
Non è necessario creare il Paginator nel Presenter, ma si utilizzerà il metodo dell'oggetto Selection
restituito
dal repository:
Poiché non usiamo il Paginator, dobbiamo modificare la sezione che mostra i link di paginazione:
In questo modo, abbiamo implementato un meccanismo di paginazione senza usare il Paginator.