Affichage conditionnel des saisies : syntaxe des tests

Les saisies peuvent recevoir une option afficher_si qui permet de conditionner leur affichage en fonction de la valeur d’une ou plusieurs autres saisies.

Ceci peut être utile par exemple pour faire varier les questions en fonction de la réponse à des questions précédentes.

Cet article décrit la syntaxe utilisable dans les conditions. Pour la manière de gérer ces saisies conditionnelles, voir l’article : « Génération de saisies conditionnelles avec afficher_si ».

Il correspond à l’état des tests possibles avec :
-  la version 3.55.0 du plugin Saisies pour SPIP < 4.0 ;
-  la version 4.2.0 du plugin pour SPIP ≥ 4.0.

Rappel : moment des tests

Le test des valeurs se fait selon deux modes différents :

  • côté navigateur, en JavaScript ;
  • côté serveur, en PHP.

Cette double validation est nécessaire non seulement en termes d’accessibilité, mais aussi pour éviter d’avoir des messages d’erreur sur des champs obligatoires, mais dont l’affichage est conditionné par la valeur d’un autre champ, et donc qui ne sont pas tout le temps obligatoires.

C’est pourquoi les possibilités de tests sont limitées, mais suffisamment souples pour couvrir un large usage.

Dans la suite du présent article, tout ce qui est entre < et > doit être remplacé par une valeur réelle.

Syntaxe de base

Un test simple se décompose ainsi :

  • ! opérateur facultatif de négation, inverse la suite du test ;
  • @<nom du champ>@ obligatoire ;
  • :TOTAL (facultatif) immédiatement après le second arobase, pour compter le nombre de valeur d’un champ (voir plus bas), depuis la version 3.30.0 du plugin Saisies ;
  • opérateur parmi :
    • == test d’égalité avec <valeur> ;
    • != test d’inégalité avec <valeur> ;
    • « > » test de supériorité avec <valeur> :
    • « >= » test de supériorité ou d’égalité avec <valeur> ;
    • « <" test d’infériorité avec <valeur> ;
    •  »<=" test d’infériorité ou d’égalité avec <valeur> ;
    • « MATCH » pour vérifier qu’une chaîne valide une expression régulière, depuis la version 3.41.0 du plugin Saisies, cf. la section détaillée ;
    • «  !MATCH » pour vérifier qu’une chaîne ne valide pas une expression régulière, depuis la version 3.41.0 du plugin Saisies, cf. la section détaillée ;
    • IN vérifie l’appartenance à un ensemble de valeurs, cf. la section détaillée ;
    • !IN vérifie la non appartenance à un ensemble de valeurs, cf. la section détaillée ;
  • "<valeur>" ou '<valeur>' ou <valeur_numerique_entiere> la valeur à tester :
    • pour les champs de type clé/valeur (bouton radio, liste déroulante, etc.), il s’agit de la valeur de la clé et non pas de la valeur lisible par les humaines ;
    • la présence de guillemet est obligatoire, sauf si vous voulez tester une valeur numérique entière.

Exemples

@champ_1@ == "oui"

vérifie que le champ_1 est égal à « oui ».

@champ_1@ != "oui"

vérifie que le champ_1 est différent de « oui ».

Tests sur les expressions régulières

La syntaxe @<champ>@ MATCH '/<regexp>/<modificateur facultatif>' permet de vérifier que le champ <champ> suit une expression régulière.

Il faut être faire attention aux contraintes suivantes :

  • l’expression régulière doit être systématiquement entre / ;
  • l’expression régulière et ses modificateurs doivent être valides à la fois :

On pourrait utiliser un site comme https://regex101.com/ pour tester les expressions régulières.

À l’inverse la syntaxe @<champ>@ !MATCH '/<regexp>/<modificateur facultatif>' permet de vérifier que le champ <champ> ne suit pas une expression régulière.

Exemples

@input_1@ MATCH '/@domaine.ext$/'

vérifie que la valeur du champ input_1 finit par @domaine.ext.

@input_1@ !MATCH '/@domaine.ext$/'

vérifie que la valeur du champ input_1 ne finit pas par @domaine.ext.

L’opérateur IN

L’opérateur IN prend un sens différent selon que la saisie testée prend une valeur unique (par exemple pour les boutons radios) ou une valeur multiple (par exemple pour les cases à cocher).

IN pour les champs à valeur unique

Pour les champs à valeur unique, IN permet de s’assurer que le champ a une valeur appartenant à une liste de valeurs à tester, séparés par une virgule.

Exemple

@radio_1@ IN "choix1,choix2,choix3"

