Exemple d’utilisation du filtre ? ( sinon ) de SPIP 1.8

Mon objectif était le suivant : classer une liste de site par numéro, en supprimant le numéro et en affichant soit le logo du sites soit le titre du site si le logo n’existait pas.
NDLR 2020 : cette ancienne documentation utilise l’antique syntaxe des appels de filtre, qui requière 2 pipes || pour l’appel des filtres lorsqu’ils s’appliquent sur un #LOGO. Pour un SPIP moderne, il faut remplacer tous les || par des |

J’ai commencé par m’égarer dans les méandres du php quand Mortimer m’a montré un usage très intéressant du nouveau filtre conditionnel [1] "|?{sioui,sinon}".

Principes

Le code conditionnel est le suivant :

[(#LOGO_SITE||?{'',' '}) [(#NOM_SITE|supprimer_numero)] ] [(#LOGO_SITE)]
  1. le test sur LOGO_SITE retourne une chaîne vide quand il existe, donc le code optionnel après ne sera pas affiché.
  2. la suite n’est affichée que si LOGO_SITE existe.

NdM : la documentation du filtre ? se trouve dans l’article les filtres de spip, celle concernant le code optionnel avant ou après une balise dans l’article la syntaxe des balises SPIP.

Code

Voici la boucle simple. Ici il a été choisi de la présenter sous forme de liste.

<ul>
<BOUCLE_lien(SITES){id_rubrique}{par num nom_site}>

<li><a href = "#URL_SITE" class="spip_out">

<!-- C'est ici qu'on utilise la nouvelle fonction sioui,sinon -->
[(#LOGO_SITE||?{'',' '})
[(#NOM_SITE|supprimer_numero)]
]
<!-- Maintenant on affiche le logo s'il existe -->
[(#LOGO_SITE)]</a> : #DESCRIPTIF</li>
</BOUCLE_lien>
</ul>

Petit plus

Je désirai également maitriser les paramètres de l’image, c’est à dire : indiquer sa hauteur, sa largeur et le nom du site dans les balises alt et title.

Les filtres vont ici aussi nous aider. Il suffit de remplacer [(#LOGO_SITE)] par le code suivant :

[<img src="./IMG/(#LOGO_SITE|fichier)" 
title="[(#NOM_SITE|supprimer_numero)]" 
alt="[(#NOM_SITE|supprimer_numero)]" 
width="[(#LOGO_SITE||largeur)]" 
height="[(#LOGO_SITE||hauteur)]">]

Ce qui donne sur la boucle précédente le code suivant :

<ul>
<BOUCLE_lien(SITES){id_rubrique}{par num nom_site}>

<li><a href = "#URL_SITE" class="spip_out">

<!-- C'est ici qu'on utilise la nouvelle fonction sioui,sinon -->
[(#LOGO_SITE||?{'',' '})
[(#NOM_SITE|supprimer_numero)]
]
<!-- Maintenant on affiche le logo s'il existe avec tous les paramètres tels qu'on le désire. -->
[<img src="./IMG/(#LOGO_SITE|fichier)" title="[(#NOM_SITE|supprimer_numero)]" alt="[(#NOM_SITE|supprimer_numero)]" width="[(#LOGO_SITE||largeur)]" height="[(#LOGO_SITE||hauteur)]">]

</a> : #DESCRIPTIF</li>
</BOUCLE_lien>
</ul>

Remerciements

Merci à Mortimer pour son commentaire dont cette contrib est fortement inspirée. Sa vision du filtre |?{sioui,sinon} m’ouvre des perspectives fascinantes!

Footnotes

Discussion

4 discussions

  • 1
    Madrilene

    Bonjour merci pour la contribe qui me permet de mieux comprendre la logique et le syntaxe de ce nouveau filtre {sioui,sinon }

    Juste deux questions :

    * pourquoi y a t-il deux barres pour la définition du filtre si oui si non derriere la balise #logo-document ?

    * ?{''; ' '}
    est ce que sioui dit : ne rien afficher et sinon dit afficher un espace vide ?
    Du coup y a un petit “blanc” généré devant le nom du site non ?

    Merci d’avance pour les précisions.

    • -  Le double pipe c’est l’ancienne syntaxe SPIP des appels de filtres sur des images.

      -  Oui, il y a un espace avant le nom du site quand il y a un logo. Souvent ce n’est pas gênant en html. Sinon c’est possible d’écrire directement ce qu’on veut dans la partie sinon :
      [(#LOGO_SITE?{'',#NOM_SITE|supprimer_numero})]
      (et c’est une virgule, pas un point virgule)

    Reply to this message

  • 2

    Bonjour,

    je souhaite afficher du contenu qui va varier en fonction de ce qu’il existe ou non.

    L’idée :
    si une vidéo existe, la boucle affiche la vidéo (et rien d’autre) SINON, si un contenu sonore existe, la boucle affiche le son (et rien d’autre) SINON, si un contenu de plusieurs images existe, la boucle affiche le ce contenu de plusieurs images (et rien d’autre) SINON le contenu par défaut à afficher est l’image de l’article (ou de la rubrique).
    J’ai effectué deux tentatives sans succès :

    1/

    <B_mot_cle_port><BOUCLE_mot_cle_video(ARTICLES){titre_mot=vidéo}>
    <a href="#URL_ARTICLE">1</a>
    </BOUCLE_mot_cle_video>
    <BOUCLE_mot_cle_son(ARTICLES){titre_mot=son}>
    <a href="#URL_ARTICLE">2</a>
    </BOUCLE_mot_cle_son>
    <BOUCLE_mot_cle_port(ARTICLES){titre_mot=portfolio}>
    <a href="#URL_ARTICLE">3</a>
    </BOUCLE_mot_cle_port>
    </B_mot_cle_port>IMAGE<//B_mot_cle_port>

    2/

    [(#VIDEO|sinon{#INCLURE{fond=inc-son, env, id_article}|sinon{#INCLURE{fond=inc-portfolio, env, id_article}|sinon{#INCLURE{fond=inc-imgarti, env, id_article}})]

    Pourriez vous m’aider ?

    • Il manque des éléments de contexte pour te répondre. Es tu dans le contexte d’affichage d’un article ? Autrement dit, quand tu écris “Si une vidéo existe”, c’est “sur le site” ou “associé à cet article” ?
      Dans ce dernier cas ce sont des boucles DOCUMENTS que tu devras utiliser, et leur “partie alternative” pour gérer le cas “sinon”. Relis bien la doc des boucles générales : https://www.spip.net/fr_article894.html et la partie sur le code alternatif des boucles : https://www.spip.net/fr_article898.html

      Par exemple s’il y a id_article dans l’environnement :

        <BOUCLE_vdo(DOCUMENTS){id_article}{extension=mp4}{" ; "}>
          #TITRE : #FICHIER
        <BOUCLE_vdo>
          <BOUCLE_son(DOCUMENTS){id_article}{extension=mp3}{" ; "}>
          #TITRE #FICHIER
          </BOUCLE_son>
            <BOUCLE_img(DOCUMENTS){id_article}{extension=jpg}{" ; "}>
             #TITRE #FICHIER
            </BOUCLE_img>
          <//B_son>
        <//B_vdo>

      ça ne suffit pas mais c’est la structure logique qui correspond à ta demande

    • Oui merci. Vos explications m’ont bien aidé.
      A priori ce code me donne satisfaction :

      <B_mot_cle_port><BOUCLE_mot_cle_video(ARTICLES){titre_mot=vidéo}>
      [(#INCLURE{fond=inclure/inc-choix-video, env, id_article})]
      </BOUCLE_mot_cle_video> <BOUCLE_mot_cle_son(ARTICLES){titre_mot=son}>
      [(#INCLURE{fond=inclure/inc-choix-son, env, id_article})]
      </BOUCLE_mot_cle_son> <BOUCLE_mot_cle_port(ARTICLES){titre_mot=portfolio}>
      [(#INCLURE{fond=inclure/inc-choix-portfolio, env, id_article})]
      </BOUCLE_mot_cle_port> </B_mot_cle_port>[(#INCLURE{fond=inclure/inc-choix-imgartrub, env, id_article})]<//B_mot_cle_port>

    Reply to this message

  • Reply to this message

  • 1

    Bonjour,

    Je cherche un peu la même chose.

    Mais pour LOGO RUBRIQUE. Si la rubrique a un LOGO, on l’affiche, si elle n’en a pas, on affiche une image.

    As tu une idée, car je n’ai pas réussi avec ce filtre ?

    Merci

    • Le morceau à remplacer est (#NOM_SITE donc ça doit donner quelque chose comme :

      [(#LOGO_SITE||?{'',' '})<img src="./....." width="..." height="..." title="......" alt="......">]
      [<img src="./IMG/(#LOGO_SITE|fichier)" title="[(#NOM_SITE|supprimer_numero)]" alt="[(#NOM_SITE|supprimer_numero)]" width="[(#LOGO_SITE||largeur)]" height="[(#LOGO_SITE||hauteur)]">]

      Dans alt et title tu peux mettre (#NOM_SITE si tu veux que ça indique le nom du site.

      Le premier affiche l’image s’il n’y pas de logo et uniquement s’il n’y a pas de logo. Le deuxième affiche le logo s’il existe.

    Reply to this message

Add a comment

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 / PostgreSQL
  • 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 apparait.

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.

Who are you?
[Log in]

To show your avatar with your message, register it first on gravatar.com (free et painless) and don’t forget to indicate your Email addresse here.

Enter your comment here

This form accepts SPIP shortcuts {{bold}} {italic} -*list [text->url] <quote> <code> and HTML code <q> <del> <ins>. To create paragraphs, just leave empty lines.

Add a document

Follow the comments: RSS 2.0 | Atom