3.1 - Règles multiples

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.

Tous les exemples présentés jusqu'ici utilisaient une seule règle. Le constructeur est capable de supporter des règles multiples en ajoutant d'autres éléments rule après le premier. Il existe trois raisons principales pour utiliser des règles multiples. Premièrement, pour générer un contenu différent lorsque des critères différents sont rencontrés, deuxièmement, pour appliquer un contenu différent aux éléments fils créés lors du traitement récursif du gabarit, et troisièmement, simplement pour générer des résultats supplémentaires à ajouter avec la première règle. Nous verrons des exemples de chacune de ces techniques. Un gabarit à règles multiples ressemble à ceci :

<hbox id="photosList" datasources="template-guide-photos3.rdf"
      ref="http://www.xulplanet.com/rdf/myphotos">
  <template>
    <rule>
      <conditions>
        <content uri="?start"/>
        <member container="?start" child="?photo"/>
        <triple subject="?photo"
                predicate="http://purl.org/dc/elements/1.1/title"
                object="Canal"/>
      </conditions>
      <action>
        <button uri="?photo" image="?photo" label="Voir" orient="vertical"/>
      </action>
    </rule>
    <rule>
      <conditions>
        <content uri="?start"/>
        <member container="?start" child="?photo"/>
      </conditions>
      <action>
        <image uri="?photo" src="?photo"/>
      </action>
    </rule>
  </template>
</hbox>

Ce gabarit contient deux règles. La première contient un triple qui détermine simplement la photo dont le titre est Canal. La seconde règle ne contient pas de triplet et trouvera l'ensemble des trois photos. Si la première règle était employée seule, un seul résultat serait trouvé. Si la seconde règle était employée seule, trois résultats seraient trouvés. Utilisés ensemble dans cet exemple, les résultats sont combinés et seuls trois résultats sont affichés. Cependant, vous aurez noté que l'unique photo qui correspond à la première règle apparaît différemment des autres. En fait, le contenu pour cette photo émanant de la première règle est un bouton, tandis que le contenu pour les autres photos émanant de la seconde règle fournit les images normales.

Cet exemple vous montre le premier style d'utilisation de règles multiples, pour générer du contenu différent selon les circonstances. Cette technique très utile est couramment employée puisqu'elle permet l'affichage de contenu plus complexe. Par exemple, la barre d'outils des Marque-pages de Firefox affiche les dossiers de manière différente qu'un marque-page normal. En réalité, il y a plus de deux règles utilisées dans les Marque-pages, puisqu'il y a aussi les séparateurs, les sous-menus et Marque-pages dynamiques.

Comment sont analysées les règles multiples ?

Nous savons déjà qu'une règle génère une série de résultats probablement filtrés selon les conditions de la règle. Il n'y a pas de mystère sur la manière de procéder du constructeur de gabarits avec des règles multiples. Il prend simplement les résultats générés par la première règle, ajoute les résultats de la seconde règle, ajoute les résultats de la troisième règle, et ainsi de suite. Voici les résultats qui seraient générés par l'application de la première règle ci-dessus, avant l'application de toutes liaisons :

