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 :

Comment optimiser la boucle de pagination [PHP 5.2]


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 044
    Par défaut Comment optimiser la boucle de pagination
    Bonjour, j'avais implémenter dans ma librairie une fonction pour faire une pagination de manière simple.
    Je me rend compte avec le recul que j'ai oublier quelque chose et je voulais avoir vos conseils et pourquoi pas un exemple.
    En faite ma fonction retourne une pagination simple voir trop simple car si j'ai plus de 10000 pages qu'arrive t-il ?
    En gros la pagination retourne:
    1 2 3 4 5 6 7 5 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23> >>
    C'est bien mais si trop de page, la numérotation continue et ce si j'ai 500 onglets dans celle-ci c'est illisible.
    c'est du à une mauvaise interprétation de ma part dans la boucle.
    Je souhaite avoir :
    1 2 3 4 5 6 7 8 9 10 ... 20 21 22 23 > >>
    Voici le code:
    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
    function pagerData($request,$as,$limit=10,$getpage,$url=false,$host=false,$rewrite=false,$namepage=null,$debug=false){
    	  	$num = '';
    	  	foreach ($request as $t) $num_pages = $t[$as];
    	  	$num_pages = ceil($num_pages/$limit);
    	  	$page = max($getpage, 1);
        	$page = min($getpage, $num_pages);
    		if($getpage > $limit || $getpage <= 0) {
    			$page = 1;
    		}
    		$debug?self::debugPager($page,$num_pages,$limit,$getpage):false;
    		$offset = $getpage;
    		if($offset > $num_pages)
    		{
    		  $offset = $num_pages;
    		}
    	    $offset = $this->pageOffset($limit,$getpage);
    	    if ($rewrite == false) {
    	    	$rewrite = 'page=';
    	    }else{
    	    	$rewrite = $namepage.'/';
    	    }
    	    if($getpage > 1)
    		    {
    		    	$num .= '<a href="'..$url.$rewrite.(min($getpage, 1)).$host.'">««</a>';
    		        $num .= '<a href="'.$url.$rewrite.($getpage - 1).$host.'">«</a>';
    		    }
    	    if($num_pages>1){
    			for($i=1; $i<=$num_pages; $i++){
    				if($i==$getpage){
    				   $num .= '<div class="current">'.$i.'</div>'; 
    				}else{
    				  $num .= '<a href="'.$url.$rewrite.$i.$host.'">'.$i.'</a>';  
    				}
    			}
    		}
    		if ($getpage < $num_pages)  {
    		    $num .= '<a href="'.$url.$rewrite.($getpage + 1).$host.'">»</a>';
    		    $num .= '<a href="'.$url.$rewrite.max($getpage, $num_pages).$host.'">»»</a>';
    		}
    		return $num;
    	  }

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 625
    Par défaut
    A priori la petite fonction qui suit devrait te permettre de monter tes liens de pagination assez facilement :

    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
    function listeLien( $indexCourant , $max ){
    	if( $indexCourant <= 3 ){
    		$listeDebut = array();
    		$listeCourante = range( 1 , $indexCourant + 2 );
    		$listeFin = array_merge( array( '...' ) , range( $max - 2 , $max ) );
    	}
    	else if( $indexCourant >= $max -3 ){
    		$listeDebut = array_merge( range( 1 , 3 ) , array( '...' ) );
    		$listeCourante = range( $indexCourant - 2 , $max );
    		$listeFin = array();
    	}
    	else{
    		$listeDebut = array_merge( range( 1 , 3 ) , array( '...' ) );
    		$listeCourante = range( $indexCourant - 2 , $indexCourant + 2 );
    		$listeFin = array_merge( array( '...' ) , range( $max - 2 , $max ) );
    	}
     
    	return array_merge( $listeDebut , $listeCourante , $listeFin );
     
    }
     
    print_r( listeLien( 3 , 20 ) );
    print_r( listeLien( 10 , 20 ) );
    print_r( listeLien( 18 , 20 ) );

  3. #3
    Membre éprouvé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 044
    Par défaut
    Bonjour, je viens de tester mais le résultat est inattendu, j'ai probablement fais une bêtise :
    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    function pagerData($request,$as,$limit=10,$getpage,$url=false,$host=false,$rewrite=false,$namepage=null,$debug=false){
    	  	$num = '';
    	  	foreach ($request as $t) $num_pages = $t[$as];
    	  	$num_pages = ceil($num_pages/$limit);
    	  	$totalpage = $num_pages;
    	  	$page = max($getpage, 1);
        	$page = min($getpage, $num_pages);
    		if($getpage > $limit || $getpage <= 0) {
    			$page = 1;
    		}
    		$debug?self::debugPager($page,$num_pages,$limit,$getpage):false;
    		$offset = $getpage;
    		if($offset > $num_pages)
    		{
    		  $offset = $num_pages;
    		}
    	    $offset = $this->pageOffset($limit,$getpage);
    	    if ($rewrite == false) {
    	    	$rewrite = 'page=';
    	    }else{
    	    	$rewrite = $namepage.'/';
    	    }
    	    if($getpage > 1)
    		    {
    		    	$num .= '<a href="'.magixcjquery_html_helpersHtml::getUrl().$url.$rewrite.(min($getpage, 1)).$host.'">««</a>';
    		        $num .= '<a href="'.magixcjquery_html_helpersHtml::getUrl().$url.$rewrite.($getpage - 1).$host.'">«</a>';
    		    }
    	    if($num_pages>1){
    			/*for($i=1; $i<=$num_pages; $i++){
    				if($i==$getpage){
    				   $num .= '<div class="current">'.$i.'</div>'; 
    				}else{
    				  $num .= '<a href="'.magixcjquery_html_helpersHtml::getUrl().$url.$rewrite.$i.$host.'">'.$i.'</a>';  
    				}
    			}*/
    			 foreach(self::listeLien($num_pages, $totalpage) as $i){
    			 	$num .= '<a href="'.magixcjquery_html_helpersHtml::getUrl().$url.$rewrite.$i.$host.'">'.$i.'</a>';  
    			 }
    		}
     
    		if ($getpage < $num_pages)  {
    		    $num .= '<a href="'.magixcjquery_html_helpersHtml::getUrl().$url.$rewrite.($getpage + 1).$host.'">»</a>';
    		    $num .= '<a href="'.magixcjquery_html_helpersHtml::getUrl().$url.$rewrite.max($getpage, $num_pages).$host.'">»»</a>';
    		}
    		return $num;
    	  }
    	  /*print_r( listeLien( 3 , 20 ) );
    		print_r( listeLien( 10 , 20 ) );
    		print_r( listeLien( 18 , 20 ) );*/
    	  function listeLien( $indexCourant , $max ){
    			if( $indexCourant <= 3 ){
    				$listeDebut = array();
    				$listeCourante = range( 1 , $indexCourant + 2 );
    				$listeFin = array_merge( array( '...' ) , range( $max - 2 , $max ) );
    			}
    			else if( $indexCourant >= $max -3 ){
    				$listeDebut = array_merge( range( 1 , 3 ) , array( '...' ) );
    				$listeCourante = range( $indexCourant - 2 , $max );
    				$listeFin = array();
    			}
    			else{
    				$listeDebut = array_merge( range( 1 , 3 ) , array( '...' ) );
    				$listeCourante = range( $indexCourant - 2 , $indexCourant + 2 );
    				$listeFin = array_merge( array( '...' ) , range( $max - 2 , $max ) );
    			}
    			return array_merge( $listeDebut , $listeCourante , $listeFin );
    		}
    Il me retourne bien la pagination mais la numérotation est assez bizarre ?
    Voici une capture d'écran du résultat:

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 625
    Par défaut
    Hmmm, à relire le code fourni, je me demande si ce que je proposais répondait vraiment à la question.
    Est ce que les print_r donnent un résultat intéressant pour ce que tu veux faire, ou pas du tout ?

  5. #5
    Membre éprouvé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 044
    Par défaut
    C'est intéressant mais $indexCourant correspond à quoi ?
    Je fais déjà le calcul dans ma fonction pour retourner le nombre de page à générer suivant le nombre d'élément à afficher.
    Peut peut être ai je envoyer le mauvais contenu dans $indexCourant ou peut être pour le maximum qui correspond je suppose au nombre de page

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 625
    Par défaut
    $indexCourant représente la page actuellement affichée.
    et $max, le nombre total de pages de ton ensemble.

    une page de test pour se rendre compte de ce que ça donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    if( !isset( $_GET['page'] ) ) $_GET['page'] = 1;
    $str = "";
    foreach( listelien( $_GET['page'] , 20 ) as $num ){
    	$str .= $num == '...' ? '... ' : $num == $_GET['page'] ? sprintf( '-<b>%s</b>- ' , $num ) : sprintf( '<a href="testpage.php?page=%1$s">%1$s</a> ' , $num );
    }
    echo $str;
    désolé pour le code cradingue, c'est écrit à l'arrache

    y inclure le code de listelien et l'enregistrer sous testpage.php

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Boucle for et plusieurs if enchainés --> comment optimiser le code?
    Par bilou_12 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 05/02/2012, 18h39
  2. Comment optimiser plusieurs boucles FOR-END imbriquées
    Par totoc1001 dans le forum MATLAB
    Réponses: 26
    Dernier message: 13/05/2007, 18h59
  3. [Performance]Comment optimiser la vitesse ?
    Par le Daoud dans le forum Général Java
    Réponses: 13
    Dernier message: 03/06/2005, 16h47
  4. Comment optimiser une jointure ?
    Par seb_asm dans le forum Administration
    Réponses: 21
    Dernier message: 25/06/2004, 17h42
  5. [C#] Comment eviter les boucles infinies ?
    Par Thomas Lebrun dans le forum C#
    Réponses: 12
    Dernier message: 09/06/2004, 01h04

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