Système de pagination

Système de pagination

30 mar | Catégorie: PHP | Rédigé par François | 5036 lectures

Nous allons voir comment effectuer un système de pagination sur vos données (galerie d'images, articles, liste de commentaires, etc) à partir d'une base de données et d'une classe PHP.

 

 

 

Etape 1 : Création de la table

Bon pour ce tuto il nous faut de la matière, voici une table que vous pouvez reprendre, qui contient une vingtaine de lignes, assez pour travailler :)


Etape 2 : Notre classe Pagination

Pour ce tuto, nous allons utiliser une classe Pagination, qui n'est rien d'autre que 2 méthodes statiques. (Le fonctionnement est donc similaire aux fonctions). Voici son code:


Ne vous embettez pas à rentrer dans les détails de ce code, sachez juste qu'elle renvoie une div html, contenant la pagination à afficher. Pour la faire fonctionner, nous avons besoin de 5 paramètres:

  • $chemin qui est le nom de votre url (par exemple "maPage.php")
  • $nomGet qui sera le nom de votre variable passée en paramètre dans votre url (ex: index.php?numeroPage=2 renverra la 2ème page)
  • $total qui est le nombre total de pages
  • $courante qui est le numéro de la page sur laquelle on se trouve
  • $affichage qui équivaut au nombre d'éléments minimum à afficher de chaque côté de la page courante (ex: si on est à 3, cela donnera ceci: ...5 6 7 8 9 10 11...)

Etape 3 : Notre fichier à paginer

