3.2 - Exemple de 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.

L'utilisation la plus commune des règles multiples est l'application de corps d'action différents selon les résultats. Souvent, cela concerne un résultat en particulier qui a une propriété que les autres n'ont pas. Par exemple, dans un exemple précédent, une des photos avait une description mais pas les autres. Dans ce cas, vous pouvez vouloir afficher la photo avec la description d'une manière différente. C'est utile aussi si vous souhaitez masquer du contenu qui accompagne l'affichage d'une description.

L'exemple suivant vous en montre une utilisation :

<vbox id="photosList" align="start" datasources="template-guide-photos5.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="?title"/>
        <triple subject="?photo"
                predicate="http://purl.org/dc/elements/1.1/description"
                object="?description"/>
        <triple subject="?photo"
                predicate="http://purl.org/dc/elements/1.1/date"
                object="?date"/>
      </conditions>
      <action>
        <hbox uri="?photo" class="box-padded">
          <vbox>
            <label value="?title"/>
            <image src="?photo"/>
          </vbox>
          <groupbox>
            <caption label="Détails de la photo"/>
            <label value="?description"/>
            <label value="Date : ?date"/>
          </groupbox>
        </hbox>
      </action>
    </rule>
    <rule>
      <conditions>
        <content uri="?start"/>
        <member container="?start" child="?photo"/>
        <triple subject="?photo"
                predicate="http://purl.org/dc/elements/1.1/title"
                object="?phototitle"/>
      </conditions>
      <action>
        <vbox uri="?photo" class="box-padded">
          <label value="?phototitle"/>
          <image src="?photo"/>
        </vbox>
      </action>
    </rule>
  </template>
</vbox>

Dans cet exemple, la première règle n'accepte que les photos ayant un titre, une description et une date dans leurs propriétés. La seconde règle n'accepte que les photos ayant un titre. Si une photo n'a pas de titre, elle ne correspondra à aucune règle. Dans les données de l'exemple, seule la première photo dispose de toutes les propriétés lui permettant de correspondre à la première règle. La seconde photo dispose d'un titre et d'une date mais n'a pas de description, tandis que la troisième photo n'a qu'un titre. La première photo va correspondre aux deux règles alors que les deux autres photos ne vont correspondre qu'à la seconde règle. Les résultats obtenus seront les suivants :

(?start = http://www.xulplanet.com/rdf/myphotos,
 ?photo = http://www.xulplanet.com/ndeakin/images/t/palace.jpg,
 ?title = Le palais vu de dessus
 ?description = Prise de vue à partir du sommet de la tour en regardant vers l'Est du palais des Doges,
 ?date = 2005-04-30T14:55:00+01.00)
(?start = http://www.xulplanet.com/rdf/myphotos,
 ?photo = http://www.xulplanet.com/ndeakin/images/t/palace.jpg,
 ?phototitle = Le palais vu de dessus)
(?start = http://www.xulplanet.com/rdf/myphotos,
 ?photo = http://www.xulplanet.com/ndeakin/images/t/canal.jpg,
 ?phototitle = Canal)
(?start = http://www.xulplanet.com/rdf/myphotos,
 ?photo = http://www.xulplanet.com/ndeakin/images/t/obelisk.jpg,
 ?phototitle = Obélisque)

Le premier résultat correspond à la première règle et contient les variables des deux prédicats supplémentaires examinés dans les conditions. Puisque la seconde règle ne fait pas référence à ces variables, celles-ci ne seront pas remplies. Bien que la photo canal dispose d'une date, la seconde règle ne l'utilise pas, donc vous ne pouvez pas faire référence à la variable ?date dans cette règle. Toutefois, vous pourriez utiliser une liaison binding pour obtenir la date sans passer par les conditions de correspondance. Bien entendu, le nom de la variable n'a pas à être ?date dans la seconde règle.

Vous aurez noté que la variable ?title est utilisée dans la première règle tandis que la variable ?phototitle est utilisée dans la seconde règle, en dépit du fait qu'elles stockent toutes deux le titre du prédicat. Il n'y a pas de raison à cela -- cette utilisation dans cet exemple montre qu'il n'y a aucune connexion entre les variables employées dans les deux règles. Vous pouvez utiliser des variables différentes si cela apporte un sens dans le contexte du gabarit ou des données, bien que dans cet exemple, il serait plus raisonnable que les variables aient le même nom.

La seule exception est que les variables conteneur et membre (celles dont il est fait référence dans les attributs uri) doivent être les mêmes dans toutes les règles. Dans cet exemple, la variable conteneur est ?start et la variable membre est ?photo. Si des variables différentes étaient utilisées, les règles ne fonctionneraient pas correctement. La raison provient de la manière dont le constructeur traite les données.

En regardant une nouvelle fois les résultats listés ci-dessus, vous apercevez la photo du palais deux fois, donc le second résultat sera enlevé pour ne laisser que trois correspondances. Bien que le constructeur génère en réalité plusieurs correspondances pour une ressource, le plus souvent, il n'est pas nécessaire d'être informé de ce genre de détail lors de la création de gabarits. Il est généralement suffisant de considérer que les premières règles filtrent les résultats à l'instar d'une architecture if-else dans un langage de programmation. Si la dernière règle n'a aucune condition spécifique (par exemple, une simple règle sans attributs sur l'élément rule), elle pourrait être considérée comme étant le bloc final else correspondant à toutes les données.

Puisque les résultats générés par les premières règles supplantent ceux des dernières règles, vous devez vous assurer que celles-ci soient placées dans le bon ordre. Les règles doivent être classées de la plus spécifique à la moins spécifique. Si vous inversez l'ordre de deux règles dans l'exemple précédent, les trois photos seront toujours affichées, mais la règle plus complète qui affichait les détails d'une image sera écartée parce que l'autre règle a une priorité plus grande. La conséquence sera que les informations de la photo du palais ne s'affichent plus.


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.