Pagination

Ceci est une ARCHIVE, peut-être périmée. Vérifiez bien les compatibilités !

Filtre générique et paramétrable permettant l’affichage de la liste des pages d’une boucle contenant un critère de limite du type {debut_xxx, yyy}

Attention ce filtre de pagination n’est pas compatible avec la version actuelle, désormais fournie en standard par SPIP 1.9. Si vous utilisiez cette contribution, vous devrez réviser vos squelettes (voir la nouvelle documentation) ; dans un premier temps, vous pouvez aussi chercher/remplacer toutes les occurrences du mot « pagination » par autre chose (ex : « paginer »), dans les squelettes ainsi que dans le fichier mes_fonctions.php.

Présentation

Ce filtre reprend les méthodes de calcul qui permettent de générer des listes de pages s’appuyant sur le très pratique critère {debut_xxx, yyy} qu’on retrouve un peu partout.

Rien de nouveau donc, si ce n’est qu’il apporte l’avantage de faire disparaître le code PHP des squelettes et mutualise cette fonctionalité pour un site entier.

Utilisation de base

Ce filtre s’applique à la balise #TOTAL_BOUCLE. les deux premiers paramètres sont obligatoires pour assurer le bon fonctionnement du filtre. L’exemple suivant liste les 10 derniers articles d’une rubrique et donc, les pages correspondantes :

<BOUCLE_articles_pagination(ARTICLES){id_rubrique}{par date}{inverse}>
</BOUCLE_articles_pagination>
[(#TOTAL_BOUCLE|pagination{debut_page,10})]
</B_articles_pagination>

<BOUCLE_article_liste(ARTICLES){id_rubrique}{par date}{inverse}{debut_page,10}>
...Ce qu'on veut...
<a href="#URL_ARTICLE">#TITRE</a>
...Ce qu'on veut...
</BOUCLE_article_liste>

-  Résultat :

La boucle articles_pagination va afficher les numéro de pages sous forme de lien, à l’exception de la page courante, séparés par des barres verticales ( | ) :

1 | 2 | 3

Utilisations avancées

-  Cosmétique

il est possible de définir 3 paramètres dans ecrire/mes_options.php3 :

— $pagination_item_avant et $pagination_item_apres

permettent d’encadrer chaque lien par le code html que l’on veut.

Exemple :

$pagination_item_avant = "<big>";
$pagination_item_apres = "</big>";

donne :

1 | 2 | 3

— $pagination_separateur

permet de remplacer la barre verticale par le code html que l’on veut.

Exemple :

$pagination_separateur = "<span style='color: Orange;'>&nbsp;:: </span>";

donne :

1 :: 2 :: 3

-  Transformation du nombre dans le lien

Vous pouvez préciser le nom d’un filtre dans le squelette lui-même pour transformer le nombre de chaque lien :

Exemple :

[(#TOTAL_BOUCLE|pagination{debut_page,10,chiffres_romains})]

I | II | III

Il convient, bien sur, de disposer d’un tel filtre, soit personnel dans mes_fonctions.php3, soit d’utiliser un filtre standard de SPIP.

-  urls personnalisées :

Pour des manipulations plus complexes, si vous définissez une fonction lien_pagination, vous disposez d’une plus vaste gamme de création de code html.

Cette fonction supplémentaire (et optionnelle, je le redis) doit être définie de la manière suivante :

function lien_pagination($url, $item, $valeur='')

où $url est l’adresse de base, $item est le nombre qui sera encadré par le lien <a href...>{{l'item, c'est moi!}}</a> que cette fonction va générer. $valeur, la valeur numérique de ce nombre.

Le code à ajouter dans votre fichier mes_fonctions.php3

/*
 *   +----------------------------------+
 *    Nom du Filtre :    pagination                                               
 *   +----------------------------------+
 *    Date : dimanche 22 août 2004
 *    Auteur :  James (klike<at>free.fr)
 *   +-------------------------------------+
 *    Fonctions de ce filtre :
 *     affiche la liste des pages d'une boucle contenant
 *     un critère de limite du type {debut_xxx, yyy}
 *   +-------------------------------------+ 
 *  
 * Pour toute suggestion, remarque, proposition d'ajout
 * reportez-vous au forum de l'article :
 * http://www.uzine.net/spip_contrib/article.php3?id_article=663
*/

function pagination($total, $position=0, $pas=1, $fonction='') {
  global $clean_link;
  global $pagination_item_avant, $pagination_item_apres, $pagination_separateur;
  tester_variable('pagination_separateur', '&nbsp;| ');
  if (ereg('^debut([-_a-zA-Z0-9]+)$', $position, $match)) {
    $debut_lim = "debut".$match[1];
    $position = intval($GLOBALS['HTTP_GET_VARS'][$debut_lim]);
  }
  $nombre_pages = floor(($total-1)/$pas)+1;
  $texte = '';
  if($nombre_pages>1) {
    $i = 0;
    while($i<$nombre_pages) {
      $clean_link->delVar($debut_lim);
      $clean_link->addVar($debut_lim, strval($i*$pas));
      $url = $clean_link->getUrl();
      if(function_exists($fonction)) $item = call_user_func($fonction, $i+1);
      else $item = strval($i+1);
      if(($i*$pas) != $position) {
        if(function_exists('lien_pagination')) $item = lien_pagination($url, $item, $i+1);
        else $item = "<a href=\"".$url."\">".$item."</a>";
      }
      $texte .= $pagination_item_avant.$item.$pagination_item_apres;
      if($i<($nombre_pages-1)) $texte .= $pagination_separateur;
      $i++;
    }
    //Correction bug: $clean_link doit revenir à son état initial
    $clean_link->delVar($debut_lim);
    if($position) $clean_link->addVar($debut_lim, $position);
     return $texte;
  }
  return '';
}

// FIN du Filtre pagination

Note supplémentaire sur l’utilisation de ce filtre

-  Il faut 2 boucles. Pour 2 raisons :
— l’habillage, si on souhaite ’paginer’ avant une liste ou ailleurs...
— la technique : on doit avoir un #TOTAL_BOUCLE réel pour déterminer le nombre de pages. Si ce filtre est appelé dans la même boucle qui sert à générer la liste, on obtient, évidement, toujours un nombre de page égal à 1...
Ces 2 boucles doivent donc être basées sur les mêmes critères, sinon le calcul est faussé. Toutefois le critère {debut_xxx, yyy} doit être présent dans la définition de la boucle qui liste et absent dans la boucle qui ’pagine’ où on le retrouvera à l’identique dans le filtre.

Je n’ai pas d’exemple spectaculaire à proposer, mais je pense que cette fonction allègera pas mal les squelettes de spip-forum, contrib’ à laquelle je n’avais, hélas, pas participé depuis longtemps ;-)

Ce filtre peut s’avérer pratique pour les boucles de signatures de pétitions, de recherche ({recherche}) mais peut s’appliquer à priori à n’importe quel cas, même tordu.