Pagination [HTML - PHP]

ZooX -  
okuni Messages postés 1325 Statut Membre -
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
Configuration: Windows Vista
Firefox 3.5.2

10 réponses

  1. okuni Messages postés 1325 Statut Membre 126
     
    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
  2. ZooX
     
    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
  3. okuni Messages postés 1325 Statut Membre 126
     
    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
  4. ZooX
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. okuni Messages postés 1325 Statut Membre 126
     
    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
  7. ZooX
     
    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
    1. okuni Messages postés 1325 Statut Membre 126
       
      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
  8. ZooX
     
    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
  9. okuni Messages postés 1325 Statut Membre 126
     
    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
  10. ZooX
     
    Merci okuni pour ton script , j'ai pas encore réussit a l'intégré dans mon site mais sa viendra

    merci encore

    ++
    0
  11. okuni Messages postés 1325 Statut Membre 126
     
    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