Pagination

All contributions published for previous SPIP versions

Affiche X liens vers des articles, par page, dans une rubrique et place les liens adéquats (X articles précédents, liens vers 10 pages/rubriques maxi à compter de celle où on se trouve, X articles suivants). Utilise du PHP dans la boucle.

Principe

Si, dans le squelette rubrique.html, on a mis une BOUCLE(ARTICLES) avec le paramêtre {tout}, les pages rubriques vont grandir au fur et à mesure du remplissage du site. Si on a limité le nombre d’articles (avec le paramètre {0, 20}, par exemple), on « perd » les plus anciens.

L’avantage de cette boucle, est qu’on n’est plus obligé de limiter le nombre de liens vers les articles dans une page rubrique, tout en évitant de voir grandir cette page à l’infini. C’est ce qu’on appelle la pagination.

Exemple

Ici avec une syndication, mais c’est le même principe qu’avec les articles : http://wb.attac.be/rubrique.php3?id_rubrique=48

Télécharger le code

Pagination: version III, sept 2003 à télécharger ici

Adresse de publication originale :
http://support.cassiopea.org/spip/spip-tech.shtml#nb_article_rub

Pour ceux qui veulent en savoir plus:

Codes de la contribution

  1. le code + la boucle à copier / coller dans la page rubrique.
  2. le fichier article-pagine.inc à télécharger dans le répertoire racine de votre site spip (là où il y a les squelettes .php3).

N’oubliez pas de télécharger aussi fleche-gauche.gif et fleche-droite.gif dans /NAVPICS.

A propos des squelette inclus:
Si vous mettez la boucle dans un squelette inclus, il est nécessaire mais apparament pas suffisant d’appeler le squelette inclus avec . Il faut en plus, ré-imbriquer la boucle dans une boucle rubriques et dans le squelette inclus lui-même. On ne sait pas pourquoi, mais on sait que sinon ca ne marche pas bien. Celui qui trouve va passer pour un fortiche ;-). En bref pour les squelettes inclus, ca donne ceci:

<BOUCLE_rubrique(RUBRIQUES){id_rubrique}>
        Le code et la boucle ci-dessous ...
</BOUCLE_rubrique>

1) le code + la boucle à copier / coller dans la page rubrique

<!-- Compte et affiche le nombre total d'articles de la rubrique -->
<B_compte_articles>
 <BOUCLE_compte_articles(ARTICLES){id_rubrique}>
 <?php $total=#TOTAL_BOUCLE; ?>
 </BOUCLE_compte_articles>
Nombre total d'articles: #TOTAL_BOUCLE
</B_compte_articles>

<!-- Initialisation du compteur et du nombre d'articles par page (php) -->
<?php
//Nombre d'articles par page: Ici, 15 article par page. Vous pouvez bien sur mettre un autre nombre que 15..
//Attention, il doit être égal au nombre du critère {debut_article,15}
$nb_art_par_page=15; 
if (isset($debut_article)) {$compteur=$debut_article;} else {$compteur=0;} 
?>

<B_articles>
 <b>Articles</b><br><br>
 <ul>
