Guide SCENARIbuilder

Les données de type "formulaire"

Les bases des dataforms

dataForms

Les dataforms sont une primitive de données saisies sous forme de "champs de formulaires" (par oppositions aux champs de type paragraphes).

Par exemple, si on souhaite représenter des planètes, elles ont aussi des données précises : nom, diamètre, masse, que nous qualifierons de méta-données. Ce type d'information n'est pas bien adapté à une structure type "bloc de contenu" ou "ensemble de paragraphes", nous n'utilisons donc pas les compositionPrim, mais un nouveau type de primitive de contenu : les dataformPrim.

Quand utiliser des dataforms ?

Cette section vous fera découvrir une 2eme primitive importante de modélisation : les dataforms. Comme vous avez pu le voir dans l'analyse, les planètes ont aussi des données précises : nom, diamètre, masse, que nous qualifierons de méta-données. Ce type d'information n'est pas bien adapté à une structure type "bloc de contenu" ou "ensemble de paragraphes", nous n'utilisons donc pas les compositionPrim, mais un nouveau type de primitive de contenu : les dataformPrim.

Intégration des dataforms

Vous avez déjà fait usage de méta-données : le titre est en quelque sorte, une meta donnée avec une seule information. Dans astrobj.model, vous allez supprimer la référence à sTitle.model et à la place, créer un nouvel item : dans l'écran de création des items : Primitives -> Primitives de métadonnées -> dataFormPrim. Nommez le par exemple astrobjMeta.model : il est d'usage de rajouter le mot Meta ou simplement la lettre M aux nom et code de la composition pour choisir ceux des métadonnées.

Autres points de départs pour les dataforms

Il existe au moins 3 méthodes pour intégrer des dataforms :

  • sm:meta : rattaché à l'ensemble de la composition (comme c'est ici le cas)
  • sm:part -> sm:meta : rattaché à uniquement une part
  • subdata : à l'intérieur d'une dataform, permet de pointer vers une autre dataform.
Le premier champ texte

Après avoir défini les informations de namespace et le code, vous allez créer le premier field (champ de donnée) de la dataform : le nom de l'astre. Pour déterminer le caractère obligatoire ou facultatif d'un champ, il faut spécifier une valeur à l'attribut occurences.

  • one : obligatoire.
  • one or more : obligatoire combiné à plusieurs occurences ;
  • zero or one : optionnel ;
  • zero or more : optionnel combiné à plusieurs occurences.

il n'y a pas d'attribut required ou optional mais plutôt occurrences.

Les champs de type refItem

Si vous voulez créer un champ qui pointe vers un autre item, comme par exemple pour associer une image à vos méta-données de l'astre, vous allez définir un 2ème champ "photo" avec un type refItem. Comme pour les parts des compositions, vous y placez des allowedModel : dans notre cas, 2 formats d'images à aller chercher dans les modelets. Pensez aussi à mettre jpeg.model et png.model dans le publicClasses de votre wspdef pour que l'auteur puisse les créer.

Les champs de type enum

Nous souhaitons maintenant demander à l'auteur le type de planète, ce type va toujours appartenir à un ensemble fini de possibilités : "étoile", "tellurique" ou "chtonienne". Dans les dataforms SCENARI, cela se traduit par des champs de type enum. Un champ enum contient des couples key / name, le premier étant l'identifiant utilisé à l'intérieur du fichier XML de stockage produit par SCENARI, le 2ème étant le nom tel qu'affiché dans l'interface auteur (il est aussi possible de le réutiliser en publication).

Les groupes et sets

Pour les satellites qui contiennent 2 données : le nom et la distance, l'approche la plus intuitive serait de créer une autre dataform et au lieu de déclarer un nouveau field, de faire un subData. Cette approche est tout à fait valable, mais comme nos données sont relativement simples, nous pouvons plutôt faire un group "satellite" et à l'intérieur 2 field "nom" et "distance".

Titrez vos meta

