Les traitements conditionnels avec SPIP

samedi 8 septembre 2007

SPIP / balise / filtres

Plusieurs moyens sont à votre disposition pour effectuer des traitements conditionnels dans SPIP. Cet article tente de les recenser. Il en manque peut être alors n’hésitez pas à commenter cet article pour signaler des oublis ou pour poster des exemples d’utilisation.

Parties optionnelles des boucles

La syntaxe complète des boucles permet d’afficher du code optionnel avant et après la boucle ainsi que du code alternatif si la boucle ne renvoie aucun résultat.

<Bn>
* Code HTML optionnel avant
<BOUCLEn(TYPE){critère1}{critère2}...{critèrex}>
* Code HTML + balises SPIP
</BOUCLEn>
* Code HTML optionnel après
</Bn>
* Code HTML alternatif
<//Bn>

Parties optionnelles des balises

La syntaxe des balises permet d’afficher du code avant et après une balise si celle-ci existe dans la page en cours grâce à la notation à crochets.

[ texte optionnel avant (#BALISE) texte optionnel après ]

Dans l’exemple suivant, on affiche l’ouverture et la fermeture de la div que si la balise #TEXTE renvoie quelque chose :

[<div class="texte">(#TEXTE)</div>]

Cette solution est limitée par le fait qu’on ne peut pas mettre de boucles dans le code optionnel d’une balise. Il faut alors utiliser un <INCLURE{...}> pour afficher une boucle en fonction d’une balise.

En fait, il est possible de ruser comme indiqué dans cette discussion sur la liste spip.user. L’astuce repose sur l’utilisation du filtre "si oui" et des parties optionnelles des boucles. Il faut procéder comme ceci :

<BOUCLE_feinte(ARTICLES){0,1}>[(#LETEST|?{' '})]</BOUCLE_feinte>
Ici le code la boucle si oui
</B_feinte>
Ici le code la boucle si non
<//B_feinte>

Les filtres de test

Le filtre |sinon permet d’indiquer ce qu’il faut afficher si l’élément « filtré » est vide (lire "les filtres de test" sur spip.net).

[(#TEXTE|sinon{"pas de texte"})]

Le filtre |?{sioui,sinon} est une version évoluée de |sinon. Il prend un ou deux paramètres :

- sioui est la valeur à afficher à la place de l’élément filtré si celui-ci est non vide.
- sinon est optionnel. C’est la valeur à afficher si l’élément filtré est vide. [(#TEXTE|?{#TEXTE,"pas de texte"})] est équivalent à l’exemple donné pour le filtre |sinon.

Étant donné que sinon est optionnel, on peut utiliser une variante simplifiée qui permet d’écrire un filtre "si oui" comme ceci :

[<a href="#" class="spip_in contact"><:envoyer_message:></a>(#EMAIL|?{' '})]

Si la balise #EMAIL renvoie quelque chose on affiche le lien suivi d’un espace. Le but de ce code est de conditionner l’affichage du lien par rapport à l’existence d’une adresse mail.

Pour pouvoir faire des tests plus évolués, SPIP 1.8 a introduit un jeu de filtres pour faire des comparaisons avec des valeurs :

  • |==valeur et | !=valeur permettent de vérifier, respectivement, l’égalité ou l’inégalité entre l’élément filtré et valeur. Par exemple :
<li [(#TITRE|=={édito}|?{'id="edito"',''})]>#TITRE</li>
  • |>valeur, |>=valeur, |<valeur et |<=valeur comparent l’élément filtré (qui doit être numérique) avec une valeur numérique. Par exemple :
[(#TOTAL_BOUCLE) [(#TOTAL_BOUCLE|>{1}|?{'articles','article'})] dans cette rubrique.]

Remarque : De manière générale, tous les opérateurs de comparaison de php peuvent être utilisés comme filtres depuis SPIP 1.8.

Utilisation avancée des filtres de test

À lire à ce sujet un très bon article de Vincent Robert. Les exemples de cet article permettent de comprendre des enchaînements de tests comme ceux présents dans le squelette SpipClear :

[(#RECHERCHE|?{'',' '})
                [(#ENV{id_article}|?{'',' '})
                <INCLURE{fond=list}{id_rubrique}{archives}{debut_liste}{home}{self}>
                ]
]
[(#RECHERCHE|?{' ',''})
<INCLURE{fond=search}{id_secteur}{recherche}{debut_liste}>]
[(#ENV{id_article}|?{' ',''})<INCLURE{fond=post}{id_article}>]

Traduction :

Si la balise #RECHERCHE renvoie quelque chose, ignorer le code suivant et ne rien faire.

Sinon

  • Si la variable id_article vaut quelque chose, ne rien faire. Sinon inclure le fichier list.html

Puis Si la balise #RECHERCHE renvoie quelque chose, inclure le fichier search.html. Sinon ne rien faire.

Et pour finir, Si la variable id_article vaut quelque chose, inclure le fichier post.html. Sinon ne rien faire.

Vos commentaires

  • th

    Pour info un cas concret sur le spipforum :
    http://forum.spip.org/fr_193993.html

    (J’avais mis ça de côté il y a un moment mais ton article est beaucoup plus complet, reste plus qu’à utiliser maintenant...)

    th

    13 septembre 2007, 11:52

  • ?

    Merci, c’est un article très clair.

    11 mai 2011, 07:36

Répondre à cet article

Qui êtes-vous ?
Ajoutez votre commentaire ici
  • Ce formulaire accepte les raccourcis SPIP [->url] {{gras}} {italique} <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.