Filtrer les options d'une liste (formulaire) selon la sélection d'une autre liste (formulaire): comment faire?

Bonjour,

Je cherche à filtrer les valeurs proposées dans une liste déroulante en fonction de l’option sélectionnée dans une liste plus tôt dans le formulaire.
Les deux listes font appel à des données d’autres formulaires.
Je n’arrive pas à trouver la bonne syntaxe : que mettre dans le query pour filtrer les entrées de la liste (=fiches du formulaire) qui ont pour valeur celle sélectionnée dans une autre liste ?

Pour résumer le cas d’usage:

  1. j’ai une liste de lieux (saisis via un formulaire)
  2. auxquels j’ai associé (dans un autre formulaire) des éléments qu’ils contiennent, en remplissant un champ « lieudappartenance » dans la fiche de l’élément.
  3. je voudrais qu’en saisissant une fiche d’un troisième formulaire (pour l’exemple appelons ça une « caractéristique » de l’élément) je puisse l’associer aux éléments d’un lieu, sans lister la totalité des éléments de tous les lieux.
  4. donc j’essaye de filtrer les éléments qui appartiennent au lieu sélectionné dans l’affichage de la liste déroulante

Je n’arrive pas à comprendre comment réaliser ce filtre :thinking:

Merci d’avance,
Bonne journée :slight_smile:

Hello @Lapineige
Ca ne sera pas faisable avec les fonctionnalités de base de YesWiki…
Mais si tu aimes faire du sale avec du javascript, c’est possible de faire quelque chose dans le genre:
le formulaire « caractéristique » contient ses champs propres et une liste déroulante des fiches « lieux » et une liste déroulante des « lieux d’appartenance » (par défaut ils y seraient tous mais on peut cacher cette liste avec du css).
En javascript, faire un code qui lors de la sélection d’un lieu (event onchange sur liste des lieux), fait une requete api sur le formulaire « lieux d’appartenance » avec un parametre query=lieu=<lieu selectionné> et tu pourrais remplacer les éléments de la liste déroulante « lieux d’appartenance » par cette liste filtrée.

1 « J'aime »

Ah, je n’avais pas identifié cette limitation. C’est assez contraignant côté conception des formulaires :sweat_smile:
Est-ce quelque chose de prévu ou un ajout qui serait apprécié ?

Côté technique quelle est la limitation ? Impossible d’avoir la valeur du champ ? Ou de l’avoir pendant l’édition d’un formulaire ?

Est-ce que par exemple il n’est pas possible d’afficher un texte personnalisé à la volée après saisie d’un champ dans le formulaire (avant de créer la fiche) ?

Merci pour l’astuce :slight_smile:

Donc si je comprends bien on afficherait (via YesWiki) toute la liste, qu’on masque en CSS (= impossible de sélectionner) au début, et quand on sélectionne un critère de filtre (ici le lieu) on réaffiche (via le CSS) les options disponibles en filtrant par ce critère (via la requête JS à l’API). J’ai bon ?

Le javascript serait incrit dans une balise HTML du formulaire du coup ?

Ça ne fait pas doublon ces deux listes ? :thinking:

oui a voir si tu caches/montres les options avec du css ou en remplacant le DOM html, mais les 2 marcheraient normalement.

non dans la balise HTML du formulaire, on n’a pas le droit au retour a la ligne, ca risque d’etre contraignant…
Ca peut être fait dans le javascript du theme utilisé ou dans le dossier custom/javascripts (avec le défaut que ce sera chargé dans toutes les pages).
Sinon dans la page wiki qui affiche le formulaire (avec le défaut que les saisies depuis l’interface d’admin de la page BazaR n’auront pas ce code présent que dans la page).

J’ai peut être pas compris mais s’il y a un premier formulaire avec juste les lieux et un deuxième qui associe les lieux a d’autres critères, il faudra bien le premier sous forme de liste, pour filtrer le deuxième.

1 « J'aime »

Oui biensur, ce genre de demande revient assez souvent, mais la difficulté pour l’intégrer au cœur de YesWiki, c’est de partir du postulat qu’il faut arriver a faire cela sans que les usager.es de base aient a faire du code, que cela marche dans la plupart des cas, et sans que l’interface soit trop complexe, les choses les plus simples étant les plus difficiles a coder.

Mais toute PR sur le sujet est vivement appréciée!

1 « J'aime »

Donc faudrait faire une variante du thème et la charger spécifiquement sur la page d’édition du formulaire ?

Dans le code HTML de cette page-là tu veux dire ?

Ok, il me manque des éléments pour comprendre la difficulté/complexité du sujet dans ce cas, vu que naïvement j’ai l’impression que ça serait assez simple côté interface et surtout une mécanique interne ? :thinking:

Est-ce que la query ne pourrait pas « simplement » écrire champàanalyser=autrechamp pour vérifier que dans le champàanalyser on a la valeur du champ autrechamp ?
Et ensuite c’est dans la tambouille interne que la valeur actuelle de autrechamp est récupérée est comparée à la valeur du champàanalyser ?

Pas dans la page d’édition du formulaire mais dans la page contenant le formulaire de saisie. On peut se débrouiller pour que le js ne soit chargé que dans certaines pages, mais sinon tous les fichiers js dans custom/javascripts ou dans themes/montheme/javascripts sont chargés automatiquement.

oui, directement dans la page wiki en mettant ""<script>....</script>""

oui peut être, il faudrait l’id du champ à analyser depuis le formulaire, et l’id du champ dans le formulaire cible à minima, mais possible que ce soit moins compliqué que je l’imaginais… ou pas.

Ok, c’est quoi le bon espace pour discuter de implémentation d’une telle fonctionnalité ?
Et est-ce que ça peut se tester dans un fork local facilement (le dossier custom est adapté ?) ?

Y’aurait une logique particulière à gérée pour s’adapter en temps réel aux saisies dans les champs ? :thinking:

Merci pour l’aide en tout cas :slight_smile:

Dans le framateam YesWiki, il y a un canal de dev pour cela.

oui tu pourrais faire des custom/fields/ qui reprennent le code des champs auxquels tu voudrais changer le comportement.

pas vraiment, il me semble que la restitution des formulaires de saisie n’est pas fait avec vuejs, donc t’as des templates twig pour les champs, dans lesquel tu peux appeler des fichiers javascript a inclure et faire ta tambouille.

1 « J'aime »

Super, merci des informations, je vais migrer la discussion là-bas :slight_smile:

Et donc a priori si je me lance ce me serait relativement facile à mettre en place dans un environnement local, c’est déjà une barrière de moins :ok_hand:

1 « J'aime »