Rubrique ++

Cet article vous propose 2 petits « plus » pour votre page rubrique : la pagination et le décompte de réponses.

Avec SPIP et un dose de PHP, on peut améliorer la page rubrique standard pour lui apporter 2 petits « plus » qui seront d’autant plus utiles que le site est actif :

-  la pagination ; ça donne quelque chose comme ceci avec des pages de 25 articles :


Les autres articles : (0-24)(25-49)(50-53)

(c’est un exemple factice ; il faudra vous contenter d’ imaginer les liens sur les parties en gras)

-  le compte des réponses à un article comme ceci :


Titre
le 23 Mars 2004 par marc

3 réponses

(imaginons là encore, un lien sur la partie en gras)

Ce qui suit peut en réalité, s’appliquer à d’autres pages que votre page rubrique. Le code comporte 4 blocs détaillés ci-après. Vous pouvez les insérer dans cet ordre dans votre page.

Bloc de décompte d’articles

En 4 lignes, le problème est réglé ! La boucle SPIP compte le nombre d’articles : le résultat, donné par la balise #TOTAL_BOUCLE, est stocké dans une variable PHP (total) qui va nous servir un peu plus loin.

<B_compte>
    <BOUCLE_compte(ARTICLES) {id_rubrique} {par titre}> </BOUCLE_compte>
    [<?php $total =(#TOTAL_BOUCLE) ?>]
</B_compte>

Cette boucle, aussi courte soit-elle, n’est pas nulle en temps d’exécution, mais c’est la manière SPIP de faire les choses (le prix du confort). Notez également comment il est possible de mixer du SPIP avec du PHP : normal, les instructions du langage SPIP vont être transformées en instructions PHP par l’interprêteur SPIP.

Bloc affichage d’une page d’article

On va afficher une page rubrique de N articles en utilisant le critère SPIP debut_xxx, N qui permet de donner une valeur initiale pour la boucle ainsi qu’un nombre N d’ éléments à traiter à partir de cette valeur. Ici, la valeur initiale sera nommée debut_art et la tranche N fixée à 25.

Pour SPIP, debut_art est un paramètre d’URL au même titre qu’un numéro de rubrique ; c’est à dire qu’au moment de l’invocation de page, ça va donner un URL comme :


rubrique.php3 ?id_rubrique=22&debut_art=50

Par ailleurs SPIP n’est pas troublé si cette information manque, il considérera que ça correspond au cas debut_art=0.

En dehors de ce critère, la boucle est parfaitement standard :

<BOUCLE_articles_recents(ARTICLES) {id_rubrique}{par date}{inverse}{debut_art,25}>
	<h2><a href="#URL_ARTICLE" [title="(#DESCRIPTIF|textebrut|entites_html)"]>#TITRE</a></h2>
	<div class="detail">
	[(#DATE|nom_jour)] [(#DATE|affdate)]
	<B_auteurs_recents>par <BOUCLE_auteurs_recents(AUTEURS) {id_article} {", "}>#NOM</BOUCLE_auteurs_recents>
	</div>
        <!-- Insérer ici le bloc comptage réponses décrit plus bas -->
	<br>
</BOUCLE_articles_recents>

Bloc comptage de réponses

Si vous souhaitez faire apparaître les réponses (quand il y en a), vous pouvez insérer le bloc suivant à l’intérieur de la boucle que l’on vient de voir (il y a même un commentaire pour ne pas se tromper d’endroit).

On retrouve une boucle similaire à celle du premier bloc, sauf qu’elle porte sur FORUMS et non sur ARTICLES. Notez le critère plat qui permet de tout recenser : les réponses à l’article et les réponses aux réponses.

<B_forums_decpt>
    <BOUCLE_forums_decpt(FORUMS){id_article}{plat}> </BOUCLE_forums_decpt>
    <center>
    [<b><a href="#URL_ARTICLE">(#TOTAL_BOUCLE) r&eacute;ponse(s)</a></b>]
    </center>
<//B_forums_decpt>

On pourrait d’ailleurs améliorer réponse(s) en proposant singulier ou pluriel. Pour ce faire, on peut se définir la fonction suivante (à insérer dans le squelette ou dans le fichier mes_fonctions.php3)
 :

<?php
function accorder  ($nombre, $nom) {
	switch ($nombre) {
          case 0 : return ""; 
          case 1 : return $nombre."&nbsp;".$nom;
          default : return $nombre."&nbsp;".$nom."s";
	}
}
?>

qu’on utilisera comme suit :

[<b><a href="#URL_ARTICLE">(#TOTAL_BOUCLE|accorder{réponse})</a></b>]

Bloc de navigation par pages

Pour finir, voici le PHP qui permettra une navigation dans les pages de la rubrique. On utilise la variable total vue plus haut pour calculer le nombre de pages et le nombre d’articles restant sur la dernière page.

Quelques commentaires :

-  la première instruction PHP vérifie que la variable total existe bien (souvenons nous que la boucle de comptage d’article n’a peut-être retourné aucun résultat, auquel cas total n’a jamais été créée) ; autrement elle est créée avec la valeur 0
-  l’instruction define permet de définir via TRANCHE la taille des pages ; si l’on veut des pages de 50 articles et non 25, c’est ici qu’il faut agir, mais ne pas oublier de modifier la boucle ARTICLES plus haut,
-  les 2 instructions suivantes permettent de calculer le nombre de pages et le nombre d’articles restant au moyen d’une division entière (floor) et de l’opération modulo (%)
-  la suite du code est exécutée s’il y a plus d’une page seulement ; elle a pour but d’afficher les P pages avec P-1 liens comme on l’a vu dans l’exemple. Elle comporte de l’algorithmique classique ainsi que l’instruction echo, fondamentale pour PHP, qui a pour but de « cracher » le code HTML final dans lequel on retrouve notre &debut_art= pour chaque URL à générer.

<?php
 if (!isset($total)) $total = 0;
 define (TRANCHE, 25);
 $pages = floor($total / TRANCHE);
 $reste = $total %TRANCHE;
 if ($pages >= 1) {
     echo "Les autres articles: ";
     for($i = 0; $i < $pages; $i++) {
       if (floor($debut_art / TRANCHE)==$i) {
         echo "(",$i*TRANCHE,"-",($i+1)*TRANCHE -1,")";
       } else {
         echo "<b><a href=#URL_RUBRIQUE&debut_art=",$i*TRANCHE,">(",$i*TRANCHE,"-",($i+1)*TRANCHE -1,")</a></b> ";
       }
     } 
     if ($reste != 0){
       if (floor($debut_art / TRANCHE)==$pages) {
         echo "(",$pages*TRANCHE,"-",$pages*TRANCHE +$reste -1,")";
       } else {
         echo "<b><a href=#URL_RUBRIQUE&debut_art=",$pages*TRANCHE,">(",$pages*TRANCHE,"-",$pages*TRANCHE +$reste -1,")</a></b>";
       }
     }
 }
?>

Notez les balises SPIP à l’intérieur du code PHP ; elles coexistent très bien puisque l’interprêteur SPIP, qui est d’ailleurs codé en PHP, va les remplacer par des noms de variables PHP avant de soumettre tout ce code à l’interprêteur PHP pour exécution finale.

Discussion

Aucune discussion

Ajouter un commentaire

Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :

  • Désactiver tous les plugins que vous ne voulez pas tester afin de vous assurer que le bug vient bien du plugin X. Cela vous évitera d’écrire sur le forum d’une contribution qui n’est finalement pas en cause.
  • Cherchez et notez les numéros de version de tout ce qui est en place au moment du test :
    • version de SPIP, en bas de la partie privée
    • version du plugin testé et des éventuels plugins nécessités
    • version de PHP (exec=info en partie privée)
    • version de MySQL / SQLite
  • Si votre problème concerne la partie publique de votre site, donnez une URL où le bug est visible, pour que les gens puissent voir par eux-mêmes.
  • En cas de page blanche, merci d’activer l’affichage des erreurs, et d’indiquer ensuite l’erreur qui apparaît.

Merci d’avance pour les personnes qui vous aideront !

Par ailleurs, n’oubliez pas que les contributeurs et contributrices ont une vie en dehors de SPIP.

Qui êtes-vous ?
[Se connecter]

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Ajouter un document

Suivre les commentaires : RSS 2.0 | Atom