<!-- Attention: Le nombre 15 dans {debut_article,15} doit être égal à $nb_art_par_page=15; ci-dessus -->
<BOUCLE_articles(ARTICLES){id_rubrique}{par date}{inverse}{debut_article,15}>
  <li><a href="#URL_ARTICLE">[(#TITRE)]</a></li> 

<!-- Incrémentation du compteur (php) -->
<?php if ($compteur<0) {$compteur=0;} else {$compteur+=1;} ?>

 </BOUCLE_articles>
 </ul>

<!-- Lien vers page précédente et suivante (php) -->
<div style="text-align:left">
<?php
// Param: $idtype = #ID_RUBRIQUE|#ID_MOT|... , $type = "rubrique"|"mot"|...
$idtype=#ID_RUBRIQUE; $type = "rubrique";
include "article-pagine.inc";
?>
</div>

</B_articles>
 <br>Il n'y a pas d'articles dans cette rubrique.
<//B_articles>

2)le code contenu dans "article-pagine.inc

<?php

// Auteur: robert.sebille(at)cassiopea.org - sept 2003 
// Sous licence GNU/GPL http://www.gnu.org/copyleft/gpl.html 
// Retourne les liens XX articles suivants / précédents


// Gestion des n° de pages
$mod0 = $total % $nb_art_par_page;
if ($mod0 == 0) 
  {$total_page = floor($total / $nb_art_par_page);}
else
  {$total_page = floor($total / $nb_art_par_page) + 1;}

$page = floor($compteur / $nb_art_par_page);
$page_inv = $total_page - $page + 1;

if ($mod0 !=0 && ($total - $compteur) < $mod0) 
  {$page = $total_page; $page_inv = 1; $offset_art_prec = $total - $mod0 - $nb_art_par_page;}
else 
  {$offset_art_prec = $compteur - (2 * $nb_art_par_page);}


// Gestion de l'affichage des liens
// fleche gauche
if ($total_page > 1) {
	$affiche = ""; $pageplus_inv = $page_inv + 1; $pagemoins_inv = $page_inv - 1;
  if ($offset_art_prec >= 0) 
	{$affiche .= "<a href='$type.php3?id_$type=$idtype&debut_article=$offset_art_prec' title='Les ".$nb_art_par_page." articles suivants'><img src='NAVPICS/fleche-gauche.gif' width='15' height='9' alt='Vers la page ".$pageplus_inv." et les ".$nb_art_par_page." articles suivants' border='0'></a>&nbsp;&nbsp;";} 

// Milieu
	$affiche .= "Page(s):";

	$MaxPageLinks = 10;
	if ($total_page - ($MaxPageLinks - 1)  > $page_inv) 
		{$PageStart = $page_inv + ($MaxPageLinks - 1);} else {$PageStart = $total_page;}
	if ($PageStart - ($MaxPageLinks -1) < 1) 
		{$PageEnd = 1;} else {$PageEnd = $PageStart - ($MaxPageLinks - 1);}

	for ($i = $PageStart; $i >= $PageEnd; $i--) {
		$offset_inv = ($nb_art_par_page * $total_page) - ($i * $nb_art_par_page);
		if ($i != $page_inv)
			{$affiche .= "&nbsp;<a href='$type.php3?id_$type=$idtype&debut_article=$offset_inv'>&nbsp;$i&nbsp;</a>";}
		else
			{$affiche .= "&nbsp;|&nbsp;$i&nbsp;|";}
	}	// End ($i = $PageStart; $i >= $PageEnd; $i--)

// fleche droite
	if ($compteur < $total) 
		{if (($compteur+$nb_art_par_page) > $total) {$nb_art_suiv = $total - $compteur;} else {$nb_art_suiv = $nb_art_par_page;}
		$affiche .= "&nbsp;<a href='$type.php3?id_$type=$idtype&debut_article=$compteur' title='Les ".$nb_art_suiv." articles précédents'><img src='NAVPICS/fleche-droite.gif' width='15' height='9' alt='Vers la page ".$pagemoins_inv." et les ".$nb_art_suiv." articles précédents' border='0'></a>";} 

// Dessous
	$affiche .= "<br>Nombre total de page(s): $total_page";

} // End if ($total_page > 1)

echo $affiche;

?>

Remarque de mise à jour

Changements dans la version III
-  L’appel de fonction qui provoquait la Fatal error : Call to undefined function : getarticlelinks() sur certains sites a été supprimé et remplacé par un fichier inclus (article-pagine.inc) qui contient le code (qui n’est donc plus dans mes_fonctions.php3)
-  Une correction a été apportée au code qui obligeait à ce que la page traitée soit une page rubrique. Ce peut-être maintenant n’importe quelle boucle qui supporte le critère Spip {debut_xxx,b} (relire cette doc sur spip.net ), une boucle mot, par exemple, ou encore une boucle SYNDIC_ARTICLES, comme sur cette page, etc. Il faut bien sur alors adapter les boucles spip au cas choisi

Pour ceux qui avaient implémenté la version II et qui souhaitent passer à la version III

1) Uploader le fichier “article-pagine.inc” dans le répertoire racine de votre site spip (là où il y a les squelettes .php3).

2) Dans le code du squelette .html à paginer, remplacer

les anciennes lignes:

