Afficher directement l’article si la rubrique n’en a qu’un

Dans un menu de navigation, quand une rubrique n’a qu’un article, aller directement l’afficher plutôt que de passer par la page rubrique avec un seul article listé.

Pour SPIP 1.6 ou 1.7

Je me suis donc mis à développer un site avec des rubriques qui pour l’instant n’ont qu’un seul article (voire même pas d’article, mais seulement des liens).

J’ai donc utilisé le code suivant pour faire mes liens.

<BOUCLE_Rubriques(RUBRIQUES){id_parent=0} {par num titre}><h2 title="[(#DESCRIPTIF)]">[(#TITRE|supprimer_numero)]</h2>
  <BOUCLE_SsRubriques(RUBRIQUES){id_parent} {par num titre}><li>
  <?php $ledescriptif = '[(#DESCRIPTIF|texte_script)]';
	$letitre='[(#TITRE|texte_script|supprimer_numero)]';
  ?>
  <BOUCLE_articles_plusdun(ARTICLES) {id_rubrique} {1,1}>
  <a href="[(#URL_RUBRIQUE)]" title="<? echo $ledescriptif; ?>"><? echo $letitre; ?></a>
  </BOUCLE_articles_plusdun>
	  <BOUCLE_articles_unseul(ARTICLES) {id_rubrique} {0,1}>
	  <a href="[(#URL_ARTICLE)]" title="<? echo $ledescriptif; ?>"><? echo $letitre; ?></a>
	  </BOUCLE_articles_unseul>
	  <a href="[(#URL_RUBRIQUE)]" title="<? echo $ledescriptif; ?>"><? echo $letitre; ?></a>
	  <//B_articles_unseul>
  <//B_articles_plusdun>
  </li></BOUCLE_SsRubriques>
</ul>
</BOUCLE_Rubriques>

Quelques remarques pour comprendre ces boucles :

  • les rubriques principales n’ont pas d’articles, seules les sous-rubriques en ont (et il n’y a que 2 niveaux de rubriques)
  • Il y a 3 cas à gérer :
    1. Il y a au moins 2 articles : renvois sur la rubrique
    2. Il n’y a qu’un article : renvois sur l’article
    3. Il n’y a pas d’article (ça peut se produire : quand il n’y a que des liens ou que des brèves) : renvois sur la rubrique
  • Dans tous les cas, on a stocké avant de faire les sous-boucles le titre et descriptif de la rubrique concernée pour pouvoir les mettres dans le lien.

Mise à jour pour la 1.8

La version 1.8 de SPIP introduit la notion de Balises non ambiguës. Ceci permet de réécrire cette contrib sans utiliser de php (qui ne servait après tout qu’à récupérer le #TITRE et le #DESCRIPTIF de la rubrique alors qu’on était déjà dans un boucle ARTICLES).

<BOUCLE_Rubriques(RUBRIQUES){id_parent=0} {par num titre}><h2 title="[(#DESCRIPTIF|supprimer_tags|attribut_html)]">[(#TITRE|supprimer_numero)]</h2>
  <BOUCLE_SsRubriques(RUBRIQUES){id_parent} {par num titre}><li>
  <BOUCLE_articles_plusdun(ARTICLES) {id_rubrique} {1,1}>
  <a href="[(#URL_RUBRIQUE)]"[ title=(#_SsRubriques:DESCRIPTIF|supprimer_tags|attribut_html)]">[(#_SsRubriques:TITRE|supprimer_numero)]</a>
  </BOUCLE_articles_plusdun>
	  <BOUCLE_articles_unseul(ARTICLES) {id_rubrique} {0,1}>
	  <a href="[(#URL_ARTICLE)]"[ title=(#_SsRubriques:DESCRIPTIF|supprimer_tags|attribut_html)]">[(#_SsRubriques:TITRE|supprimer_numero)]</a>
	  </BOUCLE_articles_unseul>
	  <a href="[(#URL_RUBRIQUE)]"[ title=(#_SsRubriques:DESCRIPTIF|supprimer_tags|attribut_html)]">[(#_SsRubriques:TITRE|supprimer_numero)]</a>
	  <//B_articles_unseul>
  <//B_articles_plusdun>
  </li></BOUCLE_SsRubriques>
</ul>
</BOUCLE_Rubriques>

Version universelle : illimitée et récursive

Et voici, toujours pour la version 1.8.x de SPIP ce qu’il faut écrire pour avoir une liste à puce plus ou moins indentée reprenant la structure hiérarchique des rubriques du site, quelle que soit la profondeur de cette hiérarchie.

<B_Secteurs>
<ul>
  <BOUCLE_Secteurs(RUBRIQUES){racine}{par num titre}{doublons}>
  <li><BOUCLE_articles_plusdunSecteurs(ARTICLES) {id_rubrique} {1,1}><a href="[./(#URL_RUBRIQUE)]" title="[(#_Secteurs:DESCRIPTIF|supprimer_tags|attribut_html)]">[(#_Secteurs:TITRE|supprimer_numero)]</a></BOUCLE_articles_plusdunSecteurs><BOUCLE_articles_unseulSecteurs(ARTICLES) {id_rubrique} {0,1}><a href="[./(#URL_ARTICLE)]" title="[(#_Secteurs:DESCRIPTIF|supprimer_tags|attribut_html)]">[(#_Secteurs:TITRE|supprimer_numero)]</a></BOUCLE_articles_unseulSecteurs><a href="[./(#URL_RUBRIQUE)]" title="[(#_Secteurs:DESCRIPTIF|supprimer_tags|attribut_html)]">[(#_Secteurs:TITRE|supprimer_numero)]</a><//B_articles_unseulSecteurs>  <//B_articles_plusdunSecteurs>
<B_Rubriques>
<ul>
  <BOUCLE_Rubriques(RUBRIQUES){id_parent}{par num titre}{doublons}>
  <li><BOUCLE_articles_plusdun(ARTICLES) {id_rubrique} {1,1}><a href="[./(#URL_RUBRIQUE)]" title="[(#_Rubriques:DESCRIPTIF|supprimer_tags|attribut_html)]">[(#_Rubriques:TITRE|supprimer_numero)]</a></BOUCLE_articles_plusdun><BOUCLE_articles_unseul(ARTICLES) {id_rubrique} {0,1}><a href="[./(#URL_ARTICLE)]" title="[(#_Rubriques:DESCRIPTIF|supprimer_tags|attribut_html)]">[(#_Rubriques:TITRE|supprimer_numero)]</a></BOUCLE_articles_unseul><a href="[./(#URL_RUBRIQUE)]" title="[(#_Rubriques:DESCRIPTIF|supprimer_tags|attribut_html)]">[(#_Rubriques:TITRE|supprimer_numero)]</a><//B_articles_unseul>  <//B_articles_plusdun><BOUCLE_SsRubriques(BOUCLE_Rubriques)></BOUCLE_SsRubriques></li>
  </BOUCLE_Rubriques>
</ul>
</B_Rubriques>
   </li>
  </BOUCLE_Secteurs>
</ul>
</B_Secteurs>

Notez l’usage d’un appel de boucle récursif :

<BOUCLE_SsRubriques(BOUCLE_Rubriques)></BOUCLE_SsRubriques>

Cet appel permet de descendre dans la hiérarchie tant qu’il faut pour parcourir l’ensemble des sous-niveaux.

note admins spip-contrib : si utile pour comprendre, la même fonctionnaité expliqué (un peu) différemment sur http://www.3studio.org/blog.php?id_...

Discussion

22 discussions

  • 6
    Bonjour !

    J'ai créé une petite variante à cette contrib : elle redirige sur les articles et les rubriques également.

    Il faut créer un fichier nommé redirection_1_seul_article.html dans le répertoire squelettes de votre site

    Contenu du fichier redirection_1_seul_article.html :



    L'appel se fait via :



    Principe : - on teste s'il existe d'autres sous rubriques dans la rubrique courante - on teste s'il existe d'autres articles dans la rubrique courante - on teste si la rubrique courante possède une description

    S'il n'y a aucune sous-rubrique, 1 seul article et que le texte de la rubrique courante est vite, alors on redirige sur l'article unique de la rubrique courante.

    S'il n'y a aucun article, 1 seule sous-rubrique et que le texte de la rubrique courante est vide, alors on redirige vers la sous-rubrique unique de la rubrique courante.

    Quel est l'intérêt ?

    Si vous avez, pour des raisons de catégorisation, des rubriques ne contenant qu'une seule sous-rubrique ou qu'un seul article, l'utilisateur n'aura pas à "gaspiller" des clicks pour atteindre le 763ème niveau de l'arborescence.

    Et voilà, merci de votre attention !

    Mika
    • PS :

      Désolé pour le message précédent, mais j’ai malheureusement oublié d’envelopper mon code de balises <HTML>, et il est donc illisible.

      Bonne journée,

      Mika

    • Salut
      Pour ma part je débute (c’est à dire que je n’y connais strictement rien en php). Je cherche depuis un moment une contrib me permettant d’afficher un article s’il est seul dans une rubrique. En fait je n’ai pas franchement eu de mal à trouver car beaucoup de personnes (que je remercie au passage) proposent des solutions. le problème, personne ne dit ou il faut insérer tout ces jolis codes !
      La votre m’a l’air toute simple à mettre en oeuvre toutefois pouvez-vous m’éclairer sur la partie suivante :

      l’appel se fait via :

      <INCLURE(page.php3){fond=redirection_1_seul_article}{id_rubrique}>

      Ou dois-je inclure ce code ? J’imagine dans le fichier rubrique.html mais ou exactement ?
      Par ailleurs je précise que j’utilise un squelette beespip.
      Merci pour votre aide

    • Bonjour à tous,
      La question est peut être stupide mais est-il possible de faire la même chose avec Spip 1.9 ?
      je suppose que oui...
      Si quelqu’un peut me suggérer une piste de recherche, ça serait sympa car je suis coincé à présent.
      Merci d’avance pour toute aide ou suggestion,
      bien cordialement,

    • Oui.

      Voir squelette soyezcreateur sur la zone.

    • merci beaucoup

    • Christian alias le Jon

      Bonjour,
      Je viens de terminer mon site en local et tout est impeccable, sauf que... je voudrais un affichage direct de l’article si la rubrique n’en a qu’un.
      Je suis en spip 1.9.2, et je dois vous avouer que je ne m’en sors pas avec les informations laconiques données par Jacques PYRAT (« Voir squelette soyezcreateur sur la zone »).
      S’il se trouve un bon samaritain pour fournir quelques renseignements complémentaires, je suis preneur. En vous remerciant d’avance.

    Répondre à ce message

  • 4

    Une autre solution peut être moins élégante mais très économique : si la rubrique contient un seul article, on redige directement sur l’article (cela permet d’éviter de surcharger le squelette rubrique).

    Attention comme on utilise header(« location : ») ne laisser aucun espace blanc avant l’inclusion de ce code

    <BOUCLE_rubrique_principale(RUBRIQUES) {id_rubrique}><BOUCLE_nb_article(ARTICLES){id_rubrique}><?php $k="#URL_ARTICLE"; ?></BOUCLE_nb_article><?php if ('#TOTAL_BOUCLE'==1) header("location:$k");?></B_nb_article>
    .... votre squelette rubrique ici...
    </BOUCLE_rubrique_principale>
    • Merci pour ce tip bien pratique et bien moins lourd en ressources/requetes.

    • J’ai essayé d’utiliser votre boucle comme ceci (elle englobe tout le code de ma page rubrique.html) :
      <code>
      <BOUCLE_rubrique_principale(RUBRIQUES) id_rubrique><BOUCLE_1_article(ARTICLES)id_rubrique>
      < ?php $k=”#URL-ARTICLE” ; ?></BOUCLE_1_article>< ?php if (’#TOTAL_BOUCLE’==1) header("location :$k") ; ?></B_1_article>

      Code de ma page rubrique.html

      </BOUCLE_rubrique_principale>
      </code>
      Mais je n’obtiens l’ouverture de mon article unique directement dans la page article ?
      Pouvez-vous m’expliquez pourquoi

    • cyrillle

      je ne sais pas si tu as trouvé depuis le temps ?
      sinon tite astuce : tu repers ta boucle de début (quand dans ton code tu vois apparaître boucle) la tu copies juste au dessus le début puis ensuite tu reperds ou c’est marqué la dernière boucle dans ton code html et juste après tu copies la fin (ce qui y a après le squellette).

      voila j’espère avoir été assez clair sinon cyrillle@hotmail.com

      salut salut

      dèz pour les fautes

    • bonjour,

      Un grand merci pour ce code, Cela fonctionne impeccable. Un seul petit probléme : je perds l’affichage des bréves dans les rubriques. Aurais-tu une solution ?

      ( le site Spip http://clichy.lasourisverte.net/ sera en ligne la semaine prochaine )

      eldé

    Répondre à ce message

  • 2

    C’est super nickel et bien pratique pour économiser des clics inutiles !
    Pour moi, le remplacement ne fonctionne pas pour le #URL_RUBRIQUE, filtre d’un logo.
    Une solution ? Merci

    • Je n’utilise jamais cette notation. De mémoire, elle est sensée faire un lien sur le logo ?

      Si oui, alors tu peux faire :

      <a href="#URL_RUBRIQUE"><img src="#LOGO_RUBRIQUE_NORMAL" alt="" /></a>

      Et si ça ne marche pas, c’est peut être qu’il faut explicitement référencer la boucle de la rubrique pour le logo.

    • Cette notation est la plus simple pour tout ce qu’il y a à appliquer sur un logo.

      Et reprendre la notation de base n’est pas vraiment intéressant, et carrément impossible si on veut utiliser les filtres sur les images.

    Répondre à ce message

  • 1

    Bravo pour cette boucle.

    Je l’utilise de maniére détournée pour m’affranchir des pages rubriques qui dans l’organisation de mon site ne m’intéresse pas.

    je n’utilise en gros que la boucle articles_unseul. Le problème est que pour une seule rubrique (en fait pour la rubrique qui me servira de blog) je voudrais tout de même tomber sur la page rubrique.

    Je ne sais pas comment faire.

    Je pense qu’il faut que j’exclu d’abord cette rubrique de la boucle article_un seul pour la faire prendre en compte (et exclusivement elle) par une boucle qui m’enverrai vers la page de rubrique. Je ne sais pas comment faire cela (notamment si on peut exclure des éléments de la boucle. Une suggestion, idée, lien ??

    Merci d’avance.

    • j’ai trouver un solution avec la synthaxe suivante

      <BOUCLE_articles_unseul(ARTICLES) {id_rubrique} {id_rubrique != 2} {par date}{inverse}{0,1}>

      Ca me permet d’exclure la rubrique 2 du résultat. Pour la réintégrerensuite avec lien vers la page rubrique j’ai écrit le lien en dur en dehors de la boucle.

      Tout ça ne doit pas être trés propre mais ca marche, si vous avez une meilleure manière, je suis intéressé.

    Répondre à ce message

  • 1

    j’ai crée une variante de cette contrib, elle permet de choisir concrétement un article par défaut dans l’arborescence de la rubrique dans laquelle on est.

    c’est assez long a explique donc si vous voulez choisir votre article, quand vous en avez plusieurs dans la rubrique et pas “simplement” mettre l’article quand il est seul... alors rendez vous http://www.spip-contrib.net/Rubriques-remplacees-par-les
    bon la contrib n’est pas encore validée mais si vous avez un compte spip-contrib c’est l’article 2100 :)
    http://www.spip-contrib.net/ecrire/?exec=articles&id_article=2100

    • mathsol

      Bonjour, votre contrib proposant d’afficher un article précis parmis d’autres m’interresse beaucoup mais où puis je la trouver ?
      merci d’avance

    Répondre à ce message

  • 1

    salut

    bicarfoule : petites erreurs de frappe dans le 2e pavé (“Mise à jour pour la 1.8”, crochets et quotes des “titles”) :

    <a href="[(#URL_ARTICLE)]"
    [title=(#_SsRubriques:DESCRIPTIF|supprimer_tags|attribut_html)]">

    devient :

    <a href="[(#URL_ARTICLE)]"  title="[(#_SsRubriques:DESCRIPTIF|supprimer_tags|attribut_html)]">

    hmm ?

    • ahem.
      correctif au correctif.

      <a href="[(#URL_ARTICLE)]"
      [title=(#_SsRubriques:DESCRIPTIF|supprimer_tags|attribut_html)]">

      Devient :

      <a href="[(#URL_ARTICLE)]"
      [title="(#_sous_rubriques:DESCRIPTIF|supprimer_tags|attribut_html)"]>

      sorry

    Répondre à ce message

  • Bonjour
    Mon squelette utilise ce code pour ne pas afficher directement les articles dnas les rubriques qui n’en proposent q’un.
    Mais nous utilisons aussi des mots clés pour exclure des articles de l’affichage (par exemple, des vignettes, etc). Les articles munis de ces mots clés sont appelés puis exclus grace au parametre « doublons »
    Malheureusement, le systeme de comptage des articles (« plus d un article ») ne permet pas d exclure ces articles. J’ai donc des rubriques a plusieurs articels... mais un seul affiche. je n’arrive pas a modifier le code pour gérer cela. Any help ?
    merci a tous
    Agnes

    Répondre à ce message

  • Bonjour,

    Votre super programme est proposé par Sylvain sur son site de gestion du squelette Sarka-spip, squelette que j’utilise pour le site internet de mon association.

    Je ne sais pas programmer et prend donc uniquement des éléments « standards », sans rien modifier (j’ai pris votre programme ainsi qu’un programme permettant d’afficher le menu différemment).

    Or apparemment les forums (réponses aux articles réalisées par les internautes) ne s’affichent plus sur des articles solitaires. Je peux bien accéder à la réponse à partir de l’hyperlien mis à disposition dans le mail qui m’est envoyé automatiquement par le système lorsque quelqu’un répond à un article. Mais cette réponse n’apparaît pas quand on accède au site de manière normale, par le menu.

    Sauriez-vous pourquoi, quelqu’un a-t-il déjà rencontré ce problème ?

    Merci de votre aide.

    Corinne

    Répondre à ce message

  • 4
    stéphane

    J’aimerai bien intégrer cette astuce sympathique avec le menu déroulant et contextuel de Nicolas (voir ici)...

    Est-ce possible ? et si oui comment ?

    merci.

    • spip sicg

      nous nous intéressons aussi à ce problème et nous souhaiterions également obtenir des informations à ce sujet (intégration de cette boucle dans le menu déroulant de NICO)
      merci de bien vouloir répondre à cette question, ça serait sympa.

    • voici le code modifier pour le menu de NICO, il faut recherche le premier #URL_RUBRIQUE dans menu.html, supprimer la ligne et la remplace par le code suivant :

      <BOUCLE_articles_plusdun(ARTICLES) {id_rubrique} {1,1}>
      <a href="#URL_RUBRIQUE" class="secteur<?php echo (#ID_RUBRIQUE == $actuelle ? '' : (in_array(#ID_RUBRIQUE, $hierarchie) ? 'on' : 'off')); ?>" >[(#TITRE|supprimer_numero)]</a>
      </BOUCLE_articles_plusdun>
      
      <BOUCLE_articles_unseul(ARTICLES) {id_rubrique} {0,1}>
      <a href="#URL_ARTICLE" class="secteur<?php echo (#ID_RUBRIQUE == $actuelle ? '' : (in_array(#ID_RUBRIQUE, $hierarchie) ? 'on' : 'off')); ?>" >[(#TITRE|supprimer_numero)]</a>
      </BOUCLE_articles_unseul>
      
      <a href="#URL_RUBRIQUE" class="secteur<?php echo (#ID_RUBRIQUE == $actuelle ? '' : (in_array(#ID_RUBRIQUE, $hierarchie) ? 'on' : 'off')); ?>" >[(#TITRE|supprimer_numero)]</a>
      <//B_articles_unseul>
      <//B_articles_plusdun>

      puis rechercher le second #URL_RUBRIQUE, supprimer la ligne et la remplace par le code suivant :

      <BOUCLE_articles_unseul_sr(ARTICLES) {id_rubrique} {0,1}>
      <a href="#URL_ARTICLE" class="rubrique<?php echo (#ID_RUBRIQUE == $actuelle ? '' : (in_array(#ID_RUBRIQUE, $hierarchie) ? 'on' : 'off')); ?>" >[(#TITRE|supprimer_numero)]</a>
      </BOUCLE_articles_unseul_sr>
      
      <a href="#URL_RUBRIQUE" class="rubrique<?php echo (#ID_RUBRIQUE == $actuelle ? '' : (in_array(#ID_RUBRIQUE, $hierarchie) ? 'on' : 'off')); ?>" >[(#TITRE|supprimer_numero)]</a>
      <//B_articles_unseul_sr>
    • Stéphane

      merci Seb

    • damien lecouturier

      Un immense merci pour cette contrib absolument fabuleuse !

    Répondre à ce message

  • 1

    Peux-tu me dire ou je dois mettre la boucle decrite ?
    Merci

    • Personnelement, j’ai mis cette boucle dans un menu (en l’occurence à gauche dans la page).

      Sur le site, il y a en plus un javascript pour avoir un effet de menu déroulant (voir site)

    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