guiderdoni.net

Bloc notes : spip, css, xhtml, web, standards, mac ...

Accueil > Spip > Pagination

Articles de cette rubrique

Articles

publie le samedi 5 novembre 2005 par Alexandra

Pagination

Limiter l’affichage des articles d’une rubrique en paginant

Quelques liens sur la question de la pagination

http://www.spip-contrib.net/
Affic...

Pagination

http://www.spip-contrib.net/Paginat...

http://www.boomtchak.net/article.ph...

La contrib de James à l’avantage de faire disparaître le code PHP des squelettes :
http://www.spip-contrib.net/Paginat...

La contrib de Yorghos
http://www.spip-contrib.net/Paginat...

Sur le forum webrankinfo
http://www.webrankinfo.com/forums/v...

Mise à jour de la contrib de Robert
http://www.linagora.org/article54.html

Sur ce site j’ai utilisé la contribution de Cassiopea en modifiant des bricoles pour une validation xhtml.

http://support.cassiopea.org/spip/
...

Mais La meilleure solution désormais est d’adopter la contrib 100 % Spip de James, qui peut s’appliquer à toutes les boucles.

Pagination avec la contribution de James et des précisions de Mortimer

- Il faut soit ecrire :

       
<BOUCLE_articles_pagination(ARTICLES){id_mot}
{par titre}> </BOUCLE_articles_pagination>
[(#TOTAL_BOUCLE|pagination{debut_page,15})]
</B_articles_pagination>

Avec un espace dansla boucle, sinon SPIP suppose qu’elle retourne rien, et donc n’affiche pas le </B_

- Ou alors, meilleure solution,

utiliser le <//B_ :

       
<BOUCLE_articles_pagination(ARTICLES){id_mot} {par titre}></BOUCLE_articles_pagination>
[(#TOTAL_BOUCLE|pagination{debut_page,15})]
<//B_articles_pagination>

C’est un peu difficile à illustrer l’utilité, mais si tu as un code "optionelle" avant qui doit aussi dépendre du retour d’une des boucles imbriquées, alors c’est utile.

Par contre la contrib parle de

Quelques exemples de boucles avec cette fonctionnalité de pagination

       
<!-- Articles lies au mot-cle -->
<BOUCLE_articles_pagination(ARTICLES){id_mot} {par titre}></BOUCLE_articles_pagination>
        [(#TOTAL_BOUCLE|pagination{debut_page,15})]
<//B_articles_pagination>

<!-- Articles dans une rubrique  -->
<BOUCLE_articles_pagination(ARTICLES){id_rubrique}>
</BOUCLE_articles_pagination>
[(#TOTAL_BOUCLE|pagination{debut_page,15})]
</B_articles_pagination>

Veiller à mettre le filtre dans mes_fonctions.php3 à la racine du site.

Faire la modification indiqué par James sur le forum de sa contribution


$url = str_replace("&", "&", $clean_link->getUrl());

pour la validation xhtml.

Si on pagine plusieurs fois sur le même squelette, donner une valeur différente à debut_page. Penser à mettre aussi les mêmes critères dans la boucle de pagination que dans celle qui suit.

J’ai abondamment utilisé la contribution de James ici
http://www.science-islam.net/squele...

Le premier filtre de la contrib de James était dans mes fonctions.

?php
   $GLOBALS['dossier_squelettes'] = 'squelettes';
   
   
   /*
*   +----------------------------------+
*    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 = str_replace("&", "&", $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


?>

Puis après il y a eu une page pagination.php/php3 suivant la version de spip et des extensions à mettre dans le dossier squelette avec ce code dans mes fonctions.php3

<?php
$f_pagination = find_in_path('pagination.php');
if($f_pagination) include_local($f_pagination);
?>

Cela fonctionne dans toutes les versions SPIP 1.8.

En revanche il faut le modifier pour les versions SPIP 1.9

Le code adéquat de mes_fonctions fournis par James et mis sur le spip-blog est le suivant pour la 1.9 :

<?php
  if(!include_spip('pagination')) {

function balise_PAGINATION($p) {

$p->code = "”";

return $p;

}

}

?>

Le filtre pagination est désormais contenu dans pagination.php dans le répertoire squelettes

<?php

function recuperer_variables_pagination($total, $debut, $pas, $texte) {
        return array(
                'lien_base' => $GLOBALS['clean_link']->getUrl(),
                'total' => $total,
                'position' => $GLOBALS['contexte'][$debut],
                'pas' => $pas,
                'nombre_pages' => floor(($total-1)/$pas)+1,
                'page_courante' => floor($GLOBALS['contexte'][$debut]/$pas)+1,
                'lien_pagination' => function_exists('lien_pagination') ?
                        lien_pagination($texte) :
                        '<a href="@url@">@item@</a>'
        );
}

/*
*   +----------------------------------+
*    Nom du Filtre :    pagination                                              
*   +----------------------------------+
*    Date : dimanche 22 aout 2004
*    Modifiee : mercredi 23 novembre 2005
*    Auteur :  James (james<at>rezo.net)
*    Licence : GNU/GPL
*   +-------------------------------------+
*    Fonctions de ce filtre :
*     affiche la liste des pages d'une boucle contenant
*     un critËre de limite du type {debut_xxx, yyy} et depuis la 1.8.2e
*     du type {debut, #ENV{pas,10}}
*   +-------------------------------------+
*  
* Pour toute suggestion, remarque, proposition d'ajout
* inscrivez-vous et ecrivez a la liste de discussion : spip-zone<at>rezo.net
* Pour les explications sur l'utilisation de ce filtre,
* reportez-vous a l'article :
* http://www.spip-contrib.net/Pagination,1212
*/

function pagination($total, $debut='page', $pas=10, $fonction='') {
        global $pagination_item_avant, $pagination_item_apres, $pagination_separateur;
        global $pagination_max, $pagination_max_texte;
        tester_variable('pagination_separateur', '&nbsp;| ');
        tester_variable('pagination_max_texte', '...');
        if(!$fonction) $fonction = 'strval';

        $pagination = recuperer_variables_pagination($total, $debut, $pas, 'pagination');

        if($pagination_max == 0 OR $pagination_max>=$pagination['nombre_pages']) {
                $premiere = 1;
                $derniere = $pagination['nombre_pages'];
                $texte_avant = '';
                $texte_apres = '';
        }
        else {
                $premiere = max(1, $pagination['page_courante']-floor($pagination_max/2));
                $derniere = min($pagination['nombre_pages'], $premiere+$pagination_max-1);
                $premiere = $derniere == $pagination['nombre_pages'] ? $derniere-$pagination_max+1 : $premiere;
                $texte_avant = $premiere>1 ? $pagination_max_texte.' ' : '';
                $texte_apres = $derniere<$pagination['nombre_pages'] ? ' '.$pagination_max_texte : '';
        }

        $texte = '';
        if($pagination['nombre_pages']>1) {
                $i = $premiere;
                while($i<=$derniere) {
                        $url = parametre_url($pagination['lien_base'], $debut, strval(($i-1)*$pas));
                        $_item = function_exists($f='pagination_'.$fonction)  ?
                                $f($i, $pagination) :
                                $fonction($i);
                        $item = ($i != $pagination['page_courante']) ?
                                preg_replace(array(',@url@,', ',@item@,'), array($url, $_item), $pagination['lien_pagination']) :
                                $_item;
                        $texte .= $pagination_item_avant.$item.$pagination_item_apres;
                        if($i<$pagination['nombre_pages']) $texte .= $pagination_separateur;
                        $i++;
                }
                return $texte_avant.$texte.$texte_apres;
        }
        return '';
}
// FIN du Filtre pagination

/* affichage par etendue */
function pagination_etendue($i, $pagination, $texte='-') {
        return strval(($i-1)*$pagination['pas']+1) .
                $texte .
                strval(min($pagination['total'], $i*$pagination['pas']));
}

/* Indicateurs de position */
function pagination_sur_pages($total, $debut='page', $pas=10, $texte="/") {
        $pagination = recuperer_variables_pagination($total, $debut, $pas, 'sur_page');       
        return ($pagination['nombre_pages']>1) ?
                $pagination['page_courante'].$texte.$pagination['nombre_pages'] :
                '';
}

function pagination_sur_total($total, $debut='page', $pas=10, $texte='-', $sur="/") {
        $pagination = recuperer_variables_pagination($total, $debut, $pas, 'sur_total');
        return ($pagination['nombre_pages']>1) ?
                ($pagination['position']+1).$texte.min($total, $pagination['position']+$pas).$sur.$total :
                '';
}
       
function pagination_tout_voir($total, $debut='page', $pas=10, $texte="|<&nbsp;&gt;|", $texte_retour="&gt;|<", $var_pas='pas') {
        $pagination = recuperer_variables_pagination($total, $debut, $pas, 'tout_voir');
        $url = parametre_url($pagination['lien_base'], $debut, strval(0));
        $url = parametre_url($url, $var_pas, $total);
        $url_retour = parametre_url($pagination['lien_base'], $var_pas, '');
        return ($pagination['nombre_pages']>1) ?
                preg_replace(array(',@url@,', ',@item@,'), array($url, $texte), $pagination['lien_pagination']) :
                ($texte_retour ?
                        preg_replace(array(',@url@,', ',@item@,'), array($url_retour, $texte_retour), $pagination['lien_pagination']) :
                        '');
}

/* liens particuliers */
function premiere_page($total, $debut='page', $pas=10, $texte="|<<") {
        $pagination = recuperer_variables_pagination($total, $debut, $pas, 'premiere');
        $url = parametre_url($pagination['lien_base'], $debut, strval(0));
        return ($pagination['nombre_pages']>1 && $pagination['page_courante']>1) ?
                preg_replace(array(',@url@,', ',@item@,'), array($url, $texte), $pagination['lien_pagination']) :
                '';
}

function page_precedente($total, $debut='page', $pas=10, $texte="<") {
        $pagination = recuperer_variables_pagination($total, $debut, $pas, 'precedente');
        $precedent = $pagination['position']-$pas;
        $url = parametre_url($pagination['lien_base'], $debut, strval($precedent));
        return ($pagination['nombre_pages']>1 && $pagination['page_courante']>1) ?
                preg_replace(array(',@url@,', ',@item@,'), array($url, $texte), $pagination['lien_pagination']) :
                '';
}

function page_suivante($total, $debut='page', $pas=10, $texte="&gt;") {
        $pagination = recuperer_variables_pagination($total, $debut, $pas, 'suivante');
        $suivant = $pagination['position']+$pas;
        $url = parametre_url($pagination['lien_base'], $debut, strval($suivant));
        return ($pagination['nombre_pages']>1 && $pagination['page_courante']<$pagination['nombre_pages']) ?
                preg_replace(array(',@url@,', ',@item@,'), array($url, $texte), $pagination['lien_pagination']) :
                '';
}

function derniere_page($total, $debut='page', $pas=10, $texte="&gt;&gt;|") {
        $pagination = recuperer_variables_pagination($total, $debut, $pas, 'derniere');
        $dernier = ($pagination['nombre_pages']-1)*$pas;
        $url = parametre_url($pagination['lien_base'], $debut, strval($dernier));
        return ($pagination['nombre_pages']>1 && $pagination['page_courante']<$pagination['nombre_pages']) ?
                preg_replace(array(',@url@,', ',@item@,'), array($url, $texte), $pagination['lien_pagination']) :
                '';
}

/*
* balise #PAGINATION{page,#ENV{pas,10}}
*/
function balise_PAGINATION_dist ($p) {
        $b = $p->nom_boucle ? $p->nom_boucle : $p->descr['id_mere'];
        if ($b === '') {
                erreur_squelette(
                        _T('zbug_champ_hors_boucle',
                                array('champ' => '#PAGINATION')
                        ), $p->id_boucle);
                $p->code = "''";
        }
        elseif (!$p->param || $p->param[0][0]) {
                erreur_squelette(
                        /*_T('zbug_champ_manquant',
                                array('champ' => '#PAGINATION')*/
                        _L('param&eacute;tre manquant pour #PAGINATION')
                        , $p->id_boucle);
                $p->code = "''";
        }
        else {
                $position =  calculer_liste($p->param[0][1],
                                        $p->descr,
                                        $p->boucles,
                                        $p->id_boucle);

                $pas =  calculer_liste($p->param[0][2],
                                        $p->descr,
                                        $p->boucles,
                                        $p->id_boucle);

                $fonction =  calculer_liste($p->param[0][3],
                                        $p->descr,
                                        $p->boucles,
                                        $p->id_boucle);

                // autres filtres
                array_shift($p->param);
               
                $p->boucles[$b]->numrows = true;
                $p->code = "pagination(\$Numrows['$b']['total'],".$position.",".$pas.",".$fonction.")";
        }

        $p->statut = 'html';
        #$p->interdire_scripts = true; //SVN
        return $p;
}


?>

titre documents joints

Pagination Pagination

http://support.cassiopea.org/spip/s...

Zip 4 ko

Modification du script de Cassiopea pour la validation xhtml Modification du script de Cassiopea pour la validation xhtml Zip 997 octets

mes_fonctions.php3 avec le filtre de James mes_fonctions.php3 avec le filtre de James Zip 1 ko

Forum

Répondre à cet article

2 commentaires

Pagination

La pagination de James compatible 1.9 est aussi sur la zone :
http://zone.spip.org/trac/spip-zone...

15 mai 2006, par Alexandra - repondre message

La pagination de James a été intégrée nativement dans la spip 1.9 beta 2.
Le filtre dans mes_options est donc désormais inutile.

2 juin 2006, par Alexandra - repondre message
2005-2017 - Contenu en GPL http://www.guiderdoni.net - Site réalisé avec SPIP 
rechercher - plan du site - prive - alexandra.guiderdoni@gmail.com
CSS - XHTML - squelette