Balises #SWITCH #CASE et filtre |switchcase

Ce plugin introduit dans SPIP les balises #SWITCH, #CASE et #CASE_DEFAULT, ainsi que le filtre |switchcase qui reproduisent le fonctionnement des switch... case... default... du php et du C.

Les balises #SWITCH et #CASE

Les balises #SWITCH, #CASE et #CASE_DEFAULT permettent de comparer un élément à de multiples cas valeurs, et de renvoyer une expression selon le cas satisfait.

L’utilisation se fait donc en 2 ou 3 parties

  1. Un appel initial à #SWITCH permet de spécifier quelle expression est testée. L’expression est évaluée et sa valeur est mémorisée.
  2. De multiples appels à #CASE permettent de tester la valeur mémorisée avec plusieurs valeurs candidates. En cas d’égalité, la balise #CASE renvoie une valeur non vide (un espace) et les parties conditionnelles avant et après sont affichées.
  3. Un éventuel appel à #CASE_DEFAULT, qui renvoie une valeur vraie si aucun des #CASE n’a été satisfait.

À tout moment, il est possible d’accéder à la valeur testée et mémorisée par le #SWITCH avec le GET suivant : #GET{_switch_}.

Exemple

#SWITCH{#ENV{couleur}}
[(#CASE{bleu}) Wouah, ma couleur favorite !]
[(#CASE{rouge}) Ouh, c'est chaud !]
[(#CASE{vert}) L'avenir et l'espoir.]
[(#CASE_DEFAULT) Une couleur indicible...]

On peut insérer d’autres éléments de HTML ou balises spip entre les différents appels, et appeler les #CASE dans une boucle.

#SWITCH{#ENV{id_choix}}
<BOUCLE_case(ARTICLES)>
<span  [class="(#CASE{#ID_ARTICLE}|?{choisi,pas_choisi})"]>#TITRE</span>
</BOUCLE_case>
<span [class="(#CASE_DEFAULT|?{choisi,pas_choisi})"]>Autre</span>

Exemple d’usage

Vous souhaitez ranger toute une panoplie de squelettes json (calendrier.json, lesfestivals.json, programmation.json... ) dans un sous répertoire json, mais vous souhaitez pouvoir y accéder via ajax. Or, les squelettes rangés dans un sous répertoire ne peuvent être accédés que par un webmestre. Pour ajax, vous pouvez passer par un squelette d’aiguillage à la racine, qui prend un argument “squel” et dont le code serait :

#SWITCH{#SQUEL})
[(#CASE{calendrier}) <INCLURE{json/calendrier.json,mois=#MOIS}>]
[(#CASE{lesfestivals}) <INCLURE{json/lesfestivals.json,region=#REGION}>]
[(#CASE{programmation}) <INCLURE{json/programmation.json,groupe=#GROUPE}>]

Particularités

-  Si plusieurs #SWITCH se succèdent, la valeur d’un nouveau #SWITCH remplace la valeur du précédent.
-  Les structures #SWITCH #CASE sont plates : pas d’emboîtement possible à l’intérieur d’un même squelette. Si vous voulez vraiment emboîter 2 switch, il faut le faire dans un squelette inclu.

Filtre |switchcase

SPIP bénéficie déjà du filtre |? qui renvoie une valeur ou une autre selon qu’une condition est vérifiée ou non. Le filtre |switchcase implémenté par ce plugin permet de renvoyer différentes valeurs selon que la valeur testée vaut différentes valeurs.

En argument, on énumère les valeurs testées, et la valeur de retour correspondant.
S’il reste un argument seul, c’est la valeur par défaut. On peut aussi l’indiquer avec le cas ’case_default’. Ainsi les 2 expressions suivantes sont équivalentes :

[(#TRUC|switchcase{
  banane,jaune,
  orange,orange,
  ciel,bleu,
  case_default,inconnue
}]
[(#TRUC|switchcase{
  banane,jaune,
  orange,orange,
  ciel,bleu,
  inconnue
}]

Un luxe

De même que les filtres |oui, |non ou |sinon et d’autres balises SPIP, ces balises ne sont pas absolument nécessaires car il est possible d’écrire vos squelettes autrement, sans elles, avec des balises et filtres plus élémentaires.

Mais c’est bien pratique de pouvoir les utiliser ! Et le code est plus lisible...

Selon les cas, on préfèrera utiliser les balises ou les switchase.

On peut exprimer avec les balises les exemples donnés plus haut pour le filtre :

[(#SWITCH{truc})]
[(#CASE{banane}) jaune]
[(#CASE{orange}) orange]
[(#CASE{ciel}) bleu]
[(#CASE_DEFAULT) inconnue]


Utiliser le filtre |switchcase est plus léger lorsque les valeurs sont des constantes simples. Lorsque l’expression des valeurs est complexe, il arrive que le compilateur SPIP ne les accepte pas en tant qu’argument d’un filtre. Il faut alors utiliser les balises #SWITCH et #CASE.

updated on 5 April 2020

Discussion

5 discussions

  • Version 0.4 un filtre |switchcase s’ajoute aux balises. La documentation est mise à jour.

    Reply to this message

  • La doc est complétée par un Exemple d’usage :

    Vous souhaitez ranger toute une panoplie de squelettes json (calendrier.json, lesfestivals.json, programmation.json... ) dans un sous répertoire json, mais vous souhaitez pouvoir y accéder via ajax. Or, les squelettes rangés dans un sous répertoire ne peuvent être accédés que par un webmestre. Pour ajax, vous pouvez passer par un squelette d’aiguillage à la racine, qui prend un argument “squel” et dont le code serait :

    #SWITCH{#SQUEL})
    [(#CASE{calendrier}) <INCLURE{json/calendrier.json,mois=#MOIS}>]
    [(#CASE{lesfestivals}) <INCLURE{json/lesfestivals.json,region=#REGION}>]
    [(#CASE{programmation}) <INCLURE{json/programmation.json,groupe=#GROUPE}>]

    Reply to this message

  • Nouvelle version 0.3.0, marquée stable : la balise #DEFAULT est renommée #CASE_DEFAULT par anticipation des potentiels conflits de nommage pouvant survenir dans un futur hypothétique impossible à tout à fait exclure.

    Reply to this message

  • 1

    N’est-ce pas déjà parfaitement réalisable avec les filtres de test de SPIP ?

    • Si, mais de même que de nombreux filtres ou balises ne sont pas strictement nécessaires et servent simplement à simplifier la vie, c’est plus simple, plus lisible et plus agréable à coder certains squelettes avec ces balises.

    Reply to this message

  • Mis à jour : il y a maintenant aussi la balise #DEFAULT pour clore le triptyque habituel.

    Reply to this message

Comment on this article

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