Σελιδοποίηση αποτελεσμάτων βάσης δεδομένων
Κατά την ανάπτυξη εφαρμογών ιστού, συχνά συναντάτε την απαίτηση να εκτυπώσετε έναν περιορισμένο αριθμό εγγραφών σε μια σελίδα.
Βγαίνουμε από την κατάσταση όταν παραθέτουμε όλα τα δεδομένα χωρίς
σελιδοποίηση. Για την επιλογή δεδομένων από τη βάση δεδομένων, έχουμε
την κλάση ArticleRepository, η οποία περιέχει τον κατασκευαστή και τη μέθοδο
findPublishedArticles
, η οποία επιστρέφει όλα τα δημοσιευμένα άρθρα
ταξινομημένα κατά φθίνουσα σειρά ημερομηνίας δημοσίευσης.
Στον Presenter στη συνέχεια εισάγουμε την κλάση model και στη μέθοδο render θα ζητήσουμε τα δημοσιευμένα άρθρα που θα περάσουμε στο template:
Το πρότυπο default.latte
θα αναλάβει στη συνέχεια την καταχώριση των
άρθρων:
Με αυτόν τον τρόπο, μπορούμε να γράψουμε όλα τα άρθρα, αλλά αυτό θα προκαλέσει προβλήματα όταν ο αριθμός των άρθρων αυξηθεί. Σε εκείνο το σημείο, θα είναι χρήσιμο να υλοποιήσουμε τον μηχανισμό σελιδοποίησης.
Αυτό θα διασφαλίσει ότι όλα τα άρθρα θα χωρίζονται σε διάφορες σελίδες και θα εμφανίζουμε μόνο τα άρθρα μιας τρέχουσας σελίδας. Ο συνολικός αριθμός των σελίδων και η κατανομή των άρθρων υπολογίζεται από το ίδιο το Paginator, ανάλογα με το πόσα άρθρα έχουμε συνολικά και πόσα άρθρα θέλουμε να εμφανίσουμε στη σελίδα.
Στο πρώτο βήμα, θα τροποποιήσουμε τη μέθοδο για τη λήψη άρθρων στην κλάση repository ώστε να επιστρέφει μόνο άρθρα μιας σελίδας. Θα προσθέσουμε επίσης μια νέα μέθοδο για να πάρουμε το συνολικό αριθμό των άρθρων στη βάση δεδομένων, τον οποίο θα χρειαστούμε για να ορίσουμε ένα Paginator:
Το επόμενο βήμα είναι να επεξεργαστούμε τον παρουσιαστή. Θα προωθήσουμε τον αριθμό της τρέχουσας σελίδας που εμφανίζεται στη μέθοδο render. Στην περίπτωση που αυτός ο αριθμός δεν αποτελεί μέρος της διεύθυνσης URL, πρέπει να ορίσουμε την προεπιλεγμένη τιμή στην πρώτη σελίδα.
Επεκτείνουμε επίσης τη μέθοδο render για να λάβουμε την περίπτωση Paginator, να τη ρυθμίσουμε και να επιλέξουμε τα σωστά άρθρα που θα εμφανίζονται στο πρότυπο. Το HomePresenter θα μοιάζει με αυτό:
Το πρότυπο επαναλαμβάνει ήδη τα άρθρα σε μία σελίδα, απλά προσθέστε συνδέσμους σελιδοποίησης:
Αυτό είναι το πώς έχουμε προσθέσει σελιδοποίηση χρησιμοποιώντας
Paginator. Εάν χρησιμοποιείται ο Nette Database
Explorer αντί του Nette Database Core ως επίπεδο
βάσης δεδομένων, είμαστε σε θέση να υλοποιήσουμε τη σελιδοποίηση ακόμη
και χωρίς Paginator. Η κλάση Nette\Database\Table\Selection
περιέχει τη μέθοδο page με λογική
σελιδοποίησης που λαμβάνεται από το Paginator.
Το αποθετήριο θα έχει την εξής μορφή:
Δεν χρειάζεται να δημιουργήσουμε Paginator στο Presenter, αντίθετα θα
χρησιμοποιήσουμε τη μέθοδο του αντικειμένου Selection
που
επιστρέφεται από το αποθετήριο:
Επειδή δεν χρησιμοποιούμε το Paginator, πρέπει να επεξεργαστούμε το τμήμα που εμφανίζει τους συνδέσμους σελιδοποίησης:
Με αυτόν τον τρόπο, υλοποιήσαμε έναν μηχανισμό σελιδοποίησης χωρίς τη χρήση Paginator.