Vous l'aurez compris, il va falloir dans notre fichier PHP ou l'on veut afficher nos éléments connaître certaines valeurs énoncés précédemment comme le nombre total de pages. Voici la démarche à effectuer:

  1. Dans un premier temps nous allons compter le nombre d'éléments dans notre table (on utilisera pour ceci le mot clé COUNT(*) en SQL.
  2. Ensuite nous allons déduire le nombre total de pages en divisant le nombre d'items par le nombre d'items par page (j'ai choisi d'en afficher 2 par pages).
  3. Nous allons par la suite, identifier une variable qui correspondra au numéro de la page courante vu par l'utilisateur (il correspondra à $_GET['idPage'] et si ce dernier est nul, nous le mettrons par défault à 1)
  4. Nous exécuterons la requête qui permettra d'afficher les élements voulus en utilisant la clause LIMIT de SQL. La première valeur de LIMIT correspond à la pageCourante*le nombre d'items par page - le nombre d'items par page. La deuxième valeur correspond au nombre d'élements à afficher (ici cela correspond au nombre d'items par page).
  5. Pour finir nous afficherons le résultat de notre requête et éxécuterons notre fonction de pagination (tout en ayant au préalable inclus notre classe Pagination)

Voici le contenu de notre fichier que j'ai apellé très instinctivement: "index.php":


La partie PHP est dorénavant terminée, il ne reste plus qu'à styliser tout ça en CSS.

Etape 4 : La feuille de style CSS

Vous pouvez maintenant égayer un petit peu la pagination avec du CSS, voici un exemple de CSS sympa qui lui irait bien:


Creative Commons License
Cette création par Snoupix.com est mise à disposition selon les termes de la licence Creative Commons.
Partager ce tutoriel :
wikio scoopeo fuzz diggfr digg-design blogmemes delicious tapemoi yoolink bluegger pioche

32 Commentaires

gravatar
le 02 mai à 02h02 Jasse29 Répondre Bonsoir,

On retrouve dans ce tutoriel un contenu complémentaire au tutoriel vidéo que l'on retrouve sur le blog de GrafikArt.

Intéressant.
gravatar
le 24 mai à 02h46 NaetoH Répondre Moi j'ai un petit problème avec ce code, je l'ai modifier un petit peut et j'ai remarquer un bug.

Je l'utilise pour un systeme de commentaires, et lorsque j'ajoute un commentaires ma page et egal a commentaires.php?id=26 , 26 et le numero de la news (je lie l'id de la table news a news_id de la table comment.

Aucun problème tous marche avec la modif que j'ai fait.

Sauf que lorsque je veut utiliser la pagination la page passe de commentaires.php?id=26 a commentaires.php?idPage=2 , alors que moi j'aurai besoin de commentaires.php?id=26&idPage=2 mais je n'arrive pas a le modifier.
gravatar
le 24 mai à 03h03 NaetoH Répondre En faite j'ai reussi, il fallais transformer la commande :
Pagination::affiche('commentaires.php','idPage',$nbPages,$pageCourante,2);

en :

Pagination::affiche('commentaires.php','id='.$id.' idPage',$nbPages,$pageCourante,2);
gravatar
le 08 juin à 22h34 T.OM Répondre Bonsoir à tous,

Je voudrais savoir si possible de mettre plusieurs pages html déjà existant en pagination ou c'est inutil,

et si c'est faisable pourriez-vous m'expliquer comment faire s'il vous plait, car je ne connais rien en PHP et je débute en XHTML & CSS.


Merci bcp & A+.
gravatar
le 09 juin à 01h02 François Répondre Salut, en fait j'ai pas trop compris ce que tu demandais, tu veux mettre des liens vers des pages statiques dans ta pagination? Si c'est ca, il faudrait retoucher le code car il n'est pas prévu pour ca à la base, il sert juste à a paginer des données selon une table SQL.
gravatar
le 09 juin à 09h31 T.OM Répondre Merci pour ta réponse,


En faite, je voudrais savoir s'il est plus utile de faire une pagination ou non pour une partie de mon site qui a 10-20 pages statique
gravatar
le 09 juin à 11h20 François Répondre En fait c'est toujours mieux d'éviter de faire des pages statiques, au niveau de la maintenance du site c'est un peu la galère.
Après si ce sont des pages qui n'ont rien à voir entre elles je ne vois pas trop l'intérêt de la pagination. Ce que tu peux faire c'est quand même de mettre le contenu de tes pages dans une base de donnée, surtout si tu en as 20...
gravatar
le 09 juin à 11h41 T.OM Répondre C'est un site de collection des objets et la plupart des catégorie a entre 10-20 pages,

donc d'après ce que tu dis, j'imagine qu'il faut faire une pagination en PHP pour etre mieux.

le souci c'est que je ne connais rien en PHP, tu pourrais m'aider s'il te plait ? ou tu as un Tuto pour moi ?


Je te remercie bcp d'avance.
gravatar
le 09 juin à 11h43 T.OM Répondre J'ai oubilié de dire que les 10-20 pages sont dans la même catégorie et donc concernées entre elles.
gravatar
le 09 juin à 12h28 François Répondre Ce que tu peux faire, c'est d'aller voir ce tutoriel: http://grafikart.fr/tutoriels/video/gerer-news-php-43
Tres bien expliqué et en vidéos!
Tchao!
gravatar
le 09 juin à 15h33 T.OM Répondre Ok merci, je vais voir ça.
gravatar
le 19 juin à 18h23 samidev Répondre joliu tutorial j'ai des difficultés en poo je suis debutant dans le php 5 merci pour ce tuto
gravatar
le 19 juin à 18h25 samidev Répondre prk ce code $limitstart = $pageCourante*$itemsParPage-$itemsParPage;
sa donnera 0 !!
gravatar
le 19 juin à 21h51 François Répondre Il donnera pas 0 car la multiplication est prioritaire par rapport à la soustraction, donc ca équivaut à ca: ($pageCourante*$itemsParPage)-$itemsParPage;
Ce qui vaudrait 0 uniquement si $pageCourante = 1 ce qui est logique puisque sur la première page on affiche à partir du début (0)
Sinon il faudrait que $itemsParPage = 0... et là je ne vois pas l'interêt^^
gravatar
le 19 juin à 23h28 samidev Répondre merci françois , ça marche mais j'ai un petit soucie le dernier enregistrement ou la dernière page son numéro ne s'affiche pas j'ai 4 page alor que dans la pagination il n'ya que 1.2.3
gravatar
le 19 juin à 23h41 François Répondre Rebonjour!
Vérifie bien ta variable $nbPages... si elle vaut vraiment 3 c'est qu'il y'a un soucis dans ton calcul de $nbPages...Sinon je ne vois pas...
gravatar
le 19 juin à 23h54 samidev Répondre dsl pour le dérangement , j'ai fait echo $nbpages et il m'a donner 3.5 c'est ça le problème il me donne un nombre de type float
gravatar
le 20 juin à 00h02 samidev Répondre lol wéééééééééé j'ai resolue le problème avec la fonction ceil wink merciiiii françois
en faite moi samir du maroc
gravatar
le 21 juin à 18h53 sami dev Répondre bonjour fronçois scp comment ajouter un autre paramétre sur le lein des pages
comme prodcat.php?idpage=2&cat=portable
gravatar
le 21 juin à 19h12 samidev Répondre ouffff après des heures de travail j'ai réussie à ajouter un autre paraméte dans le lein des pages

voici la partie à modifier dans la class.pagination.php
public static function lien($chemin,$texte,$parametre='',$valeur=''){

$cat=$_GET['cat'];

$lien = '<a href="'.$chemin;

if(!empty($parametre))
$lien .= '?'.$parametre.'='.$valeur.'&cat='.$cat;

$lien .= '">'.$texte.'</a>';
return $lien;
}
gravatar
le 31 août à 06h23 maya Répondre merci samidev j'avais le même problème que toi et j lé résolut grâce a ta fonction ceil
gravatar
le 11 septembre à 09h53 Fabinounours Répondre Bonjour, déjà merci pour ce code.
Mais j'aurais une question. Ne serait-il pas possible de faire la même chose mais au lieu que ce soit à partir d'une BDD, le faire à partir d'un fichier CSV.
Je ne sais pas trop comment m'y prendre, mais personnellement je dois effectuer la même chose sur un fichier csv de 200 000 lignes. Il me faut un affichage rapide. J'avais pensé exploiter votre solution..
gravatar
le 12 septembre à 12h03 François Répondre Salut! Y'a aussi des solutions pour lire des fichiers texte en PHP et lire chaque ligne une par une ... essaye de voir sur php.net les fonction fopen et fread...a+
gravatar
le 15 septembre à 12h38 Des Répondre Salut! Tout dabord merci pour ce tuto! J'ai testai le script mais j'ai une erreur Parse error: syntax error, unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or '}' in /home/sites/pagination/class.pagination.php on line 17.
Ca correspond a cette ligne:
public static function affiche($chemin,$nomget,$total,$courante=1,$affichage=2){

Je vois pas d'ou ca viens. As tu une idée?

Merci
gravatar
le 18 septembre à 00h47 François Répondre Salut!
C'est probablement du à ton serveur, vérifie bien que tu es en PHP 5...
gravatar
le 29 octobre à 10h17 Ninouparadise Répondre Salut, Moi j'ai un pb, la pagination ne s'affiche pas... Comment ça se fais?
gravatar
le 22 janvier à 23h55 milounis Répondre un grand merci pour le tuto, il est parfait c exactement se que je voulé comme résultat avec ma pagination sur mes pages de résultats, chapeau pour son auteur, et encore merci
gravatar
le 24 mai à 15h48 Diana Répondre Bravo pour votre site, très bons tutos wink
gravatar
le 26 mai à 16h51 kiwi Répondre bonjour alors la chapeau ,c'est le tutoriel le plus complet que j'ai vu actuelement sur la pagination,je suis vraiment ravie d'être tomber dessus encore bravo..

J'ai un petit souci quand même mais la c'est de la faute a mon incompétence lol

si je veux que la dernière news enregistrer soit la première sur la première page et non l inverse parceque la ça enregistre la dernière news sur la dernière page ..
C'est possible ?ou est que je le glisse mon order by

Merci d'avance pour la réponse si il y a.
gravatar
le 26 mai à 17h15 kiwi Répondre HONTE A MOI
desolé c'était vraiment tout simple

$requete = 'SELECT * FROM commentaires ORDER BY id DESC LIMIT '.$limitstart.','.$itemsParPage.'';
gravatar
le 11 juin à 11h56 Allan Répondre bonjour tout le monde,
felicitation en tout cas pour le tuto , il est genial...
Seulement j'ai un petit probleme...je l'integre tout , j'ai aucun probleme. J'ai géré une interface admin qui me permet d'ajouter des news afin de simplifier la mise a jour du site. et pour eviter d'avoir une page de trois pieds de long en rajoutant ces " blocs "' j'ai utilisé la pagination.
J'ai parametré de sorte a n'avoir que trois blocs par page. Seulement si j'ai que 4 blocs.. et bin sur ma deuxieme page, il va m'afficher mon bloc n'2 n'3 et n'4. Je me retrouve donc sur mon site avec les blocs 2 et 3 en double..et moi sur ma deuxieme page j'aimerai que mon bloc 4.. est ce possible ?
gravatar
le 11 juin à 11h58 Allan Répondre et merci d'avance , je continue a chercher de mon coté
allan
( ps j'ai envoyé le message un peu trop rapidement dsl )

Requête en cours, veuillez patienter...

Ajouter un commentaire