Génération de saisies conditionnelles avec afficher_si

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

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

Cet article décrit dans quel cadre utiliser les options afficher_si. Pour la syntaxe de ces options, voir l’article “Affichage conditionnel de saisie : syntaxe des tests”.

Il se base sur les fonctionnalités de la v3.51.6.

Principe général

L’option afficher_si ajoutée à une saisie permet de préciser une condition sur les autres valeurs d’un formulaire indiquant si la saisie doit être affichée ou non.

Il est ainsi possible d’insérer — ou plutôt de simuler — plusieurs formulaires avec dans une même page.

Cette option est par exemple:

Exemple

Ci-dessous, un exemple de saisies conditionnelles encodé en YAML.

-
  saisie: 'oui_non'
  options:
    nom: 'choix'
    label: 'Utilisez-vous SPIP ?'
-
  saisie: 'input'
  options:
    nom: 'raison_non'
    label: 'Si non, pourquoi ?'
    afficher_si: '@choix@ == ""' 
-
  saisie: 'input'
  options:
    nom: 'raison_oui'
    label: 'Si oui, pourquoi ?'
    afficher_si: '@choix@ == "on"' 

Le nom des champs doit être encadré par le caractère @.

On se reportera à l’article “Affichage conditionnel de saisie : syntaxe des tests” pour avoir la syntaxe complète utilisable. En effet, l’expression afficher_si est transcrite par le plugin saisies à la fois en JavaScript (pour un comportement interactif en direct lors de la saisie du formulaire) ET en PHP (pour calcul lors du Traitement du CVT). Par conséquent, l’algorithme de transcriptions est loin d’être complet, et cela limite la diversité des expressions acceptables.

Application

L’option afficher_si peut être utilisée.

  • Pour l’affichage HTML des saisies, avec #GENERER_SAISIES. Dans ce cas, du JavaScript est automatiquement inséré pour modification dynamique du formulaire en fonction de la réponse apportée à certaines saisies par l’internaute. Attention:
    • Cela ne marche pas avec #SAISIE [1];
    • Le nom de la variable #ENV dans laquelle se situe les saisies doit commencer par un _ pour ne pas avoir d’échappement des guillemets. Donc #GENERER_SAISIES{#ENV{_saisies}} et non pas #GENERER_SAISIES{#ENV{saisies}}.
  • pour l’affichage HTML des réponses à un formulaire / des vues de saisies avec #VOIR_SAISIES
  • lors de la vérification en PHP des saisies avec saisies_verifier().

Réglages avancés

Effet javascript de masquage/affichage des champs

Pour masquer / afficher les champs, des effets jQuery sont utilisés.
Depuis la version 3.14.0, ces effets sont définis par les constantes :

  • _SAISIES_AFFICHER_SI_JS_SHOW pour l’affichage, défini par défaut à "show(400)"
  • _SAISIES_AFFICHER_SI_JS_HIDE pour le masquage, défini par défaut à "hide(400)"

Il est possible de modifier ces constantes dans un fichier _options.php.

Vérifier et traiter avec afficher_si

Si l’on utilise la fonction saisies_verifier() pour vérifier les saisies, alors les saisies masquées par afficher_si ne seront pas vérifiées. Quelle que soit leur valeur, cette dernière sera transformée en '' (chaine vide) et cette valeur vide sera transmise à la fonction traiter.

Si pour une raison ou une autre on a besoin de récupérer malgré tout la valeur des saisies masquées, on peut utiliser l’une des trois options suivantes, dans l’ordre de préférence.

