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 humain e s ;
- 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.
Discussions par date d’activité
12 discussions
Bonjour,
Merci pour ces magnifiques améliorations apportées années après années...
Est-il possible de créer une condition qui boucle sur les réponses des autres utilisateurs pour verrouiller une case à cocher ?
Répondre à ce message
Salut, encore et toujours merci pour la doc.
Dans le cas d’une liste d’évènement, je souhaite poser une condition selon le nom de l’évènement pour afficher un autre champs. J’ai vu que c’était l’identifiant de l’évènement qui était considéré comme la valeur de la clé, est-ce qu’on peut lui demander de lire la valeur lisible par les humain·es ?
La doc est complète, donc nom ce n’est pas possible actuellement. Et clairement cela ne fait pas partie de mes priorités de codage.
Répondre à ce message
Bonjour,
On utilise
>=
pour conditionner l’affichage d’un champ comme ceci@input_2@>=400
. J’ai l’impression que la comparaison concerne une chaîne de caractère mais pas des nombres. Car"9" > "65220"
On aimerait comparer des nombres. Peut-être que j’ai manqué quelque chose dans la documentation ?
Merci
Tu utilise quelle version de saisies ? il me smeble que c’est un bug qu’on a corrigé récemment...
désolé, la version était 3.56.4. Cela marche en mettant à jour vers 3.56.6.
Merci Maïeul
Répondre à ce message
Bonjour,
Est’il possible de faire un test avec une variable d’environnement, de l’objet parent, passé au formulaire ?
Bonjour,
pour l’instant non : tout les tests existant sont décrits ici.
Répondre à ce message
Bonjour,
Dans l’onglet « Conditions » est-il possible de tester si l’article en cours est taggé avec un mot-clé ?
Par exemple, affiche le champ si :
#ID_MOT==« 19 »
Merci d’avance,
Bonjour,
non ce n’est pas possible. Cela me parait complexe du reste car pour autant que je vois, l’id_article n’est pas passé au contexte d’appel du formulaire.
Pour information, cette page recense vraiment TOUT les tests possibles, je la complète au fur et à mesure.
Répondre à ce message
Bonjour, j’utilise SPIP 3.2.7 avec le plugin formidable et je n’arrive pas à conditionner l’affichage de certains champs du formulaire suivant le choix d’une liste j’ai ceci : @selection_1@== « choix175 » et il y a aucun effet.
Répondre à ce message
Bonjour,
Actuellement j’utilise SPIP 4.1.5 avec Formidable 5.2.2 (acteur 5.0.4, Saisie pour formulaire 4.4.1) et je cherche à utiliser les formulaires pour s’inscrire à des événements par contre il faudrait qu’une partie du formulaire ne soit pas visible si la date du jour est supérieure à la date limite d’inscription (qui est inscrit dans le formulaire pour faire simple).
Est ce possible ? Comment pourrais je solutionner ce point ?
Merci
Bonne journée
Jeff
Agenda ne propose pas de notion de date limite d’inscription.
Pour un besoin associatif, j’ai codé un bout de code qui gère cela, avec les contraintes que tu mentionne.
Je pourrais peut être courant septembre l’extraire et en faire un plugin dédié.
Répondre à ce message
Bonjour,
J’aimerai mettre une condition de saisie dans « spip formulaire » sur une question du style :
1) Avez-vous rendu votre dossier ? bouton radio « oui » et « non »
et mettre la condition :
si « oui » a été sélectionné le champ texte de saisie apparait
Merci de me guider pour l’ajout de la condition
Merci d’avance pour vos réponses
Cdt JK
Si votre saisie conditionnante s’appelle
radio_1
et que les choix possible sont :alors dans la saisie conditionné, mettre dans le champ d’affichage conditionnelle :
@radio_1@=='oui'
Merci Maïeul pour ta réponse, mais je viens de saisir la condition dans l’affichage du « champ texte » et cela ne fonctionne pas. Faut-il cocher ou ajouter quelque chose pour l’activer et ainsi pouvoir saisir ? (ci-joint la capture d’écran)
Heu ca devrait marcher. Tu peux m’envoyer un export .yaml de ton formulaire ?
le format .yaml n’est pas accepté pour te joindre l’export , peux-tu me donner ton mail ?
monprenomsanstrema@monprenomsanstrema.net
j’ai envoyé l’export du formulaire sut ton mail, l’as tu reçu ?
Bonjour,
J’ai également essayé cette manip qui ne fonctionne pas non plus, koellsch as-tu trouvé la solution ?
Merci
Bonjour,
Je rencontre le même problème.
J’ai essayé avec et sans les espaces, mais pas d’affichage qui fonctionne...
Quelqu’un aurait-il une solution ?
Merci d’avance,
Chloé
Les tests portent sur les clés (qui sont plus stable que les labels humains), c’est à dire sur ce qu’il y avant le
|
dans la liste des choix.Donc ici
@radio_1@ == "choix1"
Cela fonctionne, merci c’est parfait, je n’avais pas compris cela des autres réponses données sur cette page !
Répondre à ce message
Bonjour,
Il me semble que j’avais échangé avec l’un d’entre vous à ce propos et que j’avais du corrigé le problème « à la main ». Du coup, mes modifications ont du se retrouver écrasées lors d’une MAJ. Bref, comme je ne me rappelle plus de rien, je pose le problème ici.
Sur les articles d’un site, j’ai un champ EXTRA non obligatoire de type DATE et restreint sur une branche, avec un affichage conditionnel qui marche bien (@mon_champ@ IN « valeur »). Mais lorsque le champ est masqué (càd que ’mon_champ’ n’a pas la valeur ’valeur’), j’ai une erreur au moment d’enregistrer l’article si ce champ est masqué. L’erreur indique :
Une erreur technique a empêché l’enregistrement correct du champ 'mon_champ'.
Est-ce qu’il est possible de déclarer une issue quelque part ou c’est ici le meilleur endroit pour soumettre mon problème ? Il me semble qu’on ne peu pas sur git.spip.net.
Merci d’avance pour les éléments que vous pourrez m’apporter.
C’est un problème au niveau de spip, qui a été corrigé dans les versions de dev (3.2 et 3.3).
Tu peux appliquer le contenu de ce commit, ca ne devrait plus être perdu à la prochaine mise à jour de spip https://git.spip.net/spip/spip/commit/ee5c984330c456fedc837fa8f060745ec9499ef5
Et si tu peux déclarer sur git.spip.net, mais il faut avoir un compte, à demander sur la liste spip-dev
Super ! Merci pour cette réponse rapide et efficace. Je verrai demain pour appliquer le correctif et je demanderai un accès au git pour, au moins, déclarer des issues lorsque c’est nécessaire.
Répondre à ce message
Bonjour,
Est-il possible de comparer des dates avec afficher_si ?
Typiquement ce serait pour afficher des champs supplémentaires si une date de naissance est inférieure à une date donnée.
- > ajouter des infos si une personne est mineure. moins de 18 ans
Merci !
NON, pas prévue pour l’instant
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 : |