2.1 - Conditions

Écrit par Neil Deakin. Traduit par Alain B. (30/08/2005).
Page originale : http://developer.mozilla.org/en/docs/XUL:Template_Guide:Conditions xulplanet.com

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.

Étudions une règle simple avec deux conditions. Les conditions sont insérées dans une balise conditions qui est elle même placée directement à l'intérieur d'une balise rule. Chaque condition est placée dans une balise conditions.

<vbox datasources="http://www.xulplanet.com/ds/sample.rdf"
         ref="http://www.xulplanet.com/rdf/A" hidden="true">
  <template>
    <rule>
      <conditions>
        <content uri="?start"/>
        <triple subject="?start"/>
                predicate="http://www.xulplanet.com/rdf/relatedItem"/>
                object="?relateditem"/>
      </conditions>
      ...
    </rule>
  </template>
</vbox>

Cette règle a deux conditions, chacune définie par une balise différente. Le gabarit ne va rien générer puisque la partie correspondante au contenu n'a pas été remplie au delà des conditions. Cependant, le constructeur de gabarit sera capable de compiler les règles et de les examiner comme décrit précédemment.

Pour démarrer, le constructeur a besoin d'un unique résultat en tant que graine. Celle-ci sera obtenue grâce à la balise content. Elle indique que nous allons utiliser un point de départ pour la navigation dans le graphe. Évidemment, comme vous devez démarrer quelque part, vous devez utiliser une balise content qui sera votre première condition. De plus, comme nous ne pouvons avoir qu'un seul point de départ, une seule balise content ne peut être utilisée. La graine résultante sera créée comme ceci :

(?start = http://www.xulplanet.com/rdf/A)

La variable ?start est déterminée à partir de l'attribut uri de la balise. Vous pouvez utiliser n'importe quelle variable que vous désirez ; il est fréquent d'employer la variable ?uri. Toutefois, toutes les règles doivent utiliser la même variable définissant le point de départ. Donc, si une seconde règle était utilisée, elle devrait également utiliser la variable ?start. La valeur de ?start est initialisée à http://www.xulplanet.com/rdf/A. Vous noterez qu'il s'agit de la valeur de l'attribut ref qui est le sommet de départ souhaité dans le graphe RDF. Ainsi, la variable ?start devient le conteneur ou la variable de référence.

La balise content n'a plus d'autre utilité à ce stade, c'est-à-dire qu'elle n'ajoute rien d'autre au réseau d'information des résultats potentiels, donc le processus continue avec la condition suivante, le triplet triple.

Dans l'implémentation actuelle des gabarits, la description ci-dessus n'est pas tout à fait correcte. La graine est actuellement une variable interne attachée au conteneur, dans ce cas l'élément vbox, et la variable ?start est initialisée avec la valeur de ref qui suit. Mais il s'agit d'un détail mineur qui n'en rend pas moins compréhensibles les gabarits. Pour cette discussion, nous supposerons que nous disposons déjà de d'un unique résultat potentiel comme mentionné ci-dessus.

Après avoir examiné la balise content, le constructeur se déplace vers la condition suivante, le triple qui ressemble à ceci :

<triple subject="?start"
        predicate="http://www.xulplanet.com/rdf/relatedItem"
        object="?relateditem"/>

La condition triple est utilisée pour suivre les arcs ou les flèches dans un graphe RDF. L'attribut predicate spécifie les étiquettes des arcs à suivre. Dans le triplet utilisé ici, le prédicat est http://www.xulplanet.com/rdf/relatedItem, donc nous savons que le constructeur cherchera un arc ayant cette étiquette. Le constructeur peut suivre les arcs soit vers l'avant ou soit vers l'arrière, mais dans une seule direction par condition. Il détermine la direction à prendre en examinant quelles données sont connues et lesquelles ne le sont pas encore. Rappelez vous de la donnée dans le jeu de résultats potentiels :

(?start = http://www.xulplanet.com/rdf/A)

Il s'agit de la donnée représentant la graine créée par la condition content. Vous êtes capable de deviner que le constructeur va remplir la valeur de la variable ?start dans le sujet du triplet, ce qui donnera quelque chose comme ceci :

<triple subject="http://www.xulplanet.com/rdf/A"
        predicate="http://www.xulplanet.com/rdf/relatedItem"
        object="?relateditem"/>

En fait, le constructeur ne modifie pas le triplet, mais cette présentation vous explique clairement comment il procède. Le constructeur examine le sujet et l'objet du prédicat et tente de résoudre l'une ou l'autre variable en fonction des données connues. La variable ?start contient la valeur http://www.xulplanet.com/rdf/A, elle sera substituée par cette valeur. La variable ?relatedItem ne contient aucune valeur connue, elle sera laissée comme telle. Une fois que les variables ont été substituées, le constructeur peut lancer une requête sur le graphe RDF.

La requête cherchera toutes les arcs commençant sur le sommet http://www.xulplanet.com/rdf/A avec comme prédicat, ou arc, étiqueté http://www.xulplanet.com/rdf/relatedItem. Puisque la variable ?relatedItem n'est pas connue, le constructeur testera les sommets vers lesquels l'arc pointe et déterminera à partir de la source de données toutes les valeurs possibles. Dans une condition triple, le sujet est toujours l'extrémité initiale d'un arc, tandis que l'objet en est l'extrémité. Pour ce triplet, le constructeur suivra les arcs vers l'avant. Voici de nouveau le graphe RDF :

Graphe RDF

À partir du sommet A et en suivant les arcs 'relatedItem', nous voyons qu'il y a trois valeurs possibles pour la variable ?relatedItem, B, C et D. Ce sont des nouvelles données que le constructeur ajoute au graphe. Puisque ces trois valeurs ont été trouvées, le réseau d'information aura maintenant trois résultats potentiels :

(?start = http://www.xulplanet.com/rdf/A, ?relateditem = http://www.xulplanet.com/rdf/B)
(?start = http://www.xulplanet.com/rdf/A, ?relateditem = http://www.xulplanet.com/rdf/C)
(?start = http://www.xulplanet.com/rdf/A, ?relateditem = http://www.xulplanet.com/rdf/D)

Vous noterez que la variable ?start est répétée pour chaque résultat. En fait, le constructeur copie les données connues pour chaque nouveau résultat potentiel et ajoute les nouvelles données. Au niveau du processus d'exécution, ce n'est pas tout à fait vrai ; le constructeur maintient en réalité une seule copie des données similaires et utilise des structures de données qui apparaissent comme étant dupliquées.

Tout ceci peut vous paraître un peu confus, mais quelques exemples pratiques et spécifiques devraient vous éclairer.

Comme le triplet triple était la dernière condition, le constructeur continue à avancer pour entamer la phase de génération de contenu, en créant les correspondances pour les trois résultats potentiels.


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.