IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

pagination avec de grands nombres de pages


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 7
    Par défaut pagination avec de grands nombres de pages
    Bonjour à tous,

    je fais appel à vous car je n'arrive pas à faire un système de pagination complet.

    Ce que je voudrais faire quand il y a trop de résultat, c'est une pagination soit du style :
    << Précédent | 1-20 | 21-40 |...| 410-430 | 431- 450 | Suivant >>>
    et quand on clique, au fur et à mesure ça décale les nombres,
    soit une pagination du style du présent forum.
    MAis la logique et moi ça fait deux, et franchement si vous connaissez un script tout prêt ou un tutoriel complet qui prend en compte tous les cas de figure, je suis preneur

    merci (et désolé pour le sujet bateau)

  2. #2
    Membre Expert Avatar de nosferapti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    1 157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 157
    Par défaut
    est ce que tu as déjà fait un système de pagination simple ?

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 7
    Par défaut
    Bonjour,

    Oui, j'avais mis un exemple mais apparemment il a été supprimé, du coup le message n'a plus trop de sens !
    En fait j'ai récupéré un système de pagination qui fonctionne correctement (celui en exemple dans le livre php cookbook), MAIS qui me donne un résultat du style :

    << Précédent | 1-20 | 21-40 | 41-60 | 61-75 | Suivant >>> (là c'est quand j'ai pas beaucoup de résultat et ça me convient parfaitement).

    Quand j'ai beaucoup de résultat, ça me donne un truc imbuvable du style :

    << Précédent | 1-20 | 21-40 | 41-60 | 61-80 | 81-100 | 101-120 | 121-140 | 141-160 | 161-180 | 181-200 | 201-220 | 221-240 | 241-260 | 261-280 | 281-300 | 301-320 | 321-340 | 341-360 | Suivant >>> (et encore j'ai tronqué)

    Je demande pas un bout de code tout prêt, je voudrais comprendre le mécanisme en fait !!

  4. #4
    Membre Expert Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 895
    Par défaut
    voici la fonction que j'ai créée et que j'utilise pour la navigation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    function navigation($length,$interval,$index, $nb_show = 3){
    	// $length : nombre total de LIGNES
    	// $interval : offset (donc nombre d'affichage par page
    	// $index : numéro de la page courante
    	// $nb_show = (int) : Variable du nombre de pages à afficher autour de celle sélectionnée 
    	//             NOTE : La variable prend en compte la page courante, donc si $nb_show = 3, on aura : la page courante + 2 pages AVANT et 2 pages APRES
    	$index = (int) $index;
    	$nb_pages = (int) ceil($length/$interval);
    	$begin    = max($index-$nb_show, 1);
    	$end      = min($index+$nb_show, $nb_pages);
    	if ($end+1 == $nb_pages) {
    		$end = $nb_pages;
    	}
    	if ($begin+$nb_show == $nb_pages) {
    		$begin = 1;
    	}
    	for ($i = $begin; $i <= $end ; $i++){
    		$nav[$i] = array('id_page' => $i , 'selected' => ($i === $index));
    	}   
    	return array( 'selection' => $nav, 'first' => ($begin <= 1) , 'last' => ($end >= $nb_pages) , 'max' => $nb_pages ,'total' => (int) $length );
    }
    Voici son utilisation normale (si on est à la page 43/79) :

    1 ... 41 42 [43] 44 45 ... 79 (il ne tient qu'à toi d'ajouter un "Précédent" "Suivant" à l'affichage



    UTILISATION :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    	<?php
    // Pagging
    $limit = 2;
    $page = (isset($_GET['page'])) ? $_GET['page'] : 1;
    $offset = ($page-1)*$limit;
     
    // REQUETE
    $sql = "SELECT SQL_CALC_FOUND_ROWS * FROM ma table LIMIT ".$limit." OFFSET ".$offset;
    $q = mysql_query($sql);
    while( $r = mysql_fetch_assoc($q) ) {
    	$liste['items'][] = $r;
    }
     
    // Navigation
    $R =  mysql_query("SELECT FOUND_ROWS()");
    $nav['total'] = mysql_result($R,0);
    $liste['navigation'] = navigation($nav['total'], $limit, $page);
     
    // NAVIGATION
    echo '<div class="pagging">';
    		if ($navigation['max'] > 1) {
    			echo '<span>Pages : ';
    			if (!$navigation['first']) {
    				echo '<a href="lien vers la premiere page">1</a>...&nbsp;';
    			}
    			foreach ($navigation['selection'] AS $n) {
    				if ($n.selected) {
    					echo $n.id_page;
    					$cur_page = $n.id_page;
    				} else {
    					echo '<a href="?page='.$n.id_page.'">'.$n.id_page.'</a>';
    				}
    			}
    			if (!$navigation['last']) {
    				echo '...&nbsp;<a href="?page='.$navigation['max'].'">'.$navigation['max'].'</a>';
    			}
    		}
    		echo 'Total: '.$navigation['total'];
    		if ($navigation['max'] > 1) {
    			echo '- Page '.$cur_page.' / '.$navigation['max'];
    		}
    	?>
    </div>
    NB : j'utilise SMARTY donc ici j'ai tout changé pour que ça soit utilisable pour tout le monde mais j'ai la flemme de tout vérifier... il devrait néanmoins pas avoir de problème...

  5. #5
    Membre émérite Avatar de Korko Fain
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    632
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 632
    Par défaut
    L'algorithme n'est pas forcément très simple. Déjà faut que tu te fixe une limite genre 7 intervalles. Ensuite, tu en affiche autant des premiers que des derniers.
    Si tu es sur une page au milieu, il faut que tu affiche celle avant et celle après et en tout tu dois avoir le nombre que tu t'es fixé en limite. Ensuite tu ajoutes des ... ^^ Et à coté une liste pour choisir n'importe quelle page ou un champ texte où écrire le numéro sinon c'est parfois très fatiguant :p

Discussions similaires

  1. [Graphics View] Galerie d'images avec un grand nombre d'images
    Par feda12 dans le forum Qt
    Réponses: 3
    Dernier message: 09/02/2011, 23h27
  2. [Langage] Classe avec un grand nombre de méthode
    Par Guybrush dans le forum Général Java
    Réponses: 9
    Dernier message: 30/09/2010, 14h33
  3. [AJAX] Actualiser un div avec un grand nombre de paramètres
    Par yoshï dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 21/11/2008, 11h43
  4. Réponses: 15
    Dernier message: 21/01/2007, 11h28
  5. Réponses: 8
    Dernier message: 21/11/2005, 17h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo