Pagination [HTML - PHP]

Fermé
ZooX - 25 août 2009 à 15:05
okuni Messages postés 1221 Date d'inscription jeudi 4 septembre 2008 Statut Membre Dernière intervention 2 janvier 2014 - 2 sept. 2009 à 16:21
Bonjour,
J'ai actuellement sur mon site le systeme de pagination suivant :

 
// --------------- Etape 2 -----------------
// On écrit les liens vers chacune des pages
// -----------------------------------------
 
// On met dans une variable le nombre de messages qu'on veut par page
$nombreDeMessagesParPage = 20; // Essayez de changer ce nombre pour voir :o)
// On récupère le nombre total de messages
$retour = mysql_query('SELECT COUNT(*) AS nb_messages FROM livreor');
$donnees = mysql_fetch_array($retour);
$totalDesMessages = $donnees['nb_messages'];
// On calcule le nombre de pages à créer
$nombreDePages  = ceil($totalDesMessages / $nombreDeMessagesParPage);
// Puis on fait une boucle pour écrire les liens vers chacune des pages
echo 'Page : ';
for ($i = 1 ; $i <= $nombreDePages ; $i++)
{
    echo '<a href="livreor.php?page=' . $i . '">' . $i . '</a> ';
}
?>
 
</p>
 
<?php
 
 
// --------------- Etape 3 ---------------
// Maintenant, on va afficher les messages
// ---------------------------------------
 
if (isset($_GET['page']))
{
        $page = $_GET['page']; // On récupère le numéro de la page indiqué dans l'adresse (livreor.php?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 * FROM livreor ORDER BY id DESC LIMIT ' . $premierMessageAafficher . ', ' . $nombreDeMessagesParPage);
 
while ($donnees = mysql_fetch_array($reponse))
{
        echo '<p><strong>' . $donnees['pseudo'] . '</strong> a écrit :<br />' . $donnees['message'] . '</p>';
}



(c'est le meme code que sur un tuto du site du zero : http://www.siteduzero.com/tutoriel-3-14547-tp-un-livre-d-or.html ).

le système fonctionne bien mais il ne me convient plus car j'ai trop de pages ... :
[1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13]

et j'aimerai avoir quelque chose comme ça :
<<precedent ... [5] [6] [7] ... suivant>>


Merci de m'aider a trouvé une solution
A voir également:

10 réponses

okuni Messages postés 1221 Date d'inscription jeudi 4 septembre 2008 Statut Membre Dernière intervention 2 janvier 2014 126
25 août 2009 à 15:28
tu dois modifier ton for
for ($i = 1 ; $i <= $nombreDePages ; $i++)
{
    echo '<a href="livreor.php?page=' . $i . '">' . $i . '</a> ';
}

$nombreDePages étant le nombre de page au total, tu n'as qu'a mettre une autre variable contenant le nombre de page que tu veux qu'il y ai affiché.
Ensuite, tu dois un peut bidouiller pour rajouter "page suivante" et "page précédente"

bonne chance :)
0
Salut okuni,
tu peut me donné un exemple de modification pour le for ?parce que je vois pas trop comment je dois faire ...

merci...
0
okuni Messages postés 1221 Date d'inscription jeudi 4 septembre 2008 Statut Membre Dernière intervention 2 janvier 2014 126
25 août 2009 à 17:21
Ok, je vais te montrer un bout de mon code de pagination.
//On calcule le nombre total d'entrée dans la table.
$retour1 = mysql_query("SELECT COUNT(*) AS nbre_entree FROM $table");
$donnees1 = mysql_fetch_array($retour1) or die (mysql_error());
$total = $donnees1['nbre_entree'];

//On récupère le GET du lien.
if (!empty($_GET['lien']))
{
	$lien = intval($_GET['lien']);
}
else
{
	$lien = 1;
}

//On calcule le nombre de page.
$nombre_de_page = ceil($total / $nombre_entree_par_page);

//préparation au début du for
$nombre_lien_avant = $lien - $nombre_lien_max;

if ($nombre_lien_avant <= 0)
{
	$nombre_lien_avant  = 1;
}

//préparation a la fin du for.
$nombre_lien_apres = $lien + $nombre_lien_max;

if ($nombre_lien_apres >= $nombre_de_page)
{
	$nombre_lien_apres = $nombre_de_page;
}

for ($i = $nombre_lien_avant; $i <= $nombre_lien_apres; $i++)

voilà.
je t'explique :
Je calcule le nombre de lien qu'il y aura avant et après la page actuel.
Je pense pas devoir expliquer chaque variable, elles sont assez clair.
avec ça, il reste plus que l'intérieur du for :)
0
J'ai fait ça grace a ton code :
	<?php		 			
$nombre_entree_par_page = 40;
$nombre_lien_max = 3;
//On calcule le nombre total d'entrée dans la table.
$retour1 = mysql_query("SELECT COUNT(*) AS nbre_entree FROM films");
$donnees1 = mysql_fetch_array($retour1) or die (mysql_error());
$total = $donnees1['nbre_entree'];

//On récupère le GET du lien.
if (!empty($_GET['id']))
{
	$lien = intval($_GET['id']);
}
else
{
	$lien = 1;
}

//On calcule le nombre de page.
$nombre_de_page = ceil($total / $nombre_entree_par_page);

//préparation au début du for
$nombre_lien_avant = $lien - $nombre_lien_max;

if ($nombre_lien_avant <= 0)
{
	$nombre_lien_avant  = 1;
}

//préparation a la fin du for.
$nombre_lien_apres = $lien + $nombre_lien_max;

if ($nombre_lien_apres >= $nombre_de_page)
{
	$nombre_lien_apres = $nombre_de_page;
}

for ($i = $nombre_lien_avant; $i <= $nombre_lien_apres; $i++)


{
					echo ' <a href="films.php?page=' . $i . '"class="type2"><b><font size="3">[' . $i . ']</font></b></a>   ';
				}
				?> 



Mais le problemme maintenant , c'est que ça affiche uniquement les 4 premières pages...
ce que je voudrai c'est que la numérotation des pages s'adapte en fonction de la page que l'on regarde (par exemple si on regarde la page 5 :
< [4] [5] [6] > )
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
okuni Messages postés 1221 Date d'inscription jeudi 4 septembre 2008 Statut Membre Dernière intervention 2 janvier 2014 126
26 août 2009 à 21:40
bon c'est assez dur de rentrer dans ce code.
je te passe mon script entier, a toi de l'adapter.
Je te conseille vivement de lire attentivement tout le code. Si tu as une question, n'hésite pas.
ps : je crois que dans le for, il y a une partie (if) qui est inutile mais bon, tu verra par toi même.

