SPIP-Contrib

SPIP-Contrib

عربي | Deutsch | English | Español | français | italiano | Nederlands

288 Plugins, 197 contribs sur SPIP-Zone, 149 visiteurs en ce moment

Accueil > Navigation > Navigation à suivre > Rubrique ++

Rubrique ++

8 juillet 2004 – par marcopol – commentaires

2 votes

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.

Dernière modification de cette page le 7 décembre 2006

Retour en haut de la page

Vos commentaires

  • Le 2 mars 2005 à 19:17, par byld En réponse à : > Rubrique ++

    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

    • Le 2 mars 2005 à 21:32, par Marcopol En réponse à : > > Rubrique ++

      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>
    • Le 2 mars 2005 à 23:26, par byld En réponse à : > > > Rubrique ++

      Merci, ppour la rapidité de la réponse.
      Et Merci pour l’astuce cela fonctionne impeccablement maintenant.
      Bravo !

    Répondre à ce message

  • Le 31 janvier 2005 à 16:40, par xaccrocheur (ça marche pas en ce moment, grmll) En réponse à : > Rubrique ++

    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 » ?

    • Le 31 janvier 2005 à 21:19, par Marcopol En réponse à : > Rubrique ++

      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,

    • Le 1er février 2005 à 11:55, par xaccrocheur En réponse à : > Rubrique ++

      > 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

Répondre à cet article

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 Les choses à faire avant de poser une question (Prolégomènes aux rapports de bugs. )
Ajouter un document

Retour en haut de la page

Ça discute par ici

  • GIS 4

    11 août 2012 – 1417 commentaires

    Présentation et nouveautés La version 4 de GIS abandonne la libraire Mapstraction au profit de Leaflet. Cette librairie permet de s’affranchir des librairies propriétaires tout en gardant les mêmes fonctionnalités, elle propose même de nouvelles (...)

  • Plugin Domlang : Domaines par secteur de langue

    4 septembre – commentaires

    Domlang est un plugin qui permet d’associer un nom de domaine ou un sous-domaine à un secteur de langue. Ce plugin convient pour un site qui utilise des secteurs de langues. En configuration, pour chaque secteur, vous pourrez définir une URL (...)

  • Menu de langues sous forme de liens

    30 novembre 2009 – 121 commentaires

    Par défaut, le menu de langue de SPIP s’affiche : Sous la forme d’une liste déroulante ; En affichant toutes les langues du site, qu’elles soient utilisées ou non (c’est à même si elles ne sont pas affectées à au moins un article ou une rubrique) ; Sans (...)

  • Agenda 2.0

    3 novembre 2008 – 1098 commentaires

    Voici la version pour SPIP 2.0 du Plugin Agenda pour SPIP 1.9.2, avec une interface remaniée pour encore plus de plaisir. Pour une documentation concernant l’utilisation d’Agenda 3 pour SPIP 3, veuillez pour l’instant vous référer à SPIP 3, Agenda (...)

  • Mailsubscribers

    16 janvier 2013 – 332 commentaires

    Ce plugin permet de gérer les inscriptions (ou abonnements) à la diffusion de contenu par email. Mailsubscribers permet de gérer les inscriptions par Opt-in simple ou double et la désinscription par URL. Ce plugin gère également plusieurs listes de (...)