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 à
#SWITCH
permet de spécifier quelle est l’expression testée. L’expression est évaluée et sa valeur est mémorisée. - 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. - Un éventuel appel à
#CASE_DEFAULT
renvoie une valeur vraie si aucun des#CASE
n’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 par date d’activité
2 discussions
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 🤗
Répondre à ce 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#ARRAY
et 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}}
Répondre à ce message
Ajouter un commentaire
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.
Suivre les commentaires : |