<?php
//Pagnination made by Okuni.
/*LIMIT.
	LIMIT $premier_message, $nombre_entree_par_page
*/
function pagination($page,$table,$nombre_entree_par_page,$nombre_lien_max)
{
	//On calcule le nombre total d'entrée dans la table.
	$retour1 = mysql_query("SELECT COUNT(*) AS nbre_entree FROM $table");
	$donnees1 = mysql_fetch_array($retour1) or die (mysql_error());
	$total = $donnees1['nbre_entree'];
	
	//On récupère le GET du lien.
	if (!empty($_GET['lien']))
	{
		$lien = intval($_GET['lien']);
	}
	else
	{
		$lien = 1;
	}
	
	//On calcule le nombre de page.
	$nombre_de_page = ceil($total / $nombre_entree_par_page);
	
	//préparation au début du for
	$nombre_lien_avant = $lien - $nombre_lien_max;
	
	if ($nombre_lien_avant <= 0)
	{
		$nombre_lien_avant  = 1;
	}
	
	//préparation a la fin du for.
	$nombre_lien_apres = $lien + $nombre_lien_max;
	
	if ($nombre_lien_apres >= $nombre_de_page)
	{
		$nombre_lien_apres = $nombre_de_page;
	}
	
	//Si le nombre de page != 1 on affiche pas le cadre de pagination
	if ($nombre_de_page != 1)
	{
		//On écrit une boucle pour écrire les liens vers les différentes pages.
		echo '<div class="pagination">Page :<br/>';
		for ($i = $nombre_lien_avant; $i <= $nombre_lien_apres; $i++)
		{
			//si on commence le for, on vois si on est sur la première page ou pas.
			if ($i == $nombre_lien_avant)
			{
				if ($_GET['lien'] == 1 or $lien == 1)
				{
					echo '>> ';
					echo '<a class="pageActive"><strong><u>'.$i.'</u></strong></a> ';
				}
				else
				{
					$i_precedent = $_GET['lien'] - 1;
					echo '<a href="'.$_GET['section'].'-'.$page.'-'.$i_precedent.'.html">Page précédente</a> ';
					echo '<a href="'.$_GET['section'].'-'.$page.'-'.$i.'.html">'.$i.'</a> ';
				}
			}
			//on souligne le numéro de la page sélectionnée.
			else if ($i == $_GET['lien'])
			{
				if ($i == $nombre_de_page)
				{
					//echo 'dernier lien : '.$i;
					if ($_GET['lien'] == $nombre_de_page)
					{
						echo '<a class="pageActive"><strong><u>'.$i.'</u></strong></a> ';
						echo '<<';
					}
					else
					{
						$i_suivant = $_GET['lien'] + 1;
						echo '<a href="'.$_GET['section'].'-'.$page.'-'.$i.'.html">'.$i.'</a> ';
						echo '<a href="'.$_GET['section'].'-'.$page.'-'.$i_suivant.'.html">Page suivante</a> ';
					}
				}
				else
				{
					echo '<a class="pageActive"><strong><u>'.$i.'</u></strong></a> ';
				}
			}
			//si on termine le for, on vois si on a sélectionné le dernier lien ou pas.
			else if ($i == $nombre_lien_apres)
			{
				//echo 'dernier lien : '.$i;
				if ($_GET['lien'] == $nombre_lien_apres)
				{
					echo '<<';
				}
				else if (empty($_GET['lien']) and $lien == 1)
				{
					$i_suivant = 2;
					echo '<a href="'.$_GET['section'].'-'.$page.'-'.$i.'.html">'.$i.'</a> ';
					echo '<a href="'.$_GET['section'].'-'.$page.'-'.$i_suivant.'.html">Page suivante</a> ';
				}
				else
				{
					$i_suivant = $_GET['lien'] + 1;
					echo '<a href="'.$_GET['section'].'-'.$page.'-'.$i.'.html">'.$i.'</a> ';
					echo '<a href="'.$_GET['section'].'-'.$page.'-'.$i_suivant.'.html">Page suivante</a> ';
				}
			}
			//sinon on affiche le lien correspondant a $i.
			else
			{
				echo '<a href="'.$_GET['section'].'-'.$page.'-'.$i.'.html">'.$i.'</a> ';
			}
		}
		echo '</div>';
	}
		$premier_message = ($lien - 1) * $nombre_entree_par_page;
		return $premier_message;
}
?>
0
Salut,
je travaille sur ton code ... il est vachement long :p
mais en fait j'ai pas besoin de changer beaucoup de chose a ton code pour l'adapté a mon site . non ?