Vérifie que radio_1 vaut choix1 ou choix2 ou choix3.

L’opérateur inverse !IN permet de s’assurer que le champ ne vaut aucune de ces valeurs.

@radio_1@ !IN "choix1,choix2,choix3"
 

Vérifie que radio_1 vaut ni choix1 ni choix2 ni choix3.

IN pour les champs à valeur multiple

Les cases à cocher multiples et les sélections multiples renvoient des tableaux, et non pas de simples chaînes. Comment tester qu’une valeur est cochée ? En utilisant l’opérateur IN. <valeur> doit contenir la liste des valeurs à tester, séparées par des virgules.

Exemple

@checkbox_1@ IN "a,b"

Vérifie que la clé a ou la clé b est cochée pour le champ chechbox_1.

Attention : pour que la condition soit vérifiée, il faut et il suffit qu’une seule ou plusieurs des valeurs cochées, mais pas nécessairement toutes, figure(nt) dans la liste des valeurs à droites du IN.

L’opérateur inverse !IN vérifie qu’aucune des valeurs de <valeur> n’est cochée.

Exemple

@checkbox_1@ !IN "a,b"

Vérifie que NI la clé a NI la clé b ne sont cochées dans le champ @checkbox_1@.

Test sur le nombre de cases cochées / de fichiers envoyés

Depuis la version 3.30.0 du plugin il est possible de tester :
-  le nombre de cases cochées pour une saisie checkbox
-  le nombre de fichiers envoyées pour une saisies fichiers de CVT-Upload.

Pour ce faire, la syntaxe est la même.

@<champ>@:TOTAL <operateur> <valeur>

Exemples

Pour vérifier que deux cases au moins sont cochées :

@checkbox@:TOTAL > 1

Avec cvt_upload, pour vérifier si l’on a plus de 2 fichiers envoyés :

@fichiers_1@:TOTAL > 2

Test simplifié

Pour les champs de type « case à cocher » unique, où il importe essentiellement de vérifier si la case est cochée, il est possible de faire un simple test : @<champ>@, sans <opérateur> ni "<valeur>". Un ! peut être mis avant @<champ>@.

Mieux vaut cependant être explicite et tester @<champ>@ == "on" ou @<champ>@ != "on".

Tests combinés

Il est possible de combiner les tests de plusieurs champs en utilisant les opérateurs booléens communs à PHP et à JavaScript, à savoir :
-  || pour OU ;
-  && pour ET ;
-  ! pour NON ;
-  ainsi que () pour regrouper des tests.

Exemples

@champ_1@ == "oui" || @champ_2@ == "oui"

Affiche la saisie si champ_1 est égal à oui ou bien si champ_2 est égal à oui, ou si les deux sont égaux à oui.

@champ_1@ == "oui" && @champ_2@ == "oui"

Affiche la saisie si champ_1 est égal à oui ET si champ_2 est égal à oui.

(@champ_1@ == "oui" || @champ_2@ == "oui") && ! (@champ_1@ == "oui" && @champ_2@ == "oui")

Affiche la saisie si champ_1 est égal à oui OU si champ_2 est égal à oui, mais pas si les deux sont égaux à oui en même temps.

Tester la présence de plugin

La syntaxe @plugin:<préfix>@ permet de tester que le plugin de préfixe <préfix> est activé. Réciproquement, !@plugin:<préfix>@ permet de vérifier que ce plugin n’est pas activé.

Exemple

@plugin:article_pdf@

N’affiche la saisie que si le plugin article_pdf est activé.

Tester la valeur d’une configuration