1. Vous pouvez utiliser l’option globales ou spécifique afficher_si_avec_post, voir plus loin pour la documentation.
2. Vous pouvez récuperer l’historique de toutes les valeurs des champs qui ont été modifié dans le hit courant en utilisant la fonction saisies_liste_set_request('get') [2].
3. Uniquement si vous ne déclarez pas vois saisies via la fonction formulaires_<nomduformulaire>_saisies()>appeler, dans la fonction traiter, saisies_verifier() en lui passant false en deuxième paramètre. Dès lors, les saisies masquées seront vérifiées selon les options de vérification transmises, qu’elles soient masquées ou non, et leur valeur sera transmise à la fonction _traiter(). Ce sera donc cette dernière qui sera chargée, le cas échéant, de tenir compte ou non du caractère masqué de ces saisies.

Options supplémentaires

Ces options impactent le fonctionnement de la fonction saisies_verifier_afficher_si() appelée au début de la fonction saisies_verifier().

Option afficher_si_remplissage_uniquement

Par défaut, la condition indiquée pour afficher_si s’applique aussi pour l’affichage des résultats finaux (par exemple : pour les champs extras dans l’espace privé ou pour les formulaires finaux)

L’option (booléenne) afficher_si_remplissage_uniquement permet d’indiquer que la condition de afficher_si ne s’applique que lors de la saisie et non pour l’affichage.

Dans ce cas, les données du champ figurent toujours dans les résultats affichés, même si la condition n’est pas satisfaite. Techniquement, cela signifie que la saisie masquée est supprimée de la liste des saisies lorsqu’on vérifie un formulaire, mais pas lorsqu’on liste les saisies dans un autre contexte, en appelant directement saisies_verifier_afficher_si().

Option de saisie individuelle ou globale afficher_si_avec_post

Par défaut, lorsqu’une condition pour l’affichage d’une saisie n’est pas remplie, la valeur de cette saisie est supprimée côté PHP du tableau de requêtes (accessible via _request()). Cela permet par exemple au plugin Formidable de ne pas stocker une telle valeur.

Cependant, il est parfois nécessaire de conserver cette information dans le tableau de requête. C’est typiquement le cas pour des formulaires de configuration.
Par exemple dans le cas suivant :

  • Une saisie radio pour choisir une API.
  • Pour chaque API, un input pour saisir la clé, on n’affiche que celle de l’API sélectionnée.
  • On a choisi une API et rentré sa clé.
  • À un moment on décide de tester une autre API : on rentre sa clé et on enregistre.
  • Mais on en est pas content, et on revient à la première API : il ne faut pas que la première clé ait été perdue. C’est à cela que serve deux options pour éviter l’effacement du tableau de requêtes.

Compléments

Utilisation avec ses propres saisies

Si vous créez vos saisies ou surchargez vos saisies, il est nécessaire de lire les paragraphes suivants de l’article “Créer ses propres saisies” :

Utilisation avec nom de saisie implicite

Depuis la version 3.34.0 du plugin, il est possible, côté PHP, de profiter de la syntaxe des tests combinés sans pour autant passer un champ, mais en envoyant explicitement une valeur à la fonction saisies_evaluer_afficher_si().

Exemple:

saisies_evaluer_afficher_si("< 2 && > -2", '', '', $valeur);

vérifie que la variable $valeur<code> est supérieure à <code>-2 mais inférieure à 2. Le plugin Formidable Tablesorter en tire profite dans sa version 2.0 pour effectuer les filtres au niveau PHP.

Footnotes

[1En effet, comment générer un code JavaScript de tests de valeur de champ si on n’a qu’un seul champ?

[2Ce que fait le plugin Formidable pour non pas récupérer la valeur originel, mais pour mettre à `null`.

Discussion

No discussion

Add a comment

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 / PostgreSQL
  • 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 apparait.

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.

Who are you?
[Log in]

To show your avatar with your message, register it first on gravatar.com (free et painless) and don’t forget to indicate your Email addresse here.

Enter your comment here

This form accepts SPIP shortcuts {{bold}} {italic} -*list [text->url] <quote> <code> and HTML code <q> <del> <ins>. To create paragraphs, just leave empty lines.

Add a document

Follow the comments: RSS 2.0 | Atom