Nous avons vu que les dataforms sont une liste de champs. Lorsque le contexte s'y prête, vous devez choisir un des champs de la dataform qui sera utilisé en tant que titre. Dans notre exemple, c'est le champ ayant pour code name (le nom de l'astre) qui sera utilisé comme titre.

Jusqu'à présent nous avons uniquement parlé de "titres simples". Dans certains cas, nous pourrions être amené à demander à l'auteur 2 types de titres, un fullTitle et un shortTitle, pour pouvoir soit être exhaustif lorsque l'on dispose d'une ligne complète pour publier le titre, soit de faire un petit lien de menu ou synthétiser encore plus lorsque l'on doit faire tenir ce titre en quelques caractères. Pour utiliser ce genre de "double titre", prenez soit le fichier title.model des modelets a la place de sTitle, soit une dataform dans laquelle vous allez définir les 2 mécanismes fullTitleBuilder et shortTitleBuilder.

Résultat dans SCENARItest

Publication HTML

Les tableaux

La première particularité de ce type de transformeur est qu'il est orienté sur la création de tableau. Bien qu'on puisse aussi conserver une approche "blocks de contenu" par les WBlocks, 2 types de tableau font leur apparition : WTable et W2Cols. Après avoir précisé encore une fois le comportement content au lieu de navigation pour la dataform, nous allons imbriquer les 2 types, un tableau à 2 cellules "photo + tableau 2" et un tableau 2 avec une liste des noms et valeurs du reste de la dataform.

WTable

Le WTable est un tableau "libre", le modélisateur va créer ligne + colonnes et les remplir. Il est adapté a des tableaux à contenu varié ou des tableaux en largeur. Nous allons créer un tableau a 2 cellules : à gauche, la photo et à droite, les autres informations de la dataform. Un WTable contient des WTableRow puis des WTableCell.

W2Cols

Le W2Cols est un tableau à 2 colonnes, couramment utilisé pour publier des lignes "nom / valeur" des champs d'un formulaire. Pour le remplir, utilisez un W2ColsFreeRow à l'intérieur d'un forField, il en résultera 2 points d'entrée pour le contenu : les labelCell et les valueCell.

Les conditions d'existance : Choose / When

Dans ce tutoriel, nous voulons, si une planète a un ou des satellites, ajouter un bloc avec pour titre "satellites" dans notre publication HTML, mais que cette partie n'apparaisse dans le cas contraire.

Nous utilisons pour cela l'ensemble choose / when / otherwise. La condition est déterminé dans le when : elle peu être l'existence d'un code dans les données (donc, qu'une part, qu'un field ou qu'un group existe), avec l'attribut codes, si les codes existent ce qui est dans le when est appliqué, dans le cas contraire ce qui est dans le otherwise est appliqué. When ne sélectionne pas les donnés, il faut donc refaire un for après. Si nous récrivons le transformer de la même manière sans choose / when, le titre "satellites" sera publié même pour les parties n'en ayant pas.

Des conditions plus complexes avec xpath

A l'aide d'expressions xpath, nous avons plus de liberté pour poser des conditions sur le contenu des champs, sur le nombre d'éléments... Exemple de condition XPATH sur la valeur d'un champ enum.

Conserver la structure et la hiérarchie

Pour publier la liste des satellites, nous avons 3 balises de structure dans le dataform.model :

  • Le groupe sat
  • En sous niveau de sat, le champ name (nom du satellite)
  • En sous niveau de sat, le champ dist distance)

Il est très important de conserver la même hiérarchie : commencer par un forGroup puis des forField. Pour cette partie, au lieu de tableaux, nous utilisons des WBlock qui se traduisent dans le HTML par des div ou des span.

Publication ODT

Même procédé mais...

Pour créer la version OD du transformer, vous pouvez adopter aproximativement la même méthode, mais attention, prenez en compte les risques suivants :

  • Il est très dangereux de proposer àl'auteur de rentrer des paragraphes longs dans des tableaux, la gestion des tableaux étendus sur plusieurs pages peux poser problème lors de l'ouverture du document avec OpenOffice.
  • Il est déconseillé d'imbriquer les tableaux ou les WBox pour les même raisons.

En résumé, utilisez les tableaux avec parcimonie.

(c) scenari-platform.org 2007