pagination - petit coup de pouce

Par kendzo, il y a 11 ans


Bonjour à toutes et à tous

Je voudrais faire un systeme de pagination "avancé" mais je bute sur un problème je pense simple pourtant je ne parviens pas à trouver une solution tout seul
Alors j'ai suivi le tuto sur la pagination hein

$req1 = mysql_query($sql1) or die(mysql_error()); $data1 = mysql_fetch_assoc($req1); $nbArt = $data1['nbArt']; $perPage = 1; // nombre d'éléments par page $nbPage = ceil ($nbArt / $perPage); $nombredepaquetdepage = ceil ($nbPage / 10); $cPage = 1 ; // defini la première page a afficher $lastPage = ((int)(($nbArt + $perPage - 1) / $perPage )); // calcul de la dernière page. if(isset($_GET['p']) && $_GET['p'] > 0 && $_GET['p'] <= $nbPage){ $cPage = $_GET['p']; }else{ $cPage = 1; }

$lastPage = numéro de la dernière page
$cPage = page courante
La pagination affiche des paquets de 10 pages/ sur les 18 qui me servent de test :
[1][2][3][4][5][6][7][8][9][10]
puis
[10][11][12][13][14][15][16][17][18]

if($cPage<=(($lastPage-$lastPage)+9)){ for($i=1; $i<=10; $i++){ echo'<a href="../region/Recherche.php?p='.$i.'">'; if ($i==$cPage){ echo'<div id="rectangle_pagination_page_active">'.$i.'</div></a>'; }else{ echo '<div id="rectangle_pagination">'.$i.'</div></a>'; } } } if(($cPage>(($lastPage-$lastPage)+9)) AND ($cPage<$lastPage)){ for($i=10; $i<=$lastPage; $i++){ echo'<a href="../region/Recherche.php?p='.$i.'">'; if ($i==$cPage){ echo'<div id="rectangle_pagination_page_active">'.$i.'</div></a>'; }else{ echo '<div id="rectangle_pagination">'.$i.'</div></a>'; } } }

Comment faire pour que si il y a "n" pages de résultat par exemple, comment faire pour que la pagination affiche à chaque fois "n" paquets de 10 pages ?

Merci d'avance pour votre aide

31 réponses

betaWeb, il y a 11 ans

Tu peux faire ça avec une boucle, en comptant le nombre d'itérations sur ton tableau contenant toutes tes pages, et à chaque dizaine, tu incrémentes une variable de 1, tout en stockant chaque élément du tabelau dans un tableau global. Un exemple sera plus explicite:

$c = 1; // compteur $groupe_count = 10; // nombre de pages par "groupe de pages" $groupes = []; // tableau qui contiendra les groupes de pages par 10 for ($i = 0; $i < count($pages); $i++) { if ($i === ($groupe_count * $c)) { $c++; } array_push($groupes[$c], $pages[$i]); }

Je n'ai pas testé mais je pense que ça pourrait fonctionner.

kendzo, il y a 11 ans

Merci Cyprien, je vais tester ça ce soir et je te tiens au courant, merci

kendzo, il y a 11 ans

Alors j'ai remplacé

count($pages)

par $nbpages car je pense que tu voulais la valeur du nombre de page total

$c = 1; // compteur $groupe_count = 10; // nombre de pages par "groupe de pages" $groupes = []; // tableau qui contiendra les groupes de pages par 10 for ($i = 0; $i < $nbpages; $i++) { if ($i === ($groupe_count * $c)) { $c++; } array_push($groupes[$c], $nbpages[$i]); }

Comment je peut afficher les valeurs du array push ?

betaWeb, il y a 11 ans

La fonction array_push empile un ou plusieurs éléments à la fin d'un tableau: http://php.net/manual/fr/function.array-push.php

Ici, le tableau cible est $groupes, donc il te suffit de faire un var_dump($groupes) après la boucle:

$c = 1; /* compteur */ $groupe_count = 10; /* nombre de pages par "groupe de pages" */ $groupes = []; /* tableau qui contiendra les groupes de pages par 10 */ for ($i = 0; $i < $nbpages; $i++) { if ($i === ($groupe_count * $c)) { $c++; } array_push($groupes[$c], $nbpages[$i]); } var_dump($groupes);