deja dans les premières lignes y'a :
pagination($page,$table,$nombre_entree_par_page,$nombre_lien_max)

es-ce que je suis sensé changé $table et le remplacer par le nom de ma table ???


.
0
okuni Messages postés 1221 Date d'inscription jeudi 4 septembre 2008 Statut Membre Dernière intervention 2 janvier 2014 126
29 août 2009 à 19:52
oui tout a fait.
En fait, j'ai voulu faire un système de pagination qui s'adapte à n'importe quel situation.
D'où la fonction pagination avec le nom de la page en cour, la table s'y rapportant, le nombre d'entrée par page et le nompbre max de page à afficher.
0
J'ai un problemme au niveau de cette ligne : (parse error, expecting `'&'' or `T_VARIABLE')
pagination($page,$table,$nombre_entree_par_page,$nombre_lien_max)


j'ai remplacé les $page,$table,$nombre_entree_par_page,$nombre_lien_max comme ça :
function pagination($images,$images,$40,$3)


(la page ou se trouve ton script s'appelle : images.php la table s'appelle images , je voudrais 40 entrés par pages et 3 liens )


Merci de bien vouloir m'aider :)
0
okuni Messages postés 1221 Date d'inscription jeudi 4 septembre 2008 Statut Membre Dernière intervention 2 janvier 2014 126
1 sept. 2009 à 13:06
heu, une variables commencant par un chiffres n'existe pas. tu es obligé de faire commencer par une lettre. libre à toi d'après rajouter des chiffres.
exemple :
$15var : variables mauvaise.
$var15 : variable correcte.
0
Merci okuni pour ton script , j'ai pas encore réussit a l'intégré dans mon site mais sa viendra

merci encore

++
0
okuni Messages postés 1221 Date d'inscription jeudi 4 septembre 2008 Statut Membre Dernière intervention 2 janvier 2014 126
2 sept. 2009 à 16:21
Pas de problème.
normalement, tu n'as rien a faire à part remplir les 4 variables de la fonction pagination et de modifier s'il faut la requête sql au début du script.
Biens sur il y au aussi le CSS.
0