Les formulaires
- Norme en cours d'élaboration
- Pour aller au-delà des formulairers HTML, les concepteurs ont soigneusement séparé l'aspect interface utilisateur et le modèle de données sous-jacent. En effet, le même composant de formulaire peut avoir des représentations très différentes suivant le butineur et la plateforme utilisés pour "afficher" un document, permettant ainsi d'adapter la représentation aux caractéristiques de la plateforme.
- Un formulaire sert à envoyer des données du client au serveur. Ces données seront au format XML.
- La spécification XForms définit trois aspects: le modèle de données, l'interface utilisateur et le protocole d'envoi.
- Le protocole d'envoi n'est pas encore défini, mais devrait permettre le remplissage partiel d'un formulaire, puis sa sauvegarde, pour le terminer plus tard.
- Les données de formulaires sont représentées sous la forme d'un élément XML complexe (instance de données) dont les sous-éléments correspondent aux divers éléments interactifs du formulaire.
Modèle de données
- Premier Internet Draft sorti en avril 2000
- Le modèle de données est subdivisé en deux parties: les structures de données, d'une part, et les extensions (contraintes, dépendances, calculs), de l'autre.
- Le modèle de données définit des types de données de manière très similaire au formalisme de schéma: String, Boolean, Number, Monetary Values, Date, Time of Day, Duration, URI, Binary.
-
Chaque type
de donnée a des "facettes" qui lui sont associées. Ces
facettes représentent des détails du type (p.ex. précision,
format, valeur par défaut, masque, etc.) et sont fournies sous la
forme soit d'attributs, soit de sous-éléments. Par exemple:
<xform:string name="Nom" />
<xform:date name="DateParution" min="now" />
<xform:date name="DateNaissance" max="now"/> -
Contrairement aux schémas pour lesquels les facettes sont statiques,
les facettes XForm peuvent être dynamiques, c-à-d. correspondre
à des contraintes qui évoluent en cours d'exécution
(par ex. bornes inférieures et supérieures d'un élément
de formulaire qui changent en fonction de ce que l'utilisateur aura tapé
dans d'autres champs). Exemple:
<xform:date name="HeureDepart" max="HeureArrivee" />
<xform:date name="HeureArrivee" min="HeureDepart" /> - Il y a un certain nombre de types dérivés des types de bases prédéfinis: currency (monaie), ...
Données structurées
Types énumérés
Basés sur le type string, en énumérant la liste des valeurs possibles. Exemple:
<xform:string name="card" enum="closed">
<xform:value>Visa</value>
<xform:value>MasterCard</value>
<xform:value>Diners</value>
<xform:value>American Express</value>
</xform:string>
Structures hétérogènes
Permet de regrouper un certain nombre de champs pour former une entité. Exemple:
<xform:group name="client">
<xform:string name="Nom"/>
<xform:string name="rue"/>
<xform:string name="ville"/>
<xform:string name="pays"/>
<xform:string name="codePostal"/>
</xform:group>
Alternatives
"Unions"
Permet de déclarer différentes façons de fournir la même information. Exemple:
<xform:union name="genre">
<xform:string enum="closed">
<xform:value>féminin</value>
<xform:value>masculin</value>
</xform:string>
<xform:string enum="closed">
<xform:value>F</value>
<xform:value>M</value>
</xform:string>
</xform:union>
Variantes
Permet de déclarer des structures différentes en fonction de la valeur d'un champ. Exemple:
<xform:switch name="address">
<xform:case locale="us" condition="property(locale) is
'US'">
<xform:string name="street"/>
<xform:string name="city"/>
<xform:string name="state"/>
<xform:string name="zipCode"/>
</xform:case>
<xform:case locale="ch-fr" condition="property(locale) is
'CH-FR'">
<xform:string name="rue"/>
<xform:string name="ville"/>
<xform:string name="canton"/>
<xform:string name="codePostal"/>
</xform:case>
<xform:case locale="uk" condition="property(locale) is
'UK'">
<xform:string name="street"/>
<xform:string name="town"/>
<xform:string name="county"/>
<xform:string name="postCode"/>
</xform:case>
<xform:case locale="default">
<xform:string name="street"/>
<xform:string name="town"/>
<xform:string name="county"/>
<xform:string name="postCode"/>
</xform:case>
</xform:switch>
Structures homogènes
Permet de répéter une structure en plusieurs exemplaires. Exemple:
<xform:array name="auteurs" minOccurs="1" maxOccurs="unbounded">
<xform:string name="auteur" />
</xform:array>
Langage de contraintes dynamiques
Les contraintes dynamiques sont définies par des expressions faisant référence à divers éléments du document. Cest éléments peuvent être référencés à l'aide de la notation définie dans XPath. Pour éviter des problèmes dûs à l'utilisation de caractères spéciaux, les opérateurs utilisés dans les expresssions sont des mots:
opérateur | signification |
---|---|
not expr | inverse le résultat de l'expression |
if cond then expr1 else expr2 | le résultat sera le résultat de la première expression si la condition est vraie, sinon celui de la deuxième expression |
expr1 is expr2 | retourne vrai si les deux expressions sont égales |
expr1 is within(expr2,expr3) | retourne vrai si expr1 est une valeur comprise entre expr2 et expr3. Les expressions doivent être du même type de base (numérique, string, date, temps, valeur monétaire) |
expr1 is before expr2 | expr1 est inférieure à expr2 |
expr1 is below expr2 | idem |
expr1 is after expr2 | expr1 est supérieure à expr2 |
and, or et xor | opérateurs booléens |
plus, minus, times et over | opérateurs arithmétiques |
string1 plus string2 | concaténation de chaînes de caractères |
nombre% | valeur divisée par 100 |
number(), sum(), floor(), ceiling(), average(), min(), max() | fonctions numériques |
string(), concat(), starts-with(), contains(), substring-before(), substring-after(), substring(), string-length(), normalize-space() et translate() | fonctions de manipulation de chaînes de caractères |
now() | heure actuelle du système sous forme de chaîne de caractères |
submit() | envoi au serveur |
Interface utilisateur
Cette section décrit les balises à utiliser pour décrire l'interface utilisateur, les propriétés de style permettant la mise en page des éléments interactifs de formulaires, ainsi que le mécanisme faisant le lien entre l'interface utilisateur et le modèle de données.
Eléments interactifs
Elément | Catégorie | Description |
---|---|---|
output | anyControl | élément non modifiable par l'utilisateur et affichant une valeur généralement calculée à partir d'autres éléments |
textbox | anyNavControl | élément de saisie de texte. Les attributs rows et cols indiqueront les dimensions (en caractères). |
checkbox | anyNavControl | case à cocher |
exclusiveSelect | anyNavControl | élément de sélection simple contenant un élément <item value="..."> pour chaque valeur possible. La propriété de style list-ui peut prendre une des valeurs radio, checkbox, menu ou listbox pour définir l'apparence de l'élément |
multipleSelect | anyNavControl | élément de sélection multiple contenant, comme l'élément exclusiveSelect, des éléments item. |
button | anyNavControl | élément permettant de lancer une action. L'attribut action peut contenir une contrainte dynamique. |
submit | button | élément provoquant l'envoi des données du formulaire. L'attribut action a pour valeur par défaur submit(). |
reset | pas encore défini | |
suspend | pas encore défini |
D'autres éléments interactifs seront bientôt définis.
Eléments de mise en page
Elément | Description |
---|---|
groupbox | élément pouvant contenir d'autres éléments de formulaire. La propriété de style layout indique la direction selon laquelle les éléments contenus sont répartis (horizontal, vertical ou inherit). La propriété field-align indique l'emplacement de l'étiquette (sous-élément <caption>) d'un élément par rapport à l'élément interactif même (left, right, top, bottom, center, justify ou inherit). |
D'autres éléments, t.q. grille, seront bientôt définis.
Liens entre interface et modèle
- Le lien entre éléments de l'interface et l'instance de données est réalisé à l'aide d'expressions dans le langage de contraintes dynamiques.
- Chaque élément interactif de formulaire peut avoir un attribut ref qui prend pour valeur une expression dans le langage de contraintes dynamiques. Cet attribut indique quelle partie de l'instance de données l'élément interactif définit.
-
Exemple:
<xform:textbox ref="EmpruntLivre/Emprunteur/NomFamille">
L'instance de données correspondante aurait la forme suivante:
<EmpruntLivre>
<Emprunteur>
<NomFamille>...</NomFamille>
</Emprunteur>
</EmpruntLivre> -
il est possible de déclarer le lien séparément, en utilisant
des identificateurs:
<xform:textbox ref="id('NomEmprunteur')">
...
<xform:bind id="NomEmprunteur" ref="EmpruntLivre/Emprunteur/NomFamille">
<xform:instance>
<EmpruntLivre>
<Emprunteur>
<NomFamille>pas défini</NomFamille>
</Emprunteur>
</EmpruntLivre>
</xform:instance>L'élément <xform:instance> sert à définir la valeur intiale de l'instance de données associée à un formulaire. Ses sous-éléments devraient être modifiés par le logiciel employé par l'utilisateur lorsque celui-ci interagit avec les éléments interactifs du formulaire.
Note: S'il y a plusieurs formulaires indépendants dans le même document, l'élément <xform:xform id="NomDuFormulaire"> permet de déclarer un formulaire et l'attribut xform:xform permet d'associer un élément interactif à un formulaire déclaré. Exemple:
<xform:textbox xform:xform=ref="EmpruntLivre/Emprunteur/NomFamille">
<xform:xform id="b">
<xform:model>
...
</xform:model>
<xform:instance>
<EmpruntLivre>
<Emprunteur>
<NomFamille>...</NomFamille>
</Emprunteur>
</EmpruntLivre>
</xform:instance>
</xform:xform>
L'élément <xform:model> sert à définir le modàle de données associé à un formulaire, un peu comme une déclaration de type dans un langage de programmation. Si une instance est explicitement déclarée, elle doit être conforme au modèle associé au formulaire.
L'élément <xform:bind id="..." ref="..."> permet d'établir un lien entre modèle, instance et interface lorsque ces différentes parties ne sont pas directement imbriuées dans le même élément <xform:xform>
- XForms 1.0 (W3C Working Draft 16 February 2001)