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.

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 est l’expression 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.

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 :

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

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.

Discussion

7 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 ?

    Répondre à ce message

  • Version 0.5 : ll est possible de spécifier plusieurs valeurs testées par un même #CASE. La doc est mise à jour.

    Répondre à ce message

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

    Répondre à ce 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}>]

    Répondre à ce message

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

    Répondre à ce 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.

    Répondre à ce message

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

    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 :

  • 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
  • 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 apparaît.

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.

Qui êtes-vous ?
[Se connecter]

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Ajouter un document

Suivre les commentaires : RSS 2.0 | Atom