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

2 discussions

  • 2

    J’étais très heureux de trouver un compteur de commentaires. _ _ Hélas en suivant les instructions à la lettre, je n’affiche aucun resultat de la boucle B_forums_decpt.
    J’ai placé celle ci dans la page auteur, je pense que cela n’a rien à voir pourtant.
    J’ai simplement renommé comme sur l’ancienne boucle article principale Boucle 4..C’est tout !
    Je ne comprends plus rien de rien

    • Marcopol

      Si cela peut aider , voici la boucle que j’utilise sur ma page sommaire avec le filtre ’accorder’ décrit ici.

      <!-- Articles recents  -->
      <BOUCLE_detail(ARTICLES){par date} {inverse}{0,15}{doublons}>
      	[(#LOGO_ARTICLE_RUBRIQUE|left)]
      	[<div class="surtitre">(#SURTITRE)</div>]
      	<h2 class="titre-extrait"><a href="#URL_ARTICLE">#TITRE</a></h2>
      	[<div class="surtitre">(#SOUSTITRE)</div>]
      	<div class="detail">
      	[(#DATE|nom_jour)] [(#DATE|affdate)]
      	<B_auteurs1>par <BOUCLE_auteurs1(AUTEURS) {id_article} {", "}>#NOM [((#BIO))]</BOUCLE_auteurs1>
      	</div>
      	[<div class="texte">(#INTRODUCTION)</div>] 
      	<BOUCLE_forums_decpt(FORUMS){id_article}{plat}> </BOUCLE_forums_decpt>
      		<div class="reponse">
      		[<b><a href="#URL_ARTICLE">(#TOTAL_BOUCLE|accorder{'r&eacute;ponse'})</a></b>]
      		</div>
      	</B_forums_decpt>
      	<br>
      </BOUCLE_detail>
    • Merci, ppour la rapidité de la réponse.
      Et Merci pour l’astuce cela fonctionne impeccablement maintenant.
      Bravo !

    Répondre à ce message

  • 2
    xaccrocheur (ça marche pas en ce moment, grmll)

    Bonjour

    Actuellement j’affiche sur une page à l’ergonomie de type « blog », mes breves.
    C’est le principe du site : Les articles sont « rangés » dans les rubs, et les breves tombent dans l’ordre chrono. sur le page d’accueil.
    Ca marche très bien, depuis un moment déjà.
    Mais j’éssaie sans succès d’afficher, à coté du lien « commenter cette breve » le nombre des commentaires, sur la page d’accueil dont je viens de parler (ça veut dire plusieurs comptes sur une même page)

    Actuellement j’ai ça :

    	<B_breves>
    
    	<BOUCLE_breves(BREVES) {par date} {inverse} {0,16}>
    	<h2 class="titre-extrait"><a href="#URL_BREVE" style="color: black;">#TITRE</a></h2>
    		<div class="detail">
    		[(#DATE|nom_jour)] [(#DATE|affdate)]
    		</div>
    		[<div class="extrait">(#TEXTE)</div>]
    		[<div class="forum-repondre"><A HREF="forum.php3?(#PARAMETRES_FORUM)" id="link"><:repondre_breve:></A></div>]
    	
    	</BOUCLE_breves>
    	</B_breves>

    qui donc, fonctionne très bien.

    Si j’insère vos modifs (j’ai bien pensé à éditer mes_fonctions ;) ) celà donne ça :

    	<B_breves>
    
    	<BOUCLE_breves(BREVES) {par date} {inverse} {0,16}>
    	<h2 class="titre-extrait"><a href="#URL_BREVE" style="color: black;">#TITRE</a></h2>
    		<div class="detail">
    		[(#DATE|nom_jour)] [(#DATE|affdate)]
    		</div>
    		[<div class="extrait">(#TEXTE)</div>]
    		[<div class="forum-repondre"><A HREF="forum.php3?(#PARAMETRES_FORUM)" id="link"><:repondre_breve:></A></div>]
    	
    # boucle
    <B_compte>
       <BOUCLE_compte(ARTICLES) {id_rubrique} {par titre}> </BOUCLE_compte>
       [<?php $total =(#TOTAL_BOUCLE) ?>]
    </B_compte>
    
    # boucle
    <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>
    
    #fonction
    [<b><a href="#URL_ARTICLE">(#TOTAL_BOUCLE|accorder{réponse})</a></b>]
    
    	</BOUCLE_breves>
    	</B_breves>

    Mais alors là, au mieux j’obtiens un chiffre, toujours le même, qui semble être (16) le nombre total de réponses à toutes mes brèves...?

    Je pense que je me marche dessus avec les ouvertures, et fermetures de boucles...?

    J’ai bien conscience de la complexité du PB, aussi je suggère une réponse du style : « Tu n’as rien compris au principe des boucles de forum, jeune padawan, lis donc CE DOCUMENT » et le lien qui va bien...?
    Je précise que j’ai lu ça et que ça ne m’a pas aidé... :(

    Merci encore pour SPIP, outil fabuleux, et pour votre générosité qui ne s’arrete même pas au developpement.

    NB - Mon mail est down, je n’ai accès qu’au wwweb.

    Philippe

    PS - Comment faîtes-vous ce « onblur » vert dégradé" dans le « testarea » ?

    • Bonjour,

      Tout d’abord le compte de brèves doit être fait au moyen d’une boucle BREVE et non d’une boucle ARTICLE. Cette boucle ne doit pas être imbriquée dans une autre. D’autre part il faut utiliser le critère debut_xxx dans la boucle de pagination proprement dite. Enfin la boucle de compte FORUM doit comporter le critere id-breve et pas id-article.

      En espérant que ça aide, je rappelle quand même que la lecture de la documentation Spip est aussi important que la pratique.

      Bonne continuation,

    • xaccrocheur

      > Bonjour,

      Yo ! Merci de cette réponse si rapide !

      > Tout d’abord le compte de brèves doit être fait au

      > moyen d’une boucle BREVE et non d’une boucle ARTICLE.

      Mince. J’ai fait 1 copy/paste de trop et je me suis marché dessus. Autant pour moi, là c’est clair, on compte bien des brèves, et pas des articles. /bin.done.

      > Cette boucle ne doit pas être imbriquée dans une

      > autre.

      Alors *là*, c’est là que j’ai un problème, moi !
      Car enfin, il s’agit bien de modifier une boucle existante ! Elle est là, elle va bien, elle m’affiche mes information *exactement* comme je l’ai voulu, et je voudrais juste la *modifier* de sorte qu’elle présente un décompte des réponses *pour chaque élément*...?
      ...Et donc, comment faire autrement que de l’imbriquer dans une autre ?!?

      > D’autre part il faut utiliser le critère debut_xxx

      > dans la boucle de pagination proprement dite. Enfin

      > la boucle de compte FORUM doit comporter le critere

      > id-breve et pas id-article.

      OK bien noté

      > En espérant que ça aide, je rappelle quand même que

      > la lecture de la documentation Spip est aussi

      > important que la pratique.

      Bien sur que ça aide ! Et bien sur que j’ai RTFM, et notamment plein de choses sur ce fameux décompte de réponses, mais je ne *parviens pas* à m’en sortir.... :(

      Là, j’ai suivi vos recommandations et me suis retrouvé avec :

      # Pour la boucle seule, C à D non-« imbriquée » :

      Le code :

      	</BOUCLE_breves> <= (fermeture de ma boucle de breves)
      	</B_breves>
      
      # boucle
      <B_compte>
         <BOUCLE_compte(BREVES) {id_rubrique} {par titre}> </BOUCLE_compte>
         [<?php $total =(#TOTAL_BOUCLE) ?>]
      </B_compte>
      
      # boucle
      <B_forums_decpt>
         <BOUCLE_forums_decpt(FORUMS){id_breve}{plat}> </BOUCLE_forums_decpt>
         <center>
         [<b><a href="#URL_BREVES">(#TOTAL_BOUCLE) r&eacute;ponse(s)</a></b>]
         </center>
      <//B_forums_decpt>

      Le résultat :
      Rien dans la boucle d’affichage de breves, bien sur, et mes trois repères, en bas, vides :

       # boucle # boucle #fonction

      # Pour la boucle imbriquée,

      Le code :

      <B_compte>
         <BOUCLE_compte(BREVES) {id_rubrique} {par titre}> </BOUCLE_compte>
         [<?php $total =(#TOTAL_BOUCLE) ?>]
      </B_compte>
      
      # boucle
      <B_forums_decpt>
         <BOUCLE_forums_decpt(FORUMS){id_breve}{plat}> </BOUCLE_forums_decpt>
         <center>
         [<b><a href="#URL_BREVES">(#TOTAL_BOUCLE) r&eacute;ponse(s)</a></b>]
         </center>
      <//B_forums_decpt>
      
      #fonction
      [<b><a href="#URL_BREVES">(#TOTAL_BOUCLE|accorder{réponse})</a></b>]
      
      	</BOUCLE_breves>
      	</B_breves>

      Le résultat :
      un décompte de 16 réponses, pour *toutes* les brèves...? :
      # boucle # boucle #fonction 16 réponses
      Dont le lien est : http://hallucinet.free.fr/sommaire-.php3?recalcul=oui&submit=reload#URL_BREVES

      > Bonne continuation,

      Mais j’espere bien, quant à vous, merci beaucoup d’aider les béotiens dans mon genre ;)

    Répondre à ce message

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