2.6 - Substitution d'attributs

Attention : Ce tutoriel est ancien, incomplet, et n'est pas mis à jour. Il ne contient pas toutes les nouveautés du système de template de Gecko 1.9 / Firefox 3.0 qui est largement simplifié et permet d'utiliser sqlite ou xml comme source de données. Aussi est-il préférable d'aller consulter la version anglaise sur developer.mozilla.org.

Jusqu'à présent, la valeur d'une variable était utilisée pour remplacer la totalité d'un attribut dans le corps d'action. Toutefois, vous pouvez également ne remplacer qu'une partie de la valeur de l'attribut, ou utiliser plusieurs variables dans un seul attribut. Par exemple, pour inclure un préfixe avant une variable, vous pouvez utiliser :

<label value="Mon nom est ?name"/>

L'effet sera que la partie ?name de l'attribut sera remplacée par la valeur de la variable ?name. Par exemple, si la valeur de ?name est Jake, alors la valeur de l'attribut sera Mon nom est Jake. Vous pouvez inclure plusieurs variables si vous le désirez :

<label value="Mon nom est ?name et j'ai ?age ans"/>

Cette technique fonctionnera pour toutes les variables de remplacement dans le corps d'action à l'exception de l'attribut uri qui n'aurait aucun sens.

Notez que les noms de variables doivent être suivis d'un espace pour qu'ils puissent être déterminés comme des variables.

Ainsi, '?name?age' est considéré comme étant une seule variable portant ce nom, et non les deux variables escomptées. Pour utiliser deux variables, vous devez placer un espace entre elles. Mais il est parfois nécessaire de concaténer deux valeurs ensemble sans espace intermédiaire. Il vous suffit de mettre deux variables l'une à la suite de l'autre dans l'attribut en les séparant par un caractère ^.

<label value="?name" class="?gender^?nationality"/>

Le signe ^ est considéré comme un séparateur entre les variables, il n'apparaîtra pas en sortie. Il peut aussi servir à séparer une variable et du texte normal :

<label value="?name" class="?gender^allemand"/>

Ces deux derniers exemples ont défini l'attribut class du libellé. Ainsi, le libellé aura le style de classe soit maleallemand ou soit femelleallemand. Dans une feuille de styles, vous pouvez définir des propriétés pour chacune de ces classes de telle sorte que les valeurs différentes apparaîtront différemment sans avoir recours à des règles multiples.

Bien que moins classique, vous pouvez également insérer un point d'interrogation ou le signe ^ dans une valeur d'attribut. Pour cela, doublez simplement ces caractères. Par exemple :

<label value="Quel est mon nom?? Mon nom est ?name"/>

Dans cet exemple, le libellé devrait être Quel est mon nom? Mon nom est Jake.

Notez que le signe ^ n'a une signification spéciale qu'à la fin d'une variable, ainsi il ne faut le doubler qu'après une variable.

Une dernière chose à préciser est que puisque les seuls caractères pouvant séparer une variable sont le signe ^, un espace ou la fin d'un attribut, cela signifie que n'importe quel autre caractère est valide dans le nom d'une variable. Cependant, pour une meilleure lisibilité, vous devriez vous restreindre à l'emploi de noms de variables contenant des lettres, des nombres et peut-être des traits d'union pour séparer les mots.

La description ajoutée dans l'exemple précédent peut être un long texte pour certaines photos. Il peut être préférable que le texte puisse être tronqué en le plaçant dans un élément description. Cela signifie que nous devons faire un remplacement de variable en texte, et non en tant que valeur d'attribut. La balise textnode est employée dans ce cas. Elle dispose d'un seul attribut, l'attribut value qui opère une substitution de variables comme les autres attributs. Toutefois, l'élément textnode n'est pas copié dans le contenu généré mais un noeud DOM texte est créé à la place avec la valeur de l'attribut value et son contenu. Par exemple, si le gabarit contient :

<description><textnode value="?description"/></description>

Le contenu qui sera généré serait :

<description>Prise de vue à partir du sommet de la tour en regardant vers l'Est du palais des Doges</description>

Vous noterez que textnode a été remplacé par la valeur substituée de son attribut. Malheureusement, cette substitution peut ne pas fonctionner à chaque fois à cause d'un bogue. Souvenez vous que le constructeur de gabarits ne charge pas la source de données avant de traiter un gabarit. Les règles sont examinée au fur et à mesure que les nouvelles données sont chargées. Donc lors du chargement, des données peuvent correspondre aux règles. Toutefois, les variables déterminées à partir d'une liaison binding sont évaluées en utilisant un process beaucoup plus simple. Le bogue est que le code pour les liaisons ne traite pas correctement l'élément textnode. Ainsi, si vous utilisez une variable définie dans une liaison binding, vous devez vous assurer que la source de données soit chargée avant que le gabarit ne soit construit, ou bien vous reconstruisez simplement le gabarit. Une autre possibilité consiste à réarranger le RDF de telle sorte que les valeurs, dans cet exemple les descriptions, soient spécifiées avant les conteneurs. Tout ceci peut vous paraître confus, mais espérons que ce bogue, si vous le rencontrez, soit corrigé bientôt.


Mozilla® est une marque déposée de la fondation Mozilla.
Mozilla.org™, Firefox™, Thunderbird™, Mozilla Suite™ et XUL™ sont des marques de la fondation Mozilla.