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
- Un appel initial à
#SWITCHpermet de spécifier quelle est l’expression testée. L’expression est évaluée et sa valeur est mémorisée. - De multiples appels à
#CASEpermettent 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. - Un éventuel appel à
#CASE_DEFAULTrenvoie une valeur vraie si aucun des#CASEn’a été satisfait.
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 ?]Il est possible de spécifier plusieurs valeurs testées par un même #CASE :
#SWITCH{#ENV{couleur}}
[(#CASE{bleu,vert,violet,gris}) Couleur froide]
[(#CASE{jaune,rouge,orange}) Couleur chaude]
[(#CASE_DEFAULT) 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.
#CASE à valeurs multiples
Depuis la version 0.5.0 du plugin, la balise #CASE peut accepter plusieurs valeurs. Dans ce cas, son évaluation est vérifiée lorsque la valeur de #SWITCH figure dans l’une de ces valeurs.
Le <i>#GET{couleur}</i> est une couleur
[(#SWITCH{#GET{couleur})]
[(#CASE{bleu,vert,noir}) froide]
[(#CASE{rouge,orange,jaune}) chaude]Variables #GET internes
À tout moment, il est possible d’accéder
- avec #GET{_switch_} : à la valeur testée par le #SWITCH
- avec #GET{_switch_matched_} : au fait que la valeur testée a été reconnue ou non par l’un des #CASE précédents.
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 :
|
|
Utiliser les balises ou le filtre ?
C’est comme vous voulez ! Voici un exemple issu de la discussion “https://discuter.spip.net/t/174382”, pour afficher une icône selon la valeur d’un champ.
Avec les balises :
#SWITCH{#SITUATION}
[(#CASE{Adoption}) [(#CHEMIN{img/adoption_coeur.png}|image_reduire{42})]]
[(#CASE{Formulaire}) [(#CHEMIN{img/adoption_en-cours.png}|image_reduire{42})]]
[(#CASE{Soins}) [(#CHEMIN{img/soins.png}|image_reduire{42})]]
...
Et avec le filtre :
#SET{icone, #SITUATION|switchcase{
Soins,soins,
Adoption,adoption_coeur,
Formulaire,adoption_en_cours}}
[(#CHEMIN{img/#GET{icone}.png}|image_reduire{42})]
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 filtres.
En effet, on peut aussi 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 directement en tant qu’argument d’un filtre et qu’il faut préparer les valeurs avant de les utiliser, ce qui complique l’écriture. Les balises #SWITCH et #CASE peuvent alors être plus simples à utiliser et plus lisibles.

Discussions by date of activity
9 discussions
Il manque une parenthèse fermante dans le code figurant au paragraphe Filtre |switchcase :
»
devrait être
»
Bien vu !
J’ai corrigé.
Merci
Reply to this message
Bonjour et merci pour ce plugin... Y a-t-il un retour pour l’utilisation de ce plugin sous spip 4.2 ? Quelqu’un a-t-il déjà essayé en modifiant les bornes de version ?
Oui c’est compatible.
Merci pour le retour 🤗
Reply to this message
Hello,
J’ai une situation dans laquelle il faut tester une soixante de valeurs. Quelque chose comme
si argument =1, alors aller à l’url machin
si argument = 2, alors aller à l’url truc
(...)
si argument = 60, alors aller à l’url bidule
du coup, avec ce plugin
SWITCHargument
CASE1 url= machin
CASE2 url= truc
(...)
CASE60 url=bidule
Ma question : est-ce réaliste ? Trop gourmand en performance ? Une façon plus light de tester cette série de valeurs de l’argument ?
Vu que SPIP met les résultats en cache, sauf contexte d’usage particulier l’impact en terme de performance reste faible.
Autre soluce si c’est juste des
if (val1) then (val2)et rien de plus : alors tu peux mettre tous les couples case/url dans un#ARRAYet utiliser un filtre (fonction PHP définie sur mesure selon le contexte / la répartition des valeurs etc) qui s’applique sur ce tableau et en renvoie la valeur d’url à utiliser dans un #SET en fonction de l’argument. Donc genre#SET{url,#ARRAY{A,u1,B,u2,C,u3}|choisir{argument}}Reply to this message
Version 0.5 : ll est possible de spécifier plusieurs valeurs testées par un même #CASE. La doc est mise à jour.
Reply to this message
Version 0.4 un filtre
|switchcases’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épertoirejson, 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 :Reply to this message
Version 0.3.0, marquée stable : la balise
#DEFAULTest renommée#CASE_DEFAULTpar anticipation visionnaire des potentiels et hypothétiques conflits de nommage pouvant survenir dans un futur qu’il est impossible de tout à fait exclure.Reply to this message
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
#DEFAULTpour 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 :
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.
Follow the comments:
|
