Xforms : gérer le masquage de champs et l’enregistrement du XML associé

Comment conserver le XML de champs masqués à l’enregistrement, tout en vidant ce XML des éventuelles valeurs saisies par l’utilisateur avant masquage.

Problématique

Sur les cas d’utilisations usuels, on souhaite avoir le comportement suivant :

  • On masque des champs du formulaire en testant la valeur d’autres champs,
  • lors d’une future réédition du document, le formulaire doit permettre de saisir des champs que l’utilisateur aurait masqué lors d’un précédent enregistrement,
  • par contre, si l’utilisateur a saisi des valeurs dans un champ qui devient par la suite masqué, on souhaite que le XML enregistré ne contienne pas ces valeurs (pour l’utilisateur la logique est qu’un champ invisible n’ai pas de valeurs ou textes saisis).

Mais le comportement par défaut d’Xform ne permet pas d’accomplir cet objectif pour 2 raisons :

  • Par défaut, un élément irrelevant n’est pas sérialisé à l’enregistrement (et donc à la réédition, le champ associé ne peut plus apparaitre puisque l’élément XML lié n’est plus présent),
  • lorsqu’on modifie ce comportement (nous allons voir comment), les éventuelles valeurs saisies avant masquage du champ sont sérialisées.

Or notre objectif technique est de sérialiser uniquement la structure du XML, sans valeurs.

Étape 1 : comment ne pas supprimer le XML irrelevant ?

Étape la plus simple, pour dire à Xform de sérialiser les éléments XML irrelevant, il suffit d’ajouter relevant= »false » sur l’élément submission, par exemple :

<xf:instance id= »data »>
    <data>
        <value1 choice= »true »/>
        <value2 text= » »/>
    </data>
</xf:instance>

<xf:bind nodeset= »instance(‘data’)//instance/value2″ relevant= »../value1/@choice = ‘true' »/>

<xf:submission id= »save » ref= »instance(‘data’) » resource= »https://… » method= »post » replace= »none » relevant= »false »>
    <xf:action ev:event= »xforms-submit »/>
</xf:submission>

Le XML créé contiendra value2 quelle que soit la valeur de value1/@choice.

Étape 2 : comment vider le XML à l’enregistrement ?

Pour le moment, tout notre XML est bien pris en compte à l’enregistrement, ce qui permet lors d’une réédition du document de pouvoir afficher des champs qui avaient été masqués lors de l’enregistrement précédent.
Par contre, le XML irrelevant n’est pas ‘vidé’, concrètement en l’état :

  • Si l’utilisateur saisi du texte dans le champ associé à value2/@text,
  • puis masque ce champ en mettant le contrôle associé à value1/@choice à false,
  • alors le XML enregistré au submit contiendra le texte saisi par l’utilisateur dans value2/@text, ce qui n’est pas ce que l’on souhaite.

Pour résoudre ce problème, on doit faire appel aux extensions Xform (exf – https://www.exforms.org/) qui sont supportées par Orbéon.

Ces extensions permettent de tester le statut relevant d’un élément XML, on peut alors écrire dans notre submit :

<xf:submission id= »save » ref= »instance(‘data’) » resource= »https://… » method= »post » replace= »none » relevant= »false »>
    <xf:action ev:event= »xforms-submit »>
        <xf:setvalue xxf:iterate= »//@text[not(exf:relevant(.))] » ref= ». »/>
    </xf:action>
</xf:submission>

Le setvalue vide tous les attributs text qui ne sont pas relevant (donc qui sont masqués suite à action de l’utilisateur), on peut bien sur enchainer plusieurs setvalue pour traiter les différents cas !

Voilà, via ces 2 étapes, nous arrivons à un formulaire qui permet de revenir après enregistrement sur des masquages de champs et de vider les éventuelles valeurs saisies avant masquage !

Ce sujet vous intéresse ?

NOUS CONTACTER