Sommaire
Affichage de la pagination (view)
Quand nous récupérons des informations de notre base de donnée, si il y en a peu, tout va bien
mais si nous avons de nombreux résultats, nous voudrons les afficher sur plusieurs pages.
Dans cet exemple nous allons afficher tous nos utilisateurs.
Pour ce qui est de l'affichage, celui ci ne changera pas d'un affichage classique, je vous laisse
donc aller voir le cours sur le CRUD.
Ici nous allons juste ajouter en bas (ou en haut) de notre page, un menu de navigation avec en
GET le numéro de la page choisi :
<nav>
<ul>
<!-- la classe hide offre par exemple un "display: none" dans le cas où on est sur la première page -->
<li class="<?= ($currentPage <= 1) ? "hide" : "" ?>">
<a href="./?page=<?= $currentPage - 1 ?>">Précédente</a>
</li>
<?php for($page = 1; $page <= $totalPages; $page++): ?>
<!-- On affiche un lien par page -->
<li class="<?= ($currentPage == $page) ? "active" : "" ?>">
<a href="./?page=<?= $page ?>"><?= $page ?></a>
</li>
<?php endfor ?>
<!-- la classe hide est affiché dans le cas où on est sur la dernière page -->
<li class="<?= ($currentPage >= $totalPages) ? "hide" : "" ?>">
<a href="./?page=<?= $currentPage + 1 ?>">Suivante</a>
</li>
</ul>
</nav>
Les variables présente ici seront défini dans le contrôleur.
Définition des variables (controlleur)
La première étape est de définir sur quelle page nous somme, on va en premier lieu vérifier si on nous donne une page en paramètre et sinon sélectionner la page 1.
include("../models/user-model.php");
// si la page nous est donné en GET, alors on la selectionne, sinon on prend la page 1.
if(isset($_GET['page']) && !empty($_GET['page'])){
$currentPage = (int) strip_tags($_GET['page']);
}else{
$currentPage = 1;
}
Il serait bon de vérifier que l'on nous donne pas non plus une page étrange. Mais je vous laisse faire cela vous même.
Ensuite nous allons définir nos différentes variables :
- $totalUsers contiendra le nombre total d'utilisateur que compte notre BDD.
- $parPage contiendra le nombre d'utilisateur que l'on souhaite afficher sur chaque page.
- $totalPages contiendra le nombre total de page que l'on possèdera.
- $premier contiendra le chiffre du premier utilisateur à afficher sur la page en cours.
- $users contiendra tout les utilisateurs à afficher sur la page en cours.
// On récupère le total d'utilisateur qu'on souhaite afficher
$totalUsers = (int) countTotal()["total"];
// On détermine le nombre que l'on souhaite afficher par page :
$parPage = 10;
// On calcul le nombre total de page
$totalPages = ceil($totalUsers / $parPage);
// On calcul le premier utilisateur de la première page
$premier = ($currentPage * $parPage) - $parPage;
// Puis on récupère seulement les utilisateurs que l'on souhaite afficher sur la page courante.
$users = getPage($premier, $parPage);
Fonctions de compte et de pagination (modèle)
Nous possèdons les différents paramètres de notre page, il ne nous reste plus qu'à récupérer les
informations dont on a besoin.
En premier lieu, le nombre total d'utilisateur dans notre BDD.
function countTotal(){
// On appelle notre fonction connexion();
$pdo = connexion();
$prep = $pdo->query("SELECT COUNT(*) AS total FROM `user`;");
return $prep->fetch();
}
Le mot clef "COUNT" permet de compter les résultats et avec le mot clef "AS" on lui donne un indice dans le tableau de résultat facilement retrouvable.
Ensuite nous allons faire notre READ de la BDD avec une subtilité en plus par rapport à quand on les selectionne tous.
function getPage($premier, $parPage){
// On appelle notre fonction connexion();
$pdo = connexion();
$prep = $pdo->prepare('SELECT * FROM `user` ORDER BY `username` DESC LIMIT :premier, :parpage;');
$prep->bindValue(':premier', $premier, PDO::PARAM_INT);
$prep->bindValue(':parpage', $parPage, PDO::PARAM_INT);
$prep->execute();
return $prep->fetchAll();
}
Via le mot clef "LIMIT", on indique que l'on veut prendre les résultats qu'à partir d'un chiffre
précis, ici donné dans la variable "$premier".
Et que l'on veut en prendre qu'un nombre limité, ici indiqué par la variable "$parPage".
Dans notre exemple, en page 1 nous prendrons les résultats de 0 à 9.
En page 2 les résultats de 10 à 19 et ainsi de suite.