Pagination automatique pour liste multipage

Contenu du snippet

Cette fonction a pour but de faciliter et d'automatiser un minimum l'affichage des liens pour les listes qui s'étendent sur plusieurs pages. Par exemple lorsqu'on selectionne des élements dans une base de données et qu'on obtient 500 réponses à afficher, on a pas envie d'afficher les 500 réponses sur la même page (ou alors le chargement sera très long et la consultation sera fastidieuse...).

Pour ceux qui ne voient toujours pas, la fonction créé des liens dans le genre :
Pages : 1 ... 2 3 [4] 5 6 ... 7

Voila donc une petite fonction qui automatise tout ça. La fonction :
- Affiche en permanence un lien vers la première et la dernière page
- Affiche la page actuelle en gras
- Entoure la page actuelle d'un nombre de pages précédentes et de pages suivantes prédéfinies
- Met des ... lorsque la suite logique des pages est rompue

Les paramètres sont les suivants :
$nombre_total => Le nombre total d'éléments à afficher (toutes pages confondues, souvent le resultat de la fonction mysql_num_rows(); )
$max_row_by_page => Le nombre d'éléments par page
$link => Le lien qui sera affiché (le lien vers la page de liste)
$border => Le nombre de pages précédentes et suivantes qui entoureront la page actuelle

Source / Exemple :


function makeListLink($nombre_total,$max_row_by_page,$link,$border){
		/* 	$nombre_total 		=> Nombre total d'éléments à afficher sur toutes les pages
		 							Exemple : 150 éléments
			$max_row_by_page 	=> Nombre d'éléments par page
									Exemple : 10 éléments par page (=> 15 pages)
		 	$link 				=> Adresse de la page qui liste
									Exemple : liste.php?mavariable=mavaleur
			$border				=> Nombre de liens autour du lien de la page actuelle
									Exemple : 3 (=> 1 ... 5 6 7 [8] 9 10 11 ... 25)
									Exemple : 2 (=> 1 ... 6 7 [8] 9 10 ... 25)
									Exemple : 1 (=> 1 ... 7 [8] 9 ... 25)
		
		Synthaxe de la requete à mettre sur la page qui liste :
		=======================================================
		
		$max_row_by_page = <Valeur mise pour $max_row_by_page dans la fonction>;
		if((!isset($_GET['begin'])) || (!is_numeric($_GET['begin']))) {
			// Si la variable begin a une valeur étrange on commence au début de la liste
			$requete = "SELECT mes_champs FROM ma_table ORDER BY mon_champ ASC LIMIT ".$max_row_by_page."";
		} else {
			$requete = "SELECT mes_champs FROM ma_table ORDER BY mon_champ ASC LIMIT ".$_GET['begin'].",".$max_row_by_page."";
		}

  • /
// Calcul du nombre de pages necessaires // Ceil = fonction arrondir au nombre supérieur // Ex : 4,6 pages necessaire => 5 pages affichées $nombre_page_necessaire = ceil($nombre_total / $max_row_by_page); // Calcul de la page actuelle $page_actuelle = ($_GET['begin'] / $max_row_by_page) +1; $first_link = 1; echo "<strong>Pages :</strong> "; if($page_actuelle!=1){ // Si la page actuelle n'est pas la première, on peut afficher la premiere page' // Première page echo "<a href='".$link."&begin=0'>1</a>"; $first_link = 0; } if($page_actuelle > $border +2 ) { // Si la page actuelle est plus loin que la bordure et la première page, on met des ... echo "..."; } for($y=0;$y<=($border-1);$y++) { $z = $border - $y; if($page_actuelle > ($z + 1)){ // Affichage des pages précédentes selon le $border défini if($first_link != 1) { echo " "; } $page_precedente = $page_actuelle - $z; $page_begin = ($page_precedente - 1) * $max_row_by_page; echo "<a href='".$link."&begin=".$page_begin."'>".$page_precedente."</a>"; $first_link = 0; } } // Affichage page actuelle if($first_link != 1) { echo " "; } $page_begin = ($page_actuelle - 1) * $max_row_by_page; echo "<strong>[".$page_actuelle."]</strong>"; $first_link = 0; for($y=1;$y<=$border;$y++) { $z = $border - $y; if($page_actuelle < ($nombre_page_necessaire-$y)) { // Affichage des pages suivantes selon le $border défini if($first_link != 1) { echo " "; } $page_suivante = $page_actuelle + $y; $page_begin = ($page_suivante - 1) * $max_row_by_page; echo "<a href='".$link."&begin=".$page_begin."'>".$page_suivante."</a>"; $first_link = 0; } } if($page_actuelle < ($nombre_page_necessaire - ($border +1))) { // Si la page actuelle et sa bordure n'atteignent pas la dernière page, on met des ... echo "..."; } if($page_actuelle != $nombre_page_necessaire ) { // La page actuelle est avant la derniere page, donc on affiche la derniere page // Dernière page if($first_link != 1) { echo " "; } $page_begin = ($nombre_page_necessaire - 1) * $max_row_by_page; echo "<a href='".$link."&begin=".$page_begin."'>".$nombre_page_necessaire."</a>"; } }

Conclusion :


Attention ! Il faut adapter la requete à la base de données avec le critère LIMIT sinon ça n'a aucun interet !

Un tit exemple de requete :
$max_row_by_page = <Valeur mise pour $max_row_by_page dans la fonction>;
if((!isset($_GET['begin'])) || (!is_numeric($_GET['begin']))) {
// Si la variable begin a une valeur étrange ou n'est pas définie on commence au début de la liste
$requete = "SELECT mes_champs FROM ma_table ORDER BY mon_champ ASC LIMIT ".$max_row_by_page."";
} else {
$requete = "SELECT mes_champs FROM ma_table ORDER BY mon_champ ASC LIMIT ".$_GET['begin'].",".$max_row_by_page."";
}
Exemple d'appel de la fonction :
makeListLink(mysql_num_rows($result),20,"liste.php?variable=mavaleur",3);

C'est une petite fonction comme ça pour faciliter la tache, elle peut sans aucun doute être améliorée :) Si il y a des erreurs ou des améliorations à faire, des suggestions ou des critiques je suis preneur :D

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.