Créer un formulaire

Publicodes permet de générer un formulaire intéractif tout autant qu’un simulateur affichant une liste de questions. Vous pouvez implémenter l’interface utilisateur la plus adaptée à votre application à partir des informations calculées par le moteur.

Questions et méta-données

Les questions sont définies via la création d’une règle publicodes :

age:
  question: Quel âge avez-vous ?
  type: nombre

# La règle "age" contient la réponse à la question correspondante
personne majeure: age >= 18

prénom:
	question: Quel est votre prénom ?
	type: texte

On peut filtrer les règles publicodes pour obtenir uniquement la liste des questions :

const engine = new Publicodes(rules);
const questions = engine.parsedRules.filter((rule) => rule.rawNode.question !== undefined);

Vu qu’il s’agit de règles publicodes standard, on peut utiliser l’applicabilité pour déterminer la liste des questions à afficher :

commande:
commande . bière:
	applicable si: personne majeure
	question: Souhaitez-vous une bière ?
	par défaut: non
const questionsToDisplay = questions.filter((question) =>
    engine.evaluate({ 'est applicable': question })
);

Variables traversées

L’utilisation de l’applicabilité permet déjà d’afficher ou de cacher des questions en fonction des réponses précédentes. Mais pour certains formulaires par nature très dynamiques, on veut en plus pouvoir ordonner automatiquement les questions.

Là encore, l’implémentation concrète dépendra de chaque application. Mais généralement il faudra prendre en compte les dépendences entre les questions. Ainsi dans l’exemple ci-dessus, on veut d’abord déterminer si la personne est majeure avant de lui demander s’il elle veut commander une bière. Il faut donc poser la question de l’âge en premier.

Pour exploiter cette notion de dépendance des questions, on peut utiliser les variables manquantes. Les variables manquantes sont une méta-donnée retournée lors de l’évaluation d’une expression publicodes qui permet de connaître l’ensemble des règles qui interviennent dans son calcul dont la valeur par défaut a été utilisée.

commande . vin:
	applicable si:
		toutes ces conditions:
			- personne majeure
			- bière = non
	question: Voulez-vous une bouteille de rouge ?
	par défaut: non

On peut évaluer la règle commande . vin pour déterminer sa valeur actuelle ainsi que les variables manquantes dans le calcul :

const commandeVin = engine.evaluate('commande . vin');
console.log(commandeVin.nodeValue); // false - la valeur par défaut
console.log(commandeVin.missingVariables); // { 'personne majeure' : <number>, 'bière': <number> }

Les missingVariables sont des variables qui n’ont pas de valeur dans la situation courante. On peut donc les utiliser pour déterminer les questions à poser. Le nombre associé à chaque variable correspond au nombre de fois où elle a été utilisée, et à l’incidence sur le calcul de la règle.

À noter que les variables manquantes disparaitront si on évalue la règle avec une situation complète :

const engine.setSituation({ 'personne majeure': 'oui', 'bière': 'non' })
const commandeVin = engine.evaluate('commande . vin') // { nodeValue: true, missingVariables: {} }