Modification de pagination pour limiter le nombre de pages

Eléphanteau du PHP | 30 Messages

23 sept. 2010, 17:39

Bonjour,
J'ai un script de pagination et je souhaiterais modifier la partie de la barre de navigation afin de l'adapter pour afficher uniquement 5 pages avant la page en cours et 5 pages après la page en cour, voici le code de la barre de navigation
Les variables:
$page: Variable qui contient la page en cours
$nb_pages: Variable qui contient le nombre total de pages.

Ma barre de navigation contien un lien suivant et précédent selon le nombre de pages affichés.

Code : Tout sélectionner

if($page >= 2) { $prec = $page-1; echo "<a class=\"pagin_prec\" href=\"?lang=$lang&r=$r&page=$prec\"><IMG class=\"pagin\" SRC=\"images/prec.png\"></a>&nbsp;"; } // Boucle sur les pages for ($i = 1 ; $i <= $nb_pages ; $i++) { if ($i == $page ) echo "<span class=\"lien_page1\">$i</span>&nbsp;"; else echo "<a class=\"lien_page\" href=\"?lang=$lang&r=$r&page=$i\">$i</a>&nbsp;"; } if($page < $nb_pages) { $suiv = $page+1; echo "<a class=\"pagin_suiv\" href=\"?lang=$lang&r=$r&page=$suiv\"><IMG class=\"pagin\" SRC=\"images/suiv.png\"></a>"; }
Merci de votre aide

Mammouth du PHP | 19672 Messages

23 sept. 2010, 18:04

Il faut dans ce cas définir les limites début et fin de ta boucle for dynamiquement.

Tu as défini un maximum de 5 pages avant la page affichée et un maxi de 5 pages après.
Définis deux variables : $d (début) et $f (fin)
À priori, $d sera égal à $page -5 : sauf que, si $page - 5 est inférieur à 1, dans ce cas, $d doit être égal à 1;
Même raisonnement pour $f : $f doit être égal à $page + 5 sauf que si ($page + 5) est supérieur à $nb_pages, alors $f vaudra nb_pages.

Et là, tu modifie ta boucle for :
au lieu de $i = 1, tu ais $i = $d;
au lieu de $i <= $nb_pages, tu mets $i <= $f;

Et le tour est joué ;)
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Petit nouveau ! | 9 Messages

23 sept. 2010, 18:06

Oui voilà, j'étais en train de te préparer plus ou moins la même chose lol
if($page>=1)
{
	$PremPage = $page - 5;
	if($PremPage>=1)
		$PageDepart = $PremPage;
	else
		$PageDepart = 1;
	echo "Pages : ";
	for($i=$PageDepart;$i<$page;$i++)
		echo "<a class=\"pagin_prec\" href=\"?lang=$lang&r=$r&page=$i\">$i</a>&nbsp;";
}
//Page en cours
  echo "<span class=\"lien_page1\">$page</span>&nbsp;";
if($page<=$nb_pages)
{
	$DerPage = $page + 5;
	if($DerPage<=$nb_pages)
		$PageFin = $DerPage;
	else
		$PageFin = $nb_pages;

	$PageDepart2 = $page+1;
	for($j=$PageDepart2;$j<=$DerPage;$j++)
		echo "<a class=\"pagin_prec\" href=\"?lang=$lang&r=$r&page=$j\">$j</a>&nbsp;";
}
Bon le code est pas testé mais ca doit être plus ou moins approchant :)

Mammouth du PHP | 19672 Messages

23 sept. 2010, 18:13

Bon le code est pas testé mais ca doit être plus ou moins approchant :)
Comme tu dis, plus ou moins approchant, tss tss...c'est super lourd ton système et tu fais ça avec deux boucles en plus... j'espère que tu montes pas les sites que tu vends comme ça, s'il y a un peu de montée en charge, tu vas te faire sonner les cloches par tes clients. :?
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Petit nouveau ! | 9 Messages

23 sept. 2010, 18:32

Milles excuses, j'ai répondu un peu vite et n'ai pas vraiment identifié le besoin (milles coups de fouets je sais), il est flagrant qu'ici on part d'un nombre de départ pour arriver au même +10... une boucle suffit donc !

Milles (oui encore je sais) explications me viennent pour justifier cette erreur mais aucune ne la justifie vraiment...

Mammouth du PHP | 19672 Messages

23 sept. 2010, 18:38

...on part d'un nombre de départ pour arriver au même +10...
Pas forcément justement : on affichera pas plus de 5 pages après la page en cours et pas plus de 5 avant non plus. Si on est en page 1, on affichera donc seulement au maximum 5 liens pour les pages suivantes, moins s'il y a moins de 5 pages au total. Et c'est la même chose dans l'autre sens si on est à la dernière page.

Le point important à ajuster ici, ce sont les pointeurs de la boucle, le reste du code n'a nullement besoin d'être modifié.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Petit nouveau ! | 9 Messages

23 sept. 2010, 19:02

Oui tout à fait ce que je voulais dire c'est que la liste est linéaire et non morcellée comme une liste du genre :

<< 5 10 15 16 17 18 19 20 25 30 >> >|

Comme tu le dis parfois une bonne sieste vaut mieux qu'un café de plus...