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
(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é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." ".$nom;
default : return $nombre." ".$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.
Aucune discussion
Ajouter un commentaire
Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :
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.
Suivre les commentaires : |