(?start = http://www.xulplanet.com/rdf/myphotos,
 ?photo = http://www.xulplanet.com/ndeakin/images/t/canal.jpg,

Ensuite, le constructeur ajoute les trois résultats générés par la seconde règle :

(?start = http://www.xulplanet.com/rdf/myphotos,
 ?photo = http://www.xulplanet.com/ndeakin/images/t/canal.jpg,
(?start = http://www.xulplanet.com/rdf/myphotos,
 ?photo = http://www.xulplanet.com/ndeakin/images/t/palace.jpg)
(?start = http://www.xulplanet.com/rdf/myphotos,
 ?photo = http://www.xulplanet.com/ndeakin/images/t/canal.jpg)
(?start = http://www.xulplanet.com/rdf/myphotos,
 ?photo = http://www.xulplanet.com/ndeakin/images/t/obelisk.jpg)

Donc quatre résultats possibles sont disponibles, un provenant de la première règle et trois autres de la seconde règle. Toutefois, l'exemple ne montre seulement que trois résultats générés. Qu'est-il arrivé au quatrième ?

C'est ici où rentre en jeu l'aspect le plus utile des règles multiples. Notez que deux des résultats ci-dessus représentent en fait la même photo (canal.jpg). Le constructeur de gabarits enlève tous les items dupliqués avant de générer le contenu. Il conserve la première correspondance trouvée à une règle. Ainsi, le résultat canal.jpg généré par la seconde règle est enlevé, puisqu'une précédente règle (la première) a déjà généré une correspondance pour ce résultat.

Une distinction importante doit être faite sur le fait que la détermination des résultats dupliqués se base uniquement sur la variable membre, dans ce cas la variable ?photo. Elle ne se préoccupe pas que d'autres variables aient ou non la même valeur.

Si vous examinez l'exemple de nouveau, vous noterez que la photo canal qui correspond à la première règle est apparue entre les deux autres photos, alors même que ces autres photos ont été générées dans la seconde règle. Le constructeur n'a pas disposé les résultats de la première règle avant ceux de la seconde règle. En fait, l'ordre est le même que les exemples utilisant une règle unique. Comparez l'exemple à règles multiples avec un exemple ancien qui utilisait une seule règle. Dans les deux cas, les photos apparaissent dans le même ordre.

La raison est que le constructeur a détecté que les photos font partie d'un Seq RDF dans la source de données et qu'il les arrange dans le même ordre qu'elles apparaissent dans le Seq. Ceci et d'autres tris automatisés réalisés par le constructeur sont des processus particulièrement compliqués qui seront discutés en détail ultérieurement.

Règles multiples utilisant la syntaxe simplifiée

Vous pouvez également utiliser des règles multiples avec la syntaxe de règles simplifiées. Voici le même exemple que précédemment, ré-écrit en utilisant la syntaxe simplifiée :

<hbox id="photosList" datasources="template-guide-photos3.rdf"
      ref="http://www.xulplanet.com/rdf/myphotos"
      xmlns:dc="http://purl.org/dc/elements/1.1/">
  <template>
    <rule dc:title="Canal">
      <button uri="rdf:*" image="rdf:*" label="Voir" orient="vertical"/>
    </rule>
    <rule>
      <image uri="rdf:*" src="rdf:*"/>
    </rule>
  </template>
</hbox>

Pour l'utilisateur, le résultat entre cet exemple et l'exemple précédent est le même. Vous pouvez également mélanger des règles simplifiées et étendues dans un même gabarit, bien qu'il soit préférable de conserver le même style dans toutes vos règles pour une meilleure cohérence.

Cependant, si vous devez utiliser de nombreuses règles, sachez que le constructeur de gabarits est plus efficace lorsque les règles multiples utilisent la syntaxe de règles simplifiées. La raison en est que toutes les règles simplifiées vont parcourir les mêmes données, habituellement les fils d'un conteneur RDF. Ainsi, le constructeur ne réalise cette étape qu'une seule fois et il n'a plus qu'à filtrer les données pour chaque règle.

Lorsque vous utilisez la syntaxe de règles étendues, la manière dont la navigation s'effectue dans le graphe peut être différente pour chaque règle, donc aucune optimisation ne peut être faite. Le constructeur doit traiter chaque condition pour toutes les règles. Si, par exemple, vous aviez six règles, chacune avec une condition member, le constructeur devrait construire les fils six fois. Vous ne noterez probablement aucune différence pour de petites quantités de données telles que l'exemple des photos que nous avons créé, mais la baisse de performance sera visible pour de grandes quantités de données. Donc, il est conseillé d'utiliser la syntaxe de règles simplifiées à chaque fois que c'est possible.

Bien entendu, cela n'a aucune incidence si vous n'utilisez qu'une seule règle. Et en parlant de l'utilisation d'une règle unique, sachez que la syntaxe simplifiée permet un léger raccourci. Vous pouvez enlever l'élément rule et placer les conditions de la règle directement sur l'élément template. Il n'y a aucun gain de performance, mais l'écriture est plus courte.

<hbox id="photosList" datasources="template-guide-photos3.rdf"
      ref="http://www.xulplanet.com/rdf/myphotos"
      xmlns:dc="http://purl.org/dc/elements/1.1/">
  <template dc:title="Canal">
      <button uri="rdf:*" image="rdf:*" label="Voir" orient="vertical"/>
  </template>
</hbox>

Cet exemple montre simplement une seule photo puisque la condition utilisée exclut les deux autres photos.

Notez que dans ce raccourci, les conditions sont placées directement sur l'élément template.


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.