// Param: compteur, nb_art_par_page, total, #ID_RUBRIQUE||#ID_MOT, "rubrique"||"mot"
echo getArticleLinks($compteur, $nb_art_par_page, $total, #ID_RUBRIQUE, "rubrique");

par ces nouvelles:

// Param: $idtype = #ID_RUBRIQUE|#ID_MOT, $type = "rubrique"|"mot"
$idtype=#ID_RUBRIQUE; $type = "rubrique";
include "article-pagine.inc";

3) Supprimer le code de la fonction “getArticleLinks(..” de votre fichier mes_fonctions.php3. (ce dernier point n’est pas obligatoire, mais inutile de charger du code devenu inutile).

updated on 5 December 2006

Discussion

12 discussions

  • bonjour,

    j’ai fait exactement comme vous expliquez mais ça marche pas du tout, ça n’a rien changé !!! pourriez vous m’aider le plus vite possible SVP?

    merci

    Reply to this message

  • Bonjour ! D’abord, merci de coder des trucs comme ça, vraiment nécéssaires (j’en ai besoin depuis le début !) d’une part, et d’assurer ainsi le support, d’autre part !

    Ce que je cherche à faire, c’est d’utiliser ce hack sur ma page de sommaire, où j’affiche la liste de TOUTES les breves de TOUTES les rubriques (genre blog) un peu comme si c’était une rubrique, mais qui contient tout.

    De fait, juste en remplaçant ARTICLE par BREVE, le script me trouve le nombre de breves, mais j’ai du mal à comprendre comment je peux lui dire de ne pas s’occuper des rubriques ?

    J’espere que je suis clair...? Ce qui est sur, c’est que je cherche à faire ça depuis longtemps ! Donc, je triche, et j’en suis à quatre &amp;quot;fausses&amp;quot; pages de sommaire, qui me servent juste à incrémenter la boucle
    &amp;lt;BOUCLE_breves(BREVES) par date inverse 0,24&amp;gt; avec un lien vers la page suivante, qui elle, contient
    &amp;lt;BOUCLE_breves(BREVES) par date inverse 24,48&amp;gt;
    Et ainsi de suite, et je n’aime pas devoir dupliquer comme ça du code :/

    Merci de votre aide !

    -  phil

    Reply to this message

  • Bonjour
    Tout d’abord merci pour cette contrib très pratique !
    Petite question : comment faire pour inverser les chiffres présents après “Pages :” ? En fait actuellement j’ai “Pages : 3 | 2 | 1” où le 3 correspond à mes articles les plus récents, et je voudrais que ceux-ci soient désignés par un 1, ce qui me semble plus logique...
    Merci pour vos avis !

    Reply to this message

  • erational

    merci beaucoup, le script fonctionne tres bien... sauf sur le moteur de recherche car on l’appelle de la facon suivante recherche.php?recherche=brest et non en recherche.php?id_recherche=brest

    voici ma solution au début du script

    // hack pour paginer recherche
    if ($type != "recherche") $type2 = "id_$type";
                         else $type2 = $type;

    et ensuite remplacer ds le code id_$type par $type2

    Reply to this message

  • Salut de l’Espagne et pardon pour mon française

    ¿Il y a des personnes avec pagination dans INCLURE et ça marche?

    J’ai de la pagination dans un squelette inclus et avec le boucle ROUBRIQUES dans les deux squelettes, mais ça ne marche pas: on affiché le premiére page tout le temp n’import quelle page je demande, et si je recalcul une page on affiché cette tout le temp. En breve: on affiché tout le temp le derniére page recalculé.

    Dans rubrique.html

    ...
    <BOUCLE_rubrique(RUBRIQUES) {id_rubrique}>
      <INCLURE(seccion.php3) {id_rubrique}>
    </BOUCLE_rubrique>
    ...

    Dans seccion.html

    <BOUCLE_estaseccion(RUBRIQUES) {id_rubrique}>
      ...
      <BOUCLE_articles(ARTICLES){branche}{doublons}{par date}{inverse}{debut_indice,10}>
      ...
      <BOUCLE_articles>
    </BOUCLE_estaseccion>
    ...

    et avec les URL

    rubrique.php3?id_rubrique=n&debut_indice=0
    rubrique.php3?id_rubrique=n&debut_indice=10
    ...

    J’ai cherché la CACHE et il y a une seule fichier ’seccion-76.f80c9e’ avec le premieres 10 articles (ou le derniére page recalcule).

    Ainsi, je croi que c’est un probléme avec les INCLURE et la cache. J’ai cherché dans le code de SPIP et il paraît que <INCLURE(seccion.php3) {id_rubrique}> généré un seul fichier a la CACHE pour chaque rubrique ’seccion-76...’ (76 c’est le id_rubrique actuel). Ainsi, il faut générer a la CACHE des fichiers pout chaque rubrique-debut (seccion-76-0..., seccion-76-10...) et pour ça il faut un deuxiéme critére dans le INCLURE avec le debut.

    J’ia ne sais pas s’il y a maniére pour faire ça, mais j’ai utilisé un “truc” pour ajouter des variables a l’URL dans le contexte actuel (il y a une spip-contrib a tester avec ça id_article=488)

    Dans rubrique.html

      <BOUCLE_rubrique(RUBRIQUES) {id_rubrique}>
    
    Ça ajoute la variable 'debut_indice' a l'URL dans le contexte actuel.
    La balise #URL_SITE_SPIP ne sert a rien, seulement pour lancer le filtre
    
        [(#URL_SITE_SPIP|set_var_entorno_from_get{'debut_indice', $contexte})]
    
    Ça ajoute le critére de la pagination pour générer des fichiers a la cache pour chaque page
     
        <INCLURE(seccion.php3) {id_rubrique} {debut_indice}>
      </BOUCLE_rubrique>

    Dans mes_fonctions.php3 il faut le filtre:

    function set_var_entorno_from_get($void, $var, &$contexte) {
        $contexte["$var"] = $GLOBALS['HTTP_GET_VARS'][$var];
        return;
    }

    S’il vous plaît: ¿Il y a des personnes avec pagination dans INCLURE qui ça marche sans des “trucs”?

    J’ia ajouté aussi cêtte truc-ci a spip-contrib (id_article=496)

    Salut

    Jose M Sánchez

    Sevilla

    España

    Reply to this message

  • Désolé, mais je n’arrive absolument pas à faire marcher ce système de pagination :
    -  en SPIP 1.5.2, la page est blanche (développement local) et
    -  en SPIP 1.7, ... j’ai des rubrique vides, ce qui n’est absolument pas le cas.
    J’ajouterai que les commentaires et l’aide sont insuffisants.

    J’adore SPIP, et j’aimerais pouvoir utiliser des trucs comme ça, mais ... malgré tous mes essais d’une journée, ma compréhension partielle mais suffisante de SPIP et php, rien n’y fait.
    Développons SPIP, mais développons vraiment pour tous !!!

    Sans rancune ;-o)
    François

    Reply to this message

  • Quelqu’un aurait-il Xpagination ?
    Le site de boomtchak étant fermé, le script n’y est plus.

    Amicalement
    Grégoire

    Reply to this message

  • 5

    Suite de la precedente demande :

    Pour utiliser cette boucle, je n’utilise pas rubrique.php3 mais mot.php3...

    Par ailleurs, quand j’affiche la page dans le navigateur avec une URL du type :

    .../mot.php3

    j’obtiens bien le resultat “il n’y a pas d’article dans cette rubrique”

    En revanche si l’URL est du type :
    .../mot.php3?id_mot=10

    alors j’obtiens le message d’erreur dont je parle dans le precedent message.

    Je ne sais pas si cela aidera...

    merci encore

    • est-ce que tu as essayé la nouvelle version mise en ligne aujourd’hui ? ton problème ressemble à celui décrit dans l’article et qui est fixé depuis (ps: il semble cela dit qu’il s’agisse d’un problème spécifique a easyphp car je ne l’ai pas rencontré lors de mes tests (local sous mac os x et sur mon site)

    • Je suis passé ce jour de la version II à la III. Le problème reste inchangé.

    • Curieux, c’est pourtant cette version qui fonctionne ici:
      http://wb.attac.be/mot12.html

      Suggestions:
      -  As-tu adapté le code de la boucle à l’option choisie? pour une page mot, il faut bien sur mettre:
      $idtype=#ID_MOT; $type = "mot";
      (à la place de $idtype=#ID_RUBRIQUE; $type = "rubrique";)
      -  Penser à faire recalculer la page et à vider le cache du navigateur

    • Je l’avais pas fait (ignorant que je suis !!)...Ceci dit cela ne fonctionne toujours pas. J’ai refait toute la manip depuis le debut...rien n’y fait...toujours la même erreur...

    • Fabrice WANG

      Est que l’on peut avoir un affichage de type 1|2|3...
      Si oui comment faire ?

    Reply to this message

  • Bonjour,
    j’ai bien utilisé ce script pour paginer une liste d’articles à l’intérieur d’une page rubrique.
    Par contre, je n’ai pas réussi la mise au point sur le résultat d’une recherche, faute de trouver le bon param à utiliser. Le nombre de pages est bien calculé, mais c’est toujours la première qui s’affiche.
    Quelqu’un aurait-il réussi ce type de mise en page?

    Si je trouve une solution, je vous le dis, promis..

    Reply to this message

  • 1

    Bonjour,

    La boucle affiche 76 Articles en haut de la rubrique.

    Je ne voudrai que le nombre et non le mot Articles à la suite du chiffre.

    Est-ce possible et comment. J’ai beau chercher...

    Merci,

    Michel

    • A quoi correspond : $idtype=#ID_BREVE; par exemple
      Comment fait on si l’on veut afficher la liste des brèves avec une sélection sur un mot clé ?

      MErci

    Reply to this message

Comment on this article

Who are you?
  • [Log in]

To show your avatar with your message, register it first on gravatar.com (free et painless) and don’t forget to indicate your Email addresse here.

Enter your comment here

This form accepts SPIP shortcuts {{bold}} {italic} -*list [text->url] <quote> <code> and HTML code <q> <del> <ins>. To create paragraphs, just leave empty lines.

Add a document

Follow the comments: RSS 2.0 | Atom