La syntaxe @config:<champ>:<sous_champ>@ ou @config:<champ>/<sous_champ>@ permet de tester la valeur de la configuration <champ>/<sous_champ> avec lire_config() (équivalent PHP de #CONFIG).

Exemple

Pour tester si le nom du site est égal à « Mon site SPIP » :

@config:nom_site@ == "Mon site SPIP"

La profondeur des sous-champs est illimitée [1].

Résumé

Sont gérés avec afficher_si :

  • les tests de valeur de champ @<champ>@ et "<valeur>" / '<valeur>' ;
  • le nombre de valeurs retenues dans une saisie à plusieurs valeurs : @<saisie>@:TOTAL ;
  • les tests de présence de plugin @plugin:<plugin>@ ;
  • les tests de valeur de configuration @config:<config>@ ;
  • les égalités et inégalités : == et != ;
  • les expressions régulières MATCH et !MATCH ;
  • la présence ou l’absence d’une valeur pour un champ à valeurs multiples : IN et !IN ;
  • la combinaison de tests : !, &&, ||, ().

Tout le reste n’est pas géré :

  • côté PHP, tout test qui contient autre chose sera purement et simplement ignoré ;
  • côté JS, cela risque de planter.

Notes

[1Depuis la version 3.11.0 du plugin saisies.

Discussion

12 discussions

  • 1

    Bonjour, J’utilise un formulaire.html dans le quel j’ai plusieurs champs saisies. Certains ne doivent s’afficher que si un autre champ à une certaine valeur. Or je n’ai jamais réussi à le faire fonctionner. Pouvez-vous m’aider ?

    [(#SAISIE{selection, type_cas,
    	cacher_option_intro=oui,
    	obligatoire=oui,
    	size=1, 
    	label=<:covid:label_cas:>,
    	datas=#ENV{cas_covid}})]
    
    [(#SAISIE{selection, symptomes,
    	cacher_option_intro=oui,
    	obligatoire=oui,
    	afficher_si='@type_cas@=="cas_nul"',
    	size=1, 
    	label=<:covid:label_symp:>,
    	datas=#ENV{cas_symptomes}})]

    Le champ selection « symptomes » ne doit s’afficher que si le type de cas est « cas_nul », or il s’affiche tout le temps. Pouvez-vous m’aider ?

    Répondre à ce message

  • 12

    Bonjour

    Une collègue a fait un formulaire dans cet article. Le but est d’envoyer un mail à un système de ticketting pour la création automatique d’un ticket.

    On voudrait savoir s’il est possible de mettre une condition du type « le mail est envoyé seulement si l’adresse finit par @ac-lyon.fr ».
    Et si ce n’est pas le cas, envoyer un mail au demandeur pour lui indiquer que le ticket n’est pas créé.

    Possible ou pas ?

    • Bonjour,

      oui c’est possible mais pas de la manière dont vous pensez.

      1. Il n’est pas possible de conditionner un traitement à une valeur d’un camp ou quoi.
      2. Ce qui est prévu ici, c’est l’affichage ou non d’un champ.

      Par contre vous pouvez configurer un champ au niveau de sa vérification, pour vérifier une regepx.

      Et si la condition est pas rempli, le formulaire enverra une erreur.

    • Ah oui ok j’ai vu la validation en fonction d’une regexp.
      Reste à l’écrire ...

      Merci

    • bah a priori c’est plutot simple
      @ac-lyon\.fr$

      verifier que le mail se termine par @ac-lyon.fr (enlever le $ si on veut permettre les espaces à la fin)

      un outil pour tester les regexp en ligne https://regex101.com/

    • Ce que j’ai fait :

      • Edition formulaire
      • champ courriel -> configurer
      • onglet « validation »
      • type de vérification : Expression régulière
      • coller la regex (j’y étais presque, me manquait le « \ » )
      • valider
      • enregistrer
      • recalculer la page publique
      • remplir le champ avec une adresse bidon en .com
      • valider le formulaire

      Et pas de message d’erreur

      J’ai oublié quoi ? Ou alors je suis à côté de la plaque ?

    • il faut mettre les caractères encadrant (n’importe quel caractère qui n’est pas dans la regex). Donc par exemple #ac-lyon\.fr$#

      si après cela ca ne marche pas -> m’envoyer le .yaml

    • Pas mieux avec les #

      Je t’envoie le .yaml

    • Hello Maieul

      La semaine dernière, comme tu me l’avais proposé, je t’ai envoyé le fichier yaml de mon formulaire.
      As-tu eu le temps d’y jeter un oeil ?

    • oui, et j’ai répondu par email... le 27 mai à 10h38, en te disant que j’avais bien une erreur si je mettais autre chose que ac-lyon.fr

    • Ah, pas reçu ton mail mais pas grave.

      Alors, je ne comprends pas pourquoi le formulaire ne bronche pas chez moi.
      Un truc côté serveur qui manque ?

    • quel version de saisies/verifier/formidable ?

    • C’est bon j’ai compris : le test sur l’adresse ne se fait qu’une fois tous les champs obligatoires remplis, ce que je ne faisais pas. Désolé pour cette erreur de ma part.

      Et encore merci. Ce plugin est une vraie performance.

    • Hum, chez moi il m’indique en même temps les erreurs d’obligation et les erreus autres (sauf évidement si l’erreur autre se superpose avec l’erreur d’obligation).

      A noter que la toute dernière version du plugin verifier te permet de mettre un message d’erreur plus clair si la condition du regexp est pas remplie.

    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