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
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">«</div></a>';
echo '<a href="../CP/Recherche.php?p='.($cPage-10).'"><div id="contient_pagination_debut">‹</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">›</div></a>';
echo '<a href="../CP/Recherche.php?p='.$lastPage.'"><div id="contient_pagination_fin">»</div></a>';
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.
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 ?
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.
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
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" ?
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]=> ....
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);
}
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
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 }
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
}
}
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 ?
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 ?
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">«</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">»</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 ;)
je vais tester ç ce soir je te ferais le retour de la manip
merci infiniment pour ton aide
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">«</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">»</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
Euh... Y'aurait pas une [https://github.com/onassar/PHP-Pagination](lib sur GitHub) qui le fait très bien ?
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 ?
Tu t'embêtes bien la vie, prends plutot le bout de code que je t'ai laissé ça ira plus vite crois-moi ;)
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
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()
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";
halala vraiment merci pour votre aide à tous, je teste tout ça ce soir puis je vous fait un retour