Un bloc de pagination classe

Aujourd'hui je vous propose une petite classe très pratique et très adaptable pour générer des blocs de pagination en HTML. « Qu'est-ce qu'un bloc de pagination ? » vous demandez-vous dubitatif. Voici un début de réponse :

Le bloc de pagination, sa vie, son œuvre

Didactique CM2 : Il y en a partout dès qu'il y a beaucoup de lecture. Le bloc de pagination c'est ce petit truc composé de chiffres et de symboles qui vous permet de parcourir facilement les pages d'un thème très intéressant sur un forum ou un blog.

Premiers pas

Imaginons un blog avec 30 messages. Ce serait très pénible pour le visiteur que tous les messages soient affichés sur une même page. On décide donc de n'afficher que 5 messages par page et on va utiliser la classe WdPager pour nous créer notre bloc de pagination :

<?php

echo new WdPager(305);

Ce qui retournera quelque chose comme :

1,2,3,4,5,6

Soit en code HTML :

<strong>1</strong><span class="separator">,</span><a href="?page=1">2</a><span class="separator">,</span><a href="?page=2">3</a><span class="separator">,</span><a href="?page=3">4</a><span class="separator">,</span><a href="?page=4">5</a><span class="separator">,</span><a href="?page=5">6</a><a href="?page=1" class="next">&gt;</a>

Pour obtenir le bloc de pagination de la 4ème page on utilisera le code suivant :

<?php

echo WdPager(3053);

1,2,3,4,5,6

Soit en code HTML :

<a href="?page=2" class="previous">&lt;</a><a href="?page=0">1</a><span class="separator">,</span><a href="?page=1">2</a><span class="separator">,</span><a href="?page=2">3</a><span class="separator">,</span><strong>4</strong><span class="separator">,</span><a href="?page=4">5</a><span class="separator">,</span><a href="?page=5">6</a><a href="?page=4" class="next">&gt;</a>

CSS quand tu nous tiens

Évidement, ça ne paie pas de mine comme cela, mais comme vous avez pu le remarquer, il y a des balises et des classes dans tous les sens, de quoi décider de l'espace entre les numéros de page, de supprimer les séparateurs (les virgules) ou encore de transformer les symboles suivant et précédent.

Voici un exemple d'utilisation trouvé sur blogvipère :

Pager

Balises et classes

Voici les sélecteurs pour les divers éléments du bloc de pagination :

  • Numéro de page courant : strong
  • Autres numéro de page : a
  • Séparateurs : span.separator
  • Les espaces (…) : span.gap
  • Page précédente : a.previous
  • Page suivante : a.next

La classe en question

Maintenant, pour votre plus grande joie, voici la classe WdPager :

<?php

class WdPager
{
    public $add_arrows = true;
    public $reverse_arrows = false;
    public $separator = '<span class="separator">,</span>';
    public $gap = '<span class="gap"> ... </span>';
    public $base_url = '?page=';
    
    private $count;
    private $limit;
    private $on_page;
    
    public function __construct($count$limit=5$on_page=0)
    {
        $this->count = $count;
        $this->limit = $limit;
        $this->on_page = $on_page;
    }

    public function getURL($n)
    {
        return $this->base_url . $n;
    }
    
    public function getLink($n$label=NULL$class=NULL)
    {
        $rc = '<a href="' . $this->getURL($n) . '"';
        
        if ($class)
        {
            $rc .= ' class="' . $class . '"';
        }
        
        $rc .= '>';
        
        $rc .= $label ? $label : ($n + 1);
        
        $rc .= '</a>';
        
        return $rc;
    }
    
    public function getPosition($n)
    {
        return '<strong>' . $n . '</strong>';
    }

    public function __toString()
    {
        $pages = ceil($this->count / $this->limit);
    
        if ($pages == 1)
        {
            return '';
        }

        $on_page = $this->on_page + 1;
    
        $rc = NULL;
        
        if ($pages > 10)
        {
            $init_page_max = min($pages3);
    
            for ($i = 1 ; $i < $init_page_max + 1 ; $i++)
            {
                if ($i == $on_page)
                {
                    $rc .= $this->getPosition($i);
                }
                else
                {
                    $rc .= $this->getLink($i - 1);
                }
    
                if ($i < $init_page_max)
                {
                    $rc .= $this->separator;
                }
            }
    
            if ($pages > 3)
            {
                if (($on_page > 1) && ($on_page < $pages))
                {
                    $rc .= ($on_page > 5) ? $this->gap : $this->separator;
    
                    $init_page_min = ($on_page > 4) ? $on_page : 5;
                    $init_page_max = ($on_page < $pages - 4) ? $on_page : $pages - 4;
    
                    for ($i = $init_page_min - 1$i < $init_page_max + 2$i++)
                    {
                        $rc .= ($i == $on_page) ? $this->getPosition($i) : $this->getLink($i - 1);

                        if ($i < $init_page_max + 1)
                        {
                            $rc .= $this->separator;
                        }
                    }
    
                    $rc .= ($on_page < $pages - 4) ? $this->gap : $this->separator;
                }
                else
                {
                    $rc .= $this->gap;
                }
    
                for($i = $pages - 2 ; $i < $pages + 1 ; $i++)
                {
                    $rc .= ($i == $on_page) ? $this->getPosition($i) : $this->getLink($i - 1);
                    
                    if ($i < $pages)
                    {
                        $rc .= $this->separator;
                    }
                }
            }
        }
        else
        {
            for ($i = 1 ; $i < $pages + 1 ; $i++)
            {
                $rc .= ($i == $on_page) ? $this->getPosition($i) : $this->getLink($i - 1);
                
                if ($i < $pages)
                {
                    $rc .= $this->separator;
                }
            }
        }
    
        if ($this->add_arrows)
        {
            #
            # add next (>) link
            #
        
            if ($this->reverse_arrows ? ($on_page > 1) : ($on_page < $pages))
            {
                $rc .= $this->getLink($this->reverse_arrows ? $on_page - 2 : $on_page'&gt;''next');
            }
            
            #
            # add prev (<) link
            #
        
            if ($this->reverse_arrows ? ($on_page < $pages) : ($on_page > 1))
            {
                $rc = $this->getLink($this->reverse_arrows ? $on_page : $on_page - 2'&lt;''previous') . $rc;
            }
        }
    
        return $rc;
    }
}

Si vous avez jeté un œil malicieux aux variables de la classe, vous avez sans peine remarqué qu'il suffit de pas grande chose pour adapter la classe à vos besoins sans avoir même à écrire une sous-classe. L'URL de base ?page= ne vous convient pas ? Changez en ! Les séparateurs ne sont pas ce que vous espériez ? Modifiez-les ! Les symboles suivant et précédent ne vont pas dans le bon sens ? Mettez la variable arrows_reverse à true ! Vous ne voulez même pas de ces symboles ? Mettez la variable add_arrows à false.

Que demande le peuple ? « DES CULOTTES ! »

Un dernier mot

Attention, la classe demande la version 5 de PHP. Vous pouvez l'adapter facilement à la version 4, mais vous n'aurez alors plus la joie d'un echo $pager. Autre chose, si vous conservez l'URL de base, la page courante se trouve dans $_GET['page'].

Voilà, vous savez tout.
Amusez-vous bien !

Laisser un commentaire

Pas de commentaire