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

  1. #1
    Membre confirmé Avatar de gtraxx
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 043
    Points : 570
    Points
    570
    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 éclairé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 625
    Points : 822
    Points
    822
    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 confirmé Avatar de gtraxx
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 043
    Points : 570
    Points
    570
    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 éclairé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 625
    Points : 822
    Points
    822
    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 confirmé Avatar de gtraxx
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 043
    Points : 570
    Points
    570
    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 éclairé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 625
    Points : 822
    Points
    822
    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

  7. #7
    Modérateur
    Avatar de Bisûnûrs
    Profil pro
    Développeur Web
    Inscrit en
    Janvier 2004
    Messages
    9 868
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2004
    Messages : 9 868
    Points : 16 258
    Points
    16 258
    Par défaut
    Salut,

    J'avais fait une fonction de pagination à une époque qui intègre ce que tu veux, mais elle mérite certainement d'être optimisée :

    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
    $nbParPage = 50;
    $nbPages  = ceil( $nbResultats / $nbParPage );
     
    if ( isset( $_GET['p'] ) && is_numeric( $_GET['p'] ) && $_GET['p'] > 0 && $_GET['p'] <= $nbPages ) {
      $pageActuelle = $_GET['p'];
    }
    else {
      $pageActuelle = 1;
    }
     
    pagination( $nbPages, $pageActuelle );
     
    function pagination( $nbPages, $pageActuelle )
    {
      if ( $nbPages > 10 )
      {
        $points = false;
     
        for ( $i = 1; $i <= $nbPages; $i++ )
        {
          if ( $i == $pageActuelle ) {
            ?>
            <a href="#" class="active"><?php echo $i;?></a>
            <?php
          }
          elseif ( abs( $i - $pageActuelle ) <= 5 || $i == 1 || $i == $nbPages ) {
            ?>
            <a href="#"><?php echo $i; ?></a>
            <?php
            $points = false;
          }
          elseif ( $points == false ) {
            echo '...';
            $points = true;
          }
        }
      }
      else {
        for ( $i = 1; $i <= $nbPages; $i++ )
        {
          if ( $i == $pageActuelle ) {
            ?>
            <a href="#" class="active"><?php echo $i;?></a>
            <?php
          }
          else {
            ?>
            <a href="#"><?php echo $i; ?></a>
            <?php
          }
        }
      }
    }

  8. #8
    Membre confirmé Avatar de gtraxx
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 043
    Points : 570
    Points
    570
    Par défaut
    Merci à vous deux
    Bon il me reste un dernier bug à régler et ce sera bon.
    il me retourne les ... au mauvaise endroit c'est assez marrant mais bon.
    Voila le code utilisé pour la partie qui affiche le nombre de page:
    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
     
    if ( $num_pages > 2 ){
    			    $points = false;
    			    for ( $i = 1; $i <= $num_pages; $i++ ){
    			      if ( $i == $getpage ) {  
    			        $num .= '<div class="current">'.$i.'</div>'; 
    			      }elseif ( abs( $i - $getpage ) <= 5 || $i == 1 || $i == $num_pages ) {
    			        $num .= '<a href="'.magixcjquery_html_helpersHtml::getUrl().$url.$rewrite.$i.$host.'">'.$i.'</a>';
    			        $points = false;
    			      }elseif ( $points == false ) {
    			        $num .= '...';
    			        $points = true;
    			      }
    			    }
    			}else{
    				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>';  
    					}
    				}
    			}
    Le problème en image :



    EDIT :j'ai rien dit sa fonctionne mais c'est vrai que l'on peut optimiser tout sa par exemple en calculant un peut mieux cette partie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    }elseif ( abs( $i - $getpage ) <= 5 || $i == 1 || $i == $num_pages ) {
    Pour éviter d'avoir un truc comme sa :

  9. #9
    Modérateur
    Avatar de Bisûnûrs
    Profil pro
    Développeur Web
    Inscrit en
    Janvier 2004
    Messages
    9 868
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2004
    Messages : 9 868
    Points : 16 258
    Points
    16 258
    Par défaut
    Là je pense que c'est plus un problème de CSS.
    En effet tu utilises un div au mileu, donc tu dois les avoir mis tes liens en float:left pour qu'ils se mettent les uns à côtés des autres avec le div. Seulement tes "..." ne sont pas en float:left eux, se retrouvent donc après les éléments flottants.

  10. #10
    Membre confirmé Avatar de gtraxx
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 043
    Points : 570
    Points
    570
    Par défaut
    Oui j'ai posté en même temps que vous
    Voici la suite
    EDIT :j'ai rien dit sa fonctionne mais c'est vrai que l'on peut optimiser tout sa par exemple en calculant un peut mieux cette partie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    }elseif ( abs( $i - $getpage ) <= 5 || $i == 1 || $i == $num_pages ) {
    Pour éviter d'avoir un truc comme sa :

  11. #11
    Modérateur
    Avatar de Bisûnûrs
    Profil pro
    Développeur Web
    Inscrit en
    Janvier 2004
    Messages
    9 868
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2004
    Messages : 9 868
    Points : 16 258
    Points
    16 258
    Par défaut
    Je ne vois pas quel est le problème que tu soulèves en fait.

  12. #12
    Membre confirmé Avatar de gtraxx
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 043
    Points : 570
    Points
    570
    Par défaut
    je pense que c'est bon merci beaucoup en tout cas

+ 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, 17h39
  2. Comment optimiser plusieurs boucles FOR-END imbriquées
    Par totoc1001 dans le forum MATLAB
    Réponses: 26
    Dernier message: 13/05/2007, 17h59
  3. [Performance]Comment optimiser la vitesse ?
    Par le Daoud dans le forum Général Java
    Réponses: 13
    Dernier message: 03/06/2005, 15h47
  4. Comment optimiser une jointure ?
    Par seb_asm dans le forum Administration
    Réponses: 21
    Dernier message: 25/06/2004, 16h42
  5. [C#] Comment eviter les boucles infinies ?
    Par Thomas Lebrun dans le forum C#
    Réponses: 12
    Dernier message: 09/06/2004, 00h04

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