Attention: var_dump() te sert uniquement à déboguer.

kendzo, il y a 11 ans

Merci Cyprien

Le principe semble bon puisque j'obtient une réponse de 3 paquets(de 10pages)
array(3) { [1]=> NULL [2]=> NULL [3]=> NULL }

Comment faire pour afficher les numéros de page correspondant ? par exemple pour
array[1]=> page1 page2 page3 page4 page5 page6 page7 page8 page9 page10
array[2]=> page11 page12 page13 page14 page15 page16 page17 page18 page19 page20
array[3]=> page21 page22 page23 ...
array[4]=> ....

Merci pour ton aide

betaWeb, il y a 11 ans

Petite correction (erreur de ma part j'en suis désolé):

$c = 1; /* compteur */ $groupe_count = 10; /* nombre de pages par "groupe de pages" */ $groupes = []; /* tableau qui contiendra les groupes de pages par 10 */ for ($i = 0; $i < $nbpages; $i++) { if ($i === ($groupe_count * $c)) { $c++; } array_push($groupes[$c], $i); }

En ce qui concerne ta dernière question, pourquoi veux-tu préfixer les numéros de pages avec le mot "page" ?

kendzo, il y a 11 ans

merci
j'ai fait la modif et j'ai le même résultat (pour 23 pages):
array(3) { [1]=> NULL [2]=> NULL [3]=> NULL }
a priori le tableau contient bien 3 groupes ce qui est juste.

Je me suis mal exprimé il me faut juste les numéros de page :
array[1]=> 1 2 3 4 5 6 7 8 9 10
array[2]=> 11 12 13 14 15 16 17 18 19 20
array[3]=> 21 22 23 ...
array[4]=> ....

betaWeb, il y a 11 ans

juste avant la boucle (for), fais un var_dump($nbpages) et colle-moi le résultat stp.

kendzo, il y a 11 ans

voici le résultat du var_dump($nbpages);

float(23)

betaWeb, il y a 11 ans

Essaye de caster la variable $nbpages pour la convertir en INT (c'est étonnant que ça soit en FLOAT d'ailleurs) :

$c = 1; /* compteur */ $groupe_count = 10; /* nombre de pages par "groupe de pages" */ $groupes = []; /* tableau qui contiendra les groupes de pages par 10 */ for ($i = 0; $i < (int)$nbpages; $i++) { if ($i === ($groupe_count * $c)) { $c++; } array_push($groupes[$c], $i); }
kendzo, il y a 11 ans

toujours :
array(3) { [1]=> NULL [2]=> NULL [3]=> NULL }

et j'ai testé var_dump($groupes[$c]);
et j'obtiens NULL

et j'ai testé aussi (bon tu te rends compte que je suis un peu largué sur ce coup là hein) mais on sais jamais ça peut te donner des idées :

<code> for ($i = 0; $i < (int)$nbpages ; $i++) {
var_dump($nbpages);
if ($i === ($groupe_count * $c)) {
$c++;
}
array_push($groupes[$c], $i);

}
var_dump($groupes);
</code>

pour le var_dump($nbpages) :
et j'obtiens 23 fois float(23)
float(23) float(23) float(23) float(23) float(23) float(23) float(23) float(23) float(23) float(23) float(23) float(23) float(23) float(23) float(23) float(23) float(23) float(23) float(23) float(23) float(23) float(23) float(23)

et pour le var_dump($groupes) :
NULL

kendzo, il y a 11 ans

Je viens de faire ceci :

$c = 1; // compteur $groupe_count = 10; // nombre de pages par "groupe de pages" $groupes = []; // tableau qui contiendra les groupes de pages par 10 $nbpages = ((int)($nbPage)); var_dump($nbpages); for ($i = 0; $i < $nbpages ; $i++) { if ($i === ($groupe_count * $c)) { $c++; } array_push($groupes[$c], $i); } var_dump($groupes);

et j'obtiens :
int(23)
array(3) { [1]=> NULL [2]=> NULL [3]=> NULL }

betaWeb, il y a 11 ans

La variable $nbPages = 23.0 était là pour mon test, il te faut bien évidemment la supprimer ;)

Pour quelle raison veux-tu ton tableau formaté de cette façon spécifique ?

kendzo, il y a 11 ans

Ben en fait j'ai besoin de faire une pagination comme google...

betaWeb, il y a 11 ans

Fais plutôt ceci:

$groupes = []; // tableau qui contiendra les groupes de pages par 10 $nbPage = 23.0; $nbpages = (int)$nbPage; $groupe_count = 10; // nombre de pages par "groupe de pages" $limit = ceil($nbPage / $groupe_count); for ($i = 1; $i <= $limit; $i++) { if ($i < $limit) { $groupes[$i] = $groupe_count; continue; } $groupes[$i] = $nbpages % $groupe_count; } print_r($groupes);

La variable $groupe contient les différents groupes de pages par 10 (par exemple ici, si tu as 23 pages, il y aura 3 groupes: 210 et 13, ce qui totalise 23).

Après tu n'as plus qu'à faire une boucle sur ce tableau, comme ceci:

foreach ($groupes as $pages){ foreach ($pages as $page){ // ici ton code pour générer une pagination HTML par exemple } }
kendzo, il y a 11 ans

je vais tester ç ce soir je te ferais le retour de la manip

merci infiniment pour ton aide

kendzo, il y a 11 ans

J'ai suprimé nbPages = 23.0 ; car le nombre de pages ne sera jamais fixe. $nbPage est déjà défini plus haut dans le code il compte simplement le nombre de pages. Ca, j'ai suivit la vidéo, je le gère bien.

a présent j'ai ça :

$groupes = []; // tableau qui contiendra les groupes de pages par 10 $nbpages = (int)$nbPage; $groupe_count = 10; // nombre de pages par "groupe de pages" $limit = ceil($nbPage / $groupe_count); for ($i = 1; $i <= $limit; $i++) { if ($i < $limit) { $groupes[$i] = $groupe_count; continue; } $groupes[$i] = $nbpages % $groupe_count; print_r($groupes); foreach ($groupes as $pages){ foreach ($pages as $page){ echo $page . '<br />'; } } }

j'obtient Array ( [1] => 10 [2] => 10 [3] => 3 ) avec le print_r($groupes);
et quand je veux afficher les pages, je n'obtiens rien c'est vide ?!

Tu sais, il me fallait faire ceci :
array[1]=> 1 2 3 4 5 6 7 8 9 10
array[2]=> 11 12 13 14 15 16 17 18 19 20
array[3]=> 21 22 23 ...
array[4]=> ....

Qu'en penses-tu ?

betaWeb, il y a 11 ans

Alors essayes ceci:

/** * Déclaration des variables & constantes **/ $groupes = []; // tableau qui contiendra les groupes de pages par 10 $nbPage = 23.0; $nbpages = (int)$nbPage; $groupe_count = 10; // nombre de pages par "groupe de pages" $limit = ceil($nbPage / $groupe_count); /** * Boucle générant les groupes de pages par 10 **/ for ($i = 1; $i <= $limit; $i++) { if ($i < $limit) { $groupes[$i] = $groupe_count; continue; } $groupes[$i] = $nbpages % $groupe_count; } /** * Boucle générant la pagination (juste pour avoir une idée du résultat) **/ foreach ($groupes as $k => $pages){ echo "Groupe de pages" . ($k + 1) . ":<br>"; for ($i = 1; $i <= $pages; $i++) { echo "Page " . $i . "<br>"; } }

Côté HTML ça pourrait donner ceci (par exemple):

/** * Boucle générant la pagination côté HTML (avec le style du Twitter Bootstrap) **/ <?php foreach ($groupes as $k => $pages): ?> <ul class="pagination"> <li> <a href="#" aria-label="Previous"> <span aria-hidden="true">&laquo;</span> </a> </li> <?php for ($i = 1; $i <= $pages; $i++): ?> <li><a href="#"><?= $i ?></a></li> <?php endfor; ?> <li> <a href="#" aria-label="Next"> <span aria-hidden="true">&raquo;</span> </a> </li> </ul><br> <?php endforeach; ?>

Mais je ne comprends pas bien l'intérêt de stocker chaque numéro de page dans un tableau alors qu'il suffit de faire une boucle afin de générer une pagination. D'ailleurs tu peux faire une fonction qui te renverrait le HTML directement formaté en fonction de la page sur laquelle tu te trouves ;)

kendzo, il y a 11 ans

Je trouve sa fou ça à l'air tellement facile pour toi ... :-) on y est presque ! on touche du doigt !
J'ai gardé ceci car ca correspond le plus à ce qu'il faut

/** * Déclaration des variables & constantes **/ $groupes = []; // tableau qui contiendra les groupes de pages par 10 $nbpages = (int)$nbPage; $groupe_count = 10; // nombre de pages par "groupe de pages" $limit = ceil($nbPage / $groupe_count); /** * Boucle générant les groupes de pages par 10 **/ for ($i = 1; $i <= $limit; $i++) { if ($i < $limit) { $groupes[$i] = $groupe_count; continue; } $groupes[$i] = $nbpages % $groupe_count; } /** * Boucle générant la pagination (juste pour avoir une idée du résultat) **/ foreach ($groupes as $k => $pages): ?> <ul class="pagination"> <li> <a href="#" aria-label="Previous"> <span aria-hidden="true">&laquo;</span> </a> </li> <?php for ($i = 1; $i <= $pages; $i++): ?> <li><a href="#"><?= $i ?></a></li> <?php endfor; ?> <li> <a href="#" aria-label="Next"> <span aria-hidden="true">&raquo;</span> </a> </li> </ul><br> <?php endforeach;

Tu sais il faudrais que si on est sur une page entre 1 et 10 ça affiche 1 2 3 4 5 6 7 8 9 10
puis si on clique sur la page 10 ça affiche 10 11 12 13 14 15 16 17 18 19 20 (c'est à dire la suite de la pagination)
puis si on clique sur la page 20 ça affiche 20 21 22 23 24 25 26 27 28 29 30
puis si on clique sur la page 30 ça affiche 30 31 32 33 34 35 36 37 38 39 40
...

Tu vois c'est pour sa que je cherchais à faire des paquets de 10 pages

kendzo, il y a 11 ans

Bonjour lapin-math, le lien pointe sur une page introuvable !?

kendzo, il y a 11 ans

ok merci je regarde ça et je vous fait un retour...

kendzo, il y a 11 ans

ok alors j'ai téléchargé les fichiers nécessaires
J'ai placé la classe Pagination sur le serveur

J'ai fait l'intégration comme ceci :
require_once '../php/Pagination.class.php';

j'ai déclaré les constantes comme ceci :

$page = isset($_GET['p']) ? ((int) $_GET['p']) : 1; $pagination = (new Pagination()); $pagination->setCurrent($page); $pagination->setTotal($nbPage);

J'ai fait un var_dump($pagination);

voici ce que j'obtiens :
object(Pagination)#1 (1) { ["_variables":protected]=> array(12) { ["classes"]=> array(2) { [0]=> string(8) "clearfix" [1]=> string(10) "pagination" } ["crumbs"]=> int(5) ["rpp"]=> int(10) ["key"]=> string(4) "page" ["target"]=> string(0) "" ["next"]=> string(12) "Next »" ["previous"]=> string(16) "« Previous" ["alwaysShowPagination"]=> bool(false) ["clean"]=> bool(false) ["get"]=> array(0) { } ["current"]=> int(1) ["total"]=> float(23) } }

Je ne comprends pas tout mais Je remarque que la fonction compte bien le nombre de pages ["total"]=> float(23) sa c'est juste. Donc là j'ai bon espoir

puis j'ai placé la ligne $markup = $pagination->parse(); je pense qu'elle est censé afficher la pagination.
J'ai fait var_dump($markup);
et la j'obtiens : string(0) ""

avez vous une idée ?

betaWeb, il y a 11 ans

Tu t'embêtes bien la vie, prends plutot le bout de code que je t'ai laissé ça ira plus vite crois-moi ;)

kendzo, il y a 11 ans

oui je voudrais bien il me manque juste de pouvoir :
si on est sur une page entre 1 et 10 il faudrais que ça affiche 1 2 3 4 5 6 7 8 9 10
puis si on clique sur la page 10 il faudrais que ça affiche 10 11 12 13 14 15 16 17 18 19 20 (c'est à dire la suite de la pagination)
puis si on clique sur la page 20 il faudrais que ça affiche 20 21 22 23 24 25 26 27 28 29 30
puis si on clique sur la page 30 il faudrais que ça affiche 30 31 32 33 34 35 36 37 38 39 40
ect ...
et sa je vois pas comment le faire. Ce que tu m'as donné fonctionne seulement sa affiche :
1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 1 2 3

l4p1n, il y a 11 ans

Personnellement, je calcule combien de lignes que je dois sauter dans la table et demander au serveur SQL de récup les données

<?php $rpp = 20; // Nombre d'enregistrement par page // On est sur quelle page ? $page = (!empty($_GET['page']) ? $_GET['page'] - 1: 0; // Calcul du nombre de lignes à sauter et le nombre total d'enregistrements $skip = $page * $rpp; // Récupération des données. Je suppose qu'il existe un objet PDO du nom de $db $rows = $db->query("SELECT * FROM ma_table LIMIT $skip, $rpp"); $rowcount = $db->query('SELECT COUNT(*) AS c FROM ma_table')->fetchAll()[0]['c']; // On construit notre pagination $pagination = new Pagination($page, $rowcount); $pagination->setRPP($rpp); $pagination_html = $pagination->parse();

Et il te reste à afficher le code HTML retourné par $pagination->parse()

skp, il y a 11 ans

Bonjour, j'ai fait quelque chose rapidement en espérant que ça réponde à ton besoin :

function pagination($page, $totalPage) { $start = 1; $end = $totalPage > 10 ? 10 : $totalPage; if(strlen($page) > 1) { $start = substr($page, 0, -1)."0"; $end = $totalPage > ($start + 10) ? $start + 10 : $totalPage; } return [ "current" => $page, "start" => $start, "end" => $end]; } $pagination = pagination(1, 25); echo "<br/>Pagination : "; for($i = $pagination["start"]; $i <= $pagination["end"]; $i++) { echo $i == $pagination["current"] ? "<strong>$i</strong> -" : "$i - "; } echo "<br/>Fin pagination"; $pagination = pagination(11, 25); echo "<br/>Pagination : "; for($i = $pagination["start"]; $i <= $pagination["end"]; $i++) { echo $i == $pagination["current"] ? "<strong>$i</strong> -" : "$i - "; } echo "<br/>Fin pagination"; $pagination = pagination(25, 25); echo "<br/>Pagination : "; for($i = $pagination["start"]; $i <= $pagination["end"]; $i++) { echo $i == $pagination["current"] ? "<strong>$i</strong> -" : "$i - "; } echo "<br/>Fin pagination";
kendzo, il y a 11 ans

halala vraiment merci pour votre aide à tous, je teste tout ça ce soir puis je vous fait un retour

kendzo, il y a 11 ans

Bonsoir à toutes et à tous, merci pour votre aide et particulièrement à Cyprien voici la solution qui approche beaucoup de ce que je recherhais et saist'on jamais ça peux servir à quelqu'un d'autre.

echo '<a href="../CP/Recherche.php?p=1"><div id="contient_pagination_debut">&laquo;</div></a>'; echo '<a href="../CP/Recherche.php?p='.($cPage-10).'"><div id="contient_pagination_debut">&lsaquo;</div></a>'; for($i=1; $i <= $nbPage; $i++){ /*si i est inférieur ou égal au nombre de page de debut et fin ou bien si i est supérieur au nombre total d'annonce moins $nbr*/ if($i > $cPage-5 && $i < $cPage+5){ if($i == $cPage) { echo "<center><div id='rectangle_pagination_page_active'> $i </div></center>"; }else{ echo "<center><div id='contient_pagination'><a href=\"../CP/Recherche.php?p=$i\"><div id='rectangle_pagination'> $i </div></a></div></center>"; } } } echo '<a href="../CP/Recherche.php?p='.($cPage+10).'"><div id="contient_pagination_fin">&rsaquo;</div></a>'; echo '<a href="../CP/Recherche.php?p='.$lastPage.'"><div id="contient_pagination_fin">&raquo;</div></a>';