SPIP-Contrib

SPIP-Contrib

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

291 Plugins, 198 contribs sur SPIP-Zone, 85 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 ?

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

  • Formidable, le générateur de formulaires

    23 janvier 2012 – 2531 commentaires

    Un générateur de formulaires facilement configurable pour les non-informaticiens et facilement extensible pour les développeurs. Introduction L’objectif était de créer un plugin permettant de générer des formulaires. Historiquement, 2 plugins (...)

  • Calendrier Mini 2.0

    19 mai 2012 – 256 commentaires

    Ce plugin ajoute la balise #CALENDRIER_MINI qui insère un petit widget de navigation par mois dans les dates des évènements. Fonctionnement du mini calendrier Le mini calendrier présente un mois à la fois. Les jours du mois comportant des (...)

  • Owl Carousel 2

    30 novembre 2017 – 41 commentaires

    Owl Carousel est un diaporama jQuery adaptable aux différentes tailles d’écran, qu’on peut actionner par glisser, il utilise CSS3 mais il est compatible avec les vieux navigateurs, et il est aussi paramétrable. Le présent plugin permet d’utiliser (...)

  • Paiement avec Formidable

    16 février 2015 – 69 commentaires

    Ce plugin « Paiement avec Formidable » permet d’ajouter une étape de paiement à la fin de la saisie d’un formulaire créé par le plugin Formidable. Il le complète et nécessite par ailleurs le plugin bank qui gère l’interface technique avec les prestataires (...)

  • Bouquinerie V2 : guide de l’utilisateur

    3 janvier – 18 commentaires

    Configuration Quels contenus Selon la maquette adoptée pour votre site, vous pouvez décider que certains éléments des livres ou auteurs de livre ne sont pas utilisés. Vous trouverez dans la page de configuration du plugin la possibilité de (...)