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 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 #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) Encore une autre couleur ?]

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}>]

On voit que ce plugin peut efficacement remplacer le plugin composition dans les cas simples, avec l’avantage de ne pas modifier la structure des tables.

Autre exemple

Comment faire une énumération de termes du genre “bleu, orange, vert et or” ?
Une virgule sépare les termes listés, sauf le dernier pour lequel c’est la conjonction “et”.
À l’intérieur de la boucle qui liste les termes, vous pouvez insérer le code suivant :

  #SWITCH{#COMPTEUR_BOUCLE}
  [(#CASE{#TOTAL_BOUCLE|moins{1}}|oui) et ]
  [(#CASE{#TOTAL_BOUCLE}|oui)]
  [(#CASE_DEFAULT), ]

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.

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

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