Partage
  • Partager sur Facebook
  • Partager sur Twitter

[CodeIgniter] pagination

Sujet résolu
    5 février 2011 à 0:08:10

    Bonjour,

    Je cherche à faire une pagination sous CI. Pas de soucis, j'ai une fonction dans mon modele qui renvoi les données en fonction de la page. Tout marche bien, sauf les liens en haut : quand je clique sur 1, j'arrive sur la page 1. Pareil pour le 2. Mais pour le trois, j'arrive sur la page 4 !

    Quelqu'un aurait-il déjà rencontré ce problème? Quelqu'un saurait comment le résoudre?

    Merci ! :)

    Voici mes codes :

    <?php
    
    class Welcome extends MY_Controller {
    	
    	public function __construct()
    	{
    	    parent::__construct();
                $this->load->library('layout');
                $this->load->model('News','News');
    	}
    	
    	public function index()
    	{
    	    
    	    $config['base_url'] = base_url().'index.php/welcome/page/';
    	    $config['first_url'] = base_url().'index.php/';
                $config['total_rows'] = $this->News->count();
                $config['per_page'] = 2; 
    	    $this->pagination->initialize($config);
                $liens =  $this->pagination->create_links();
    	    $news = $this->News->get_page_news(1,$config['per_page']);
                $this->layout->view('welcome/index',array('liens'=>$liens,'news'=>$news,'title'=>'News - Accueil','charset'=>'utf-8'));
    
    	}
    	
    	public function page($page)
    	{
            
                $config['base_url'] = base_url().'index.php/welcome/page/';
        	    $config['first_url'] = base_url().'index.php/';
                $config['total_rows'] = $this->News->count();
                $config['per_page'] = 2; 
        	    $this->pagination->initialize($config);
                $liens =  $this->pagination->create_links();
        	    $news = $this->News->get_page_news($page,$config['per_page']);
                $this->layout->view('welcome/index',array('liens'=>$liens,'news'=>$news,'title'=>'News - Accueil','charset'=>'utf-8'));
         	
    	}
    	
    }
    
    /* End of file welcome.php */
    /* Location: ./system/application/controllers/welcome.php */
    ?>
    


    <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
    
    class News extends MY_Model
    {
        
    	protected $table = 'news';
    	
    	function get_page_news($page,$per_page){
            
            return $this->db->select('*')
    				           ->order_by('id', 'desc')
    				           ->limit(intval($per_page), (intval($page)-1) * $per_page)
    				           ->get($this->table)
    				           ->result();
            
        }
        
    }
    
    • Partager sur Facebook
    • Partager sur Twitter
      7 février 2011 à 14:39:38

      Bonjour moi aussi je debute sur CI et il m'arrives de rencontrer quelque probleme. sans y trouver des reponses on est pas une grosse communauté ?

      Si tu le souhaite on pourrais s'entraider via skype tu me mp via le sdz si tu es ok.

      Que ce passe t'il quand tu clique sur 4.
      • Partager sur Facebook
      • Partager sur Twitter
        8 février 2011 à 7:13:27

        Salut,
        Débutant également, j'ai également un problème sur la pagination...
        Un conseil : active le profiler ($this->output->enable_profiler(true); dans la fonction de ta page), et regarde la requête SQL, pour voir ou ça coince...
        Moi ça commence à m'aider ^^
        Bonne journée :)
        • Partager sur Facebook
        • Partager sur Twitter
        Louis Guidez :)
          8 février 2011 à 9:42:41

          Non je penses que son probleme est lié directement a codeigniter.

          Je te mets la doc en français ca va peut etre t'aider.

          Pagination class



          La class de Pagination CodeIgniter est très facile à utiliser, et elle est 100% personnalisable, soit dynamiquement ou via un stokage en fonction de vos préférences.

          Si vous n'êtes pas familier avec le terme "pagination", il se réfère aux liens qui vous permet de naviguer de page en page, comme ceci:


          «Première <1 2 3 4 5> Dernière»
          



          Exemple



          Voici un exemple simple qui montre comment créer la pagination dans l'un de vos fonctions de contrôleur:

          <?
          $this->load->library('pagination');
          
          $config['base_url'] = 'http://example.com/index.php/test/page/';
          $config['total_rows'] = '200';
          $config['per_page'] = '20';
          
          $this->pagination->initialize($config);
          
          echo $this->pagination->create_links();
          ?>
          


          Notes:



          Le tableau $ config contient vos variables de configuration. Il est passé à $this->pagination->initialize comme indiqué ci-dessus. Bien qu'il existe une vingtaine d'articles que vous pouvez configurer, au minimun vous avez besoin des trois montré. Voici une description de ce que ces articles représentent:

          * Base_url : C'est l'URL complète de la classe contrôleur / fonction contenant votre pagination. Dans l'exemple ci-dessus, il pointe vers un contrôleur appelé «Test» et une fonction appelée "page". Gardez à l'esprit que vous pouvez ré-acheminer vos URI si vous avez besoin d'une structure différente.

          * Total_rows : Ce nombre représente le nombre total de lignes dans le jeu de résultats que vous créez pour la pagination. Généralement, ce numéro sera le nombre total de lignes que votre requête de base de données retourné.

          * Per_page Le nombre d'articles que vous souhaitez afficher par page. Dans l'exemple ci-dessus, vous souhaiteriez montré 20 éléments par page.

          La fonction create_links() retourne une chaîne vide s'il n'y a pas de pagination pour voir.


          Définition des préférences dans un fichier de configuration

          Si vous préférez ne pas définir les préférences en utilisant la méthode ci-dessus, vous pouvez au lieu de les mettre dans un fichier de configuration. Il suffit de créer un nouveau fichier appelé pagination.php, ajouter le tableau $ config dans ce fichier. Ensuite, enregistrez le fichier dans: config/pagination.php et il sera utilisé automatiquement. Vous n'aurez pas besoin d'utiliser la fonction $this->pagination->initialize si vous enregistrez vos préférences dans un fichier de configuration.

          Personnalisation de la pagination



          Ce qui suit est une liste de toutes les préférences que vous pouvez passer à la fonction d'initialisation afin d'adapter l'affichage.

          $ Config ['uri_segment'] = 3;
          


          La fonction de pagination détermine automatiquement le segment de votre URI contiendra de numéro de page. Si vous avez besoin d'autre chose vous pouvez le spécifier.

          $ Config ['num_links'] = 2;
          


          Le nombre de "chiffres" des liens que vous souhaitez avant et après le numéro de page sélectionné. Par exemple, le numéro 2 placera deux chiffres de chaque côté, comme dans l'exemple de liens tout en haut de cette page.

          $ Config ['page_query_string'] = TRUE
          


          Par défaut, la bibliothèque pagination supposent que vous utilisez segments URI, et construit quelque chose de votre liaisons similaires

          http://example.com/index.php/test/page/20

          Si vous avez $ config ['enable_query_strings'] défini à TRUE vos liens sera automatiquement ré-écrit en utilisant des chaînes de requête. Cette option peut aussi être explicitement défini. En utilisant $ config ['page_query_string'] défini à TRUE, le lien pagination deviendra.

          http://example.com/index.php?c=test&m=page&per_page=20

          Notez que "per_page" est la chaîne de requête par défaut passé, mais peuvent être configurés en utilisant $ config ['query_string_segment'] = 'your_string'
          Ajout Markup Enserrage

          Si vous souhaitez entourent la pagination ensemble avec d'autres balises, vous pouvez le faire avec ces deux prefs:
          $ Config ['full_tag_open'] = '<p>;

          La balise d'ouverture placée sur le côté gauche de la totalité du résultat.
          $ Config ['full_tag_close'] = '</ p>';

          La balise de fermeture placé sur le côté droit de la totalité du résultat.
          Personnalisation de la First Link
          $ Config ['first_link'] = 'première';

          Le texte que vous souhaitez montré dans le "premier" lien sur la gauche. Si vous ne voulez pas rendu ce lien, vous pouvez définir sa valeur à false.
          $ Config ['first_tag_open'] = '<div>;

          La balise d'ouverture pour la «première» lien.
          $ Config ['first_tag_close'] = '</ div>';

          La balise de fermeture pour la "première" lien.
          Personnalisation du dernier maillon
          $ Config ['last_link'] = 'Last';

          Le texte que vous souhaitez le montre le "dernier" lien sur la droite. Si vous ne voulez pas rendu ce lien, vous pouvez définir sa valeur à false.
          $ Config ['last_tag_open'] = '<div>;

          La balise d'ouverture pour le "dernier" lien.
          $ Config ['last_tag_close'] = '</ div>';

          La balise de fermeture pour la "dernière" lien.
          Personnalisation du lien "Suivant"
          $ Config ['next_link'] = '>';

          Le texte que vous souhaitez le montre le lien vers la page "suivante". Si vous ne voulez pas rendu ce lien, vous pouvez définir sa valeur à false.
          $ Config ['next_tag_open'] = '<div>;

          La balise d'ouverture pour le lien "Suivant".
          $ Config ['next_tag_close'] = '</ div>';

          La balise de fermeture pour le lien "Suivant".
          Personnalisation de la "Précédent" Link
          $ Config ['prev_link'] = '<';

          Le texte que vous souhaitez le montre le lien vers la page "précédent". Si vous ne voulez pas rendu ce lien, vous pouvez définir sa valeur à false.
          $ Config ['prev_tag_open'] = '<div>;

          La balise d'ouverture pour le "précédent" lien.
          $ Config ['prev_tag_close'] = '</ div>';

          La balise fermante d'un "précédent" lien.
          Personnalisation de la "Page courante" Link
          $ Config ['cur_tag_open'] = '<b>;

          La balise d'ouverture pour le «courant» lien.
          $ Config ['cur_tag_close'] = '</ b>';

          La balise fermante d'un «courant» lien.
          Personnalisation de la "Digit" Link
          $ Config ['num_tag_open'] = '<div>;

          La balise d'ouverture pour le "chiffre" lien.
          $ Config ['num_tag_close'] = '</ div>';

          La balise fermante d'un "chiffre" lien.
          Cacher les pages

          Si vous vouliez pas la liste des pages spécifiques (par exemple, vous ne souhaitez que les liens "suivant" et "précédent"), vous pouvez supprimer le rendu en ajoutant:
          $ Config ['display_pages'] = FALSE;
          Ajout d'une classe à chaque ancrage

          Si vous souhaitez ajouter un attribut de classe pour chaque lien rendus par la classe de pagination, vous pouvez définir la config "anchor_class" égal au nom de la classe que vous voulez.
          • Partager sur Facebook
          • Partager sur Twitter
            8 février 2011 à 18:28:25

            Sérieux c'est super ce que tu as fait, mais je ne vois toujours pas le problème du point de vue de mon code.

            Je remet le code :

            <?php
            
            class Welcome extends MY_Controller {
            	
            	public function __construct()
            	{
            	    parent::__construct();
                        $this->load->library('layout');
                        $this->load->model('News','News');
            	}
            	
            	public function index()
            	{
            	    
            	    $config['base_url'] = base_url().'index.php/welcome/page/';
            	    $config['first_url'] = base_url().'index.php/';
                        $config['total_rows'] = $this->News->count();
                        $config['per_page'] = 2; 
            	    $this->pagination->initialize($config);
                        $liens =  $this->pagination->create_links();
            	    $news = $this->News->get_page_news(1,$config['per_page']);
                        $this->layout->view('welcome/index',array('liens'=>$liens,'news'=>$news,'title'=>'News - Accueil','charset'=>'utf-8'));
            
            	}
            	
            	public function page($page)
            	{
                    
                        $config['base_url'] = base_url().'index.php/welcome/page/';
                	    $config['first_url'] = base_url().'index.php/';
                        $config['total_rows'] = $this->News->count();
                        $config['per_page'] = 2; 
                	    $this->pagination->initialize($config);
                        $liens =  $this->pagination->create_links();
                	    $news = $this->News->get_page_news($page,$config['per_page']);
                        $this->layout->view('welcome/index',array('liens'=>$liens,'news'=>$news,'title'=>'News - Accueil','charset'=>'utf-8'));
                 	
            	}
            	
            }
            
            /* End of file welcome.php */
            /* Location: ./system/application/controllers/welcome.php */
            ?>
            


            et le modèle :
            <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
            
            class News extends MY_Model
            {
                
            	protected $table = 'news';
            	
            	function get_page_news($page,$per_page){
                    
                    return $this->db->select('*')
            				           ->order_by('id', 'desc')
            				           ->limit(intval($per_page), (intval($page)-1) * $per_page)
            				           ->get($this->table)
            				           ->result();
                    
                }
                
            }
            





            Alors. Sur ma page d'index, c'est-à-dire celle définir dans first_url, j'ai fait un echo de <? $this->News->count(); : je trouve 6, donc en théorie trois page. Ça marche plutôt bien :

            url : http://localhost:8888/news/index.php/

            Image utilisateur


            En plus, ce sont les bonnes news qui s'affichent. Mais au niveau du code source, ça coince. Voilà ce que donne la pagination :

            &nbsp;<strong>1</strong>&nbsp;
            <a href="http://localhost:8888/tuto-sdz/module-news/index.php/welcome/page/2">2</a>
            &nbsp;<a href="http://localhost:8888/tuto-sdz/module-news/index.php/welcome/page/4">3</a>
            &nbsp;<a href="http://localhost:8888/tuto-sdz/module-news/index.php/welcome/page/2">&gt;</a>&nbsp;
            




            Comme vous le voyez, ça coince sur le lien n°3 : ça va vers la page 4. Et le liens vers la page deux se trouve sur... un espace insécable o_O !
            Si je clique sur la page 2, j'ai aussi les bonnes news, mais le code source plante encore (c'est presque le même) :

            url : http://localhost:8888/news/index.php/welcome/page/2

            Image utilisateur


            &nbsp;<a href="http://localhost:8888/tuto-sdz/module-news/index.php/">&lt;</a>
            &nbsp;<a href="http://localhost:8888/tuto-sdz/module-news/index.php/">1</a>
            &nbsp;<strong>2</strong>&nbsp;
            <a href="http://localhost:8888/tuto-sdz/module-news/index.php/welcome/page/4">3</a>
            &nbsp;<a href="http://localhost:8888/tuto-sdz/module-news/index.php/welcome/page/4">&gt;</a>&nbsp;
            




            La seule différence est que cette fois, le liens insécable pointe sur la page 4 également.

            Bon du coup, sans surprise, quand je clique sur le lien 3, je n'ai aucune news. Mais j'ai regardé ce que ça donnait en rentrant manuellement la page 3 dans l'url. Et là, surprise : j'ai biens les bonnes news, mais c'est la page 2 qui est en gras o_O !!

            url : http://localhost:8888/news/index.php/welcome/page/3

            Image utilisateur


            &nbsp;<a href="http://localhost:8888/tuto-sdz/module-news/index.php/welcome/page/1">&lt;</a>
            &nbsp;<a href="http://localhost:8888/tuto-sdz/module-news/index.php/">1</a>
            &nbsp;<strong>2</strong>&nbsp;
            <a href="http://localhost:8888/tuto-sdz/module-news/index.php/welcome/page/4">3</a>
            &nbsp;<a href="http://localhost:8888/tuto-sdz/module-news/index.php/welcome/page/4">&gt;</a>&nbsp;
            




            Voilà. J'ai essayé d'être le plus précis dans mon problème. J'espère que vous saurez m'aider. Merci d'avance :) !
            • Partager sur Facebook
            • Partager sur Twitter
              9 février 2011 à 19:18:42

              UP :( (je pense que c'est le framework qui buggue).
              • Partager sur Facebook
              • Partager sur Twitter
                9 février 2011 à 19:56:14

                Moi je penses que c'est toi qui beug. Hier j'ai passer trois heures a créé les liens de mon site je pensais que le beug venait de tout sauf de moi et au final c'estait moi qui beuger.

                Je pars de chercher des news du coter anglais car il son beaucoup plus renseigner que nous au sujet de CI je reviends avec ce que j'ai trouver.

                Elle est pas belle la vie


                http://blip.tv/file/4091938?utm_source=player_embedded
                • Partager sur Facebook
                • Partager sur Twitter
                  9 février 2011 à 20:33:12

                  c'etait quoi!!!!! dit nous !!!!!! Tu veus juste ne pas avoir a dire que c'etait bien toi qui beuger lol......

                  de rien
                  • Partager sur Facebook
                  • Partager sur Twitter
                    10 février 2011 à 17:37:33

                    J'ai dit que c'était ça. Mais mon problème n'est pas résolu. La vision de cette vidéo ne m'a pas aidé, ça plante toujours...
                    Et le problème est exactement le même. Les codes sont les même, je n'ai rien fait qui ne vas pas. De plus, cela ne dépend pas de la version, ça plantait déjà sous 1.7.2...

                    Regardez un peu mes codes au lieu de chercher des vidéos : y'a 60 lignes. Moi je ne vois rien, mais peut être que vous voyez quelque chose.

                    • Partager sur Facebook
                    • Partager sur Twitter
                      7 mars 2011 à 21:08:47

                      Haha. J'ai ENFIN l'explication. Le problème vient de... CodeIgniter !!!

                      En fait, quand on fait une requête type limite avec CI, il faut que la deuxième limite (offset) vale exactement le nombre d'entrées souhaitées. En effet, si on fait, par exemple, limit 0, 30 alors qu'il n'y a que 6 entrées, CI va retourner 24 résultat, et donc répéter les entrées. Tous les autres problèmes sont liés car, en effet, après avoir changé mes codes et mit à chaque fois le bon offset, toutes les pagination marchent (CI, celle de triviak et la mienne). En fait, j'ai fait une simple condition du style :

                      Si le nombre d'entrées comptées est inférieur au nombre d'entrées par page, prendre le nombre d'entrées comptées en offset. Sinon, prendre le nombre d'entrées par page.

                      ;)
                      • Partager sur Facebook
                      • Partager sur Twitter
                        24 mai 2013 à 11:49:13

                        Donc le problème se trouvait bien entre la chaise et le clavier :p
                        • Partager sur Facebook
                        • Partager sur Twitter
                          29 juillet 2014 à 11:48:16

                          Je ré-up ce post pour compléter un autre problème. J'avais un peu près le même code, mais mes pages passaient de 3 en 3 (et je souhaitais 3 nouvelles par page). 

                          J'avais oublié un paramètre : $config['use_page_numbers'] = TRUE;

                          Bon courage.

                          • Partager sur Facebook
                          • Partager sur Twitter
                            16 janvier 2018 à 9:32:20 - Message modéré pour le motif suivant : Toute forme de publicité est interdite


                            [CodeIgniter] pagination

                            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                            • Editeur
                            • Markdown