Pagination automatique pour liste multipage

Soyez le premier à donner votre avis sur cette source.

Snippet vu 11 959 fois - Téléchargée 29 fois

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

Ajouter un commentaire Commentaires
Messages postés
61
Date d'inscription
vendredi 11 mars 2005
Statut
Membre
Dernière intervention
13 avril 2010

Bonsoir tous le monde ,
et Merci Isengard pour ce code trés utile,
tu peux expli ca svp:

$page_begin = ($page_precedente - 1) * $maxpages;

???? pourquoi multiplier sur le nombre d'affichage sur page et pourquoi le -1.
Messages postés
2
Date d'inscription
mardi 15 juillet 2003
Statut
Membre
Dernière intervention
11 juin 2006

Tout d'abord en grand merci à isengard pour cette source qui fonctionne et qui est très utile ^^

Pour saharam72 , pour l'affichage des résultats -dans le cadre d'un forum- il suffit de faire un while :

makeListLink(mysql_num_rows($result),20,"liste.php?variable=mavaleur",3);
while ($row = mysql_fetch_array($result)) {

et tu mets l'affichage de ta page ici

sinon explications sur l'appel de la fonction d'après ce que j'en est fait :

makeListLink(mysql_num_rows($result),20,"liste.php?variable=mavaleur",3);

le premier parametre est tout simplement le num rows de ta requete

le second tu mets $max_row_by_page qui est la variable qui indique combien de messages apparaitront sur une page

le troisieme est tout simplement le lien vers laquelle pointeront les chiffres lorsque tu cliqueras dessus, par exemple dans mon cas lorsque tu accedes à un sujet, le lien ressemble à lire.php?forum=1&id=2. c'est donc à toi d'adapter selon tes besoins, ce qu'il voulait dire par "liste.php?variable=mavaleur" c'est que tu dois simplement mettre les variables dont tu as besoin en get, rien d'extraordianaire !

le quatrieme parametre est bien décris dans l'explication, c'est le nombre de chiffre qui entoureront la page actuelle.

j'espere que ca t'auras éclairé un minimum !
++
Messages postés
3
Date d'inscription
mardi 18 novembre 2003
Statut
Membre
Dernière intervention
6 mai 2006

Merci niko14 d'avoir répondu aussi vite à ma requete..
bon à vrais dire je préfére le 1er code et j'arrive bien à le comprendre..c'est pas ça le probléme.
en plus je trouve pas mal d'exemples de codes de pagination sur internet mais malheuresement comme le tient ils n'expliquent pas comment afficher le résultat de la requete sur chaque page web.
bon je pense que je dois faire plus d'effort de ma part et approfondir mes connaissance en php avant de ce lancer sur la pagination :)
merci a+
Messages postés
209
Date d'inscription
jeudi 12 janvier 2006
Statut
Membre
Dernière intervention
10 octobre 2014

slt saharam72
Si ca te pose problememoi j'ai trouvé ce code la qui est pas mal du tout pour faire de la pagination:

<?php

$nombreDeMessagesParPage = 5; // Le nombre de news sur chaque page
// On récupère le nombre total de messages
$retour = mysql_query('SELECT COUNT(id_lien) AS nb_liens FROM liens');
$donnees = mysql_fetch_array($retour);
$totalDesMessages = $donnees['nb_liens'];


// On calcule le nombre de pages à créer

$nombreDePages = ceil($totalDesMessages / $nombreDeMessagesParPage);


if (isset($_GET['num_page']))

{

$page = $_GET['num_page']; // On récupère le numéro de la page indiqué dans l'adresse (news.php?num_page=4)

}

else // La variable n'existe pas, c'est la première fois qu'on charge la page

{

$page = 1; // On se met sur la page 1 (par défaut)

}

// On calcule le numéro du premier message qu'on prend pour le LIMIT de MySQL
$premierMessageAafficher = ($page - 1) * $nombreDeMessagesParPage;
$reponse = mysql_query("SELECT id_lien, adresse_lien, entreprise_lien, recap_entrep_lien FROM liens ORDER BY id_lien LIMIT " . $premierMessageAafficher . ', ' . $nombreDeMessagesParPage);


// Requête SQL

$i = 0;

?>

<?php



// On fait une boucle pour lister tout ce que contient la table :


while ($data = mysql_fetch_array($reponse) )

{

$i++;
?>
-[http://<?php echo $data[1]; ?> <?php echo ucfirst($data[2]); ?>]-

<?php echo ucfirst(nl2br($data[3])); ?>


<hr />
<?php


if($i == 4)

{

echo "</tr><tr>";

$i = 0;

}

}

?>

Page :

<?

for ($i = 1 ; $i <= $nombreDePages ; $i++)

{
if ($i==$page)
{
echo '[index.php?action=liens&num_page=' . $i . ' ' . $i . '] ';
}
else
{
echo '[index.php?action=liens&num_page=' . $i . ' ' . $i . '] ';
}
}
?>
Messages postés
3
Date d'inscription
mardi 18 novembre 2003
Statut
Membre
Dernière intervention
6 mai 2006

1er je suis débutant en php
2éme j'arrive pas à utiliser votre code. vous n'expliquez pas l'affichage des resultas.
l'exemple makeListLink(mysql_num_rows($result),20,"liste.php?variable=mavaleur",3);
n'est pas clair.
svp plus de détails sur (liste.php?variable=mavaleur).
j'éspere que vous allez répondre vite à ma requete car j'ai tellement besoin d'un code de pagination pour ma cite web et j'arrive pas à trouver
Afficher les 13 commentaires

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.