1.1 - Introduction

Écrit par Neil Deakin. Traduit par Laurent Jouanneau (18/08/2005), Julien Appert (02/08/2005).
Page originale : http://developer.mozilla.org/en/docs/XUL:Template_Guide:Introduction 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.

Les gabarits sont apparemment difficilement compréhensibles pour beaucoup de gens, et malheureusement, il y a beaucoup de choses à apprendre pour les utiliser : RDF, la syntaxe de requête, et des fonctionnalités XUL supplémentaires. Le manque de messages d'erreurs ou de journal d'enregistrement rend les choses doublement difficiles.

Pour commencer, un gabarit XUL est une sorte de production de blocs de contenu pour chaque résultat issue d'une requête ou assimilée. Les résultats d'une requêtes de base de données en sont une bonne analogie. Pour chaque résultat retourné par la requête, un contenu est généré. La syntaxe des gabarits permet pour différentes règles de générer différents contenus basés sur des critères particuliers, comme définir des valeurs d'attributs à partir des résultats retournés. D'autres systèmes appellent cela la liaison de données (NdT : databinding). Effectivement, les gabarits XUL sont le moyen pour XUL de faire de la liaison de données. Cependant, il y a deux restrictions avec un gabarit. Premièrement, vous ne pouvez générer du contenu qu'à partir des résultats d'une requête. Vous ne pouvez pas simplement obtenir une donnée isolée et l'assigner à un attribut, puisque les gabarits sont conçus pour des blocs de données répétitifs. Deuxièmement, vous pouvez utiliser uniquement les sources de données RDF. Ces restrictions devraient disparaître dans le futur.

En XUL, la source de données RDF est spécifiée en plaçant l'attribut datasources sur un élément. Quand l'interpréteur XUL voit un élément avec cet attribut, il instancie un constructeur de gabarit et l'attache à l'élément. Il s'attend à ce qu'il y ait un template à l'intérieur de l'élément. Le constructeur de gabarit charge la source de données, exécute la requête, et génère le contenu pour chaque résultat. Le contenu est inséré dans le contenu XUL comme si vous l'aviez placé vous même. Voici un exemple :

<vbox datasources="http://www.xulplanet.com/ds/sample.rdf">

Cet exemple spécifie la source de donnée : http://www.xulplanet.com/ds/sample.rdf.

Le constructeur de gabarit charge la source de données en utilisant le service RDF de la même façon que si vous aviez créé la source de données directement à travers le service RDF. La source de données est chargée via son URL. Certaines sources de données RDF sont fournies avec Mozilla (leurs URL commencent par rdf:). Elles sont cependant chargées comme n'importe quelle autre URL. Si la source de données est déjà chargée et se trouve déjà dans le cache, le constructeur de gabarit peut commencer le travail. Sinon, il attend jusqu'à ce que les données soient chargées. En réalité, ce n'est pas exactement vrai. Le service RDF commencent à charger la source de données en tâche de fond, et le constructeur de gabarit commence tout de même le processus de construction. Naturellement, tant qu'il n'y a pas encore de données, aucun résultat ne sera disponible, donc le constructeur ne génère rien.

Dés que des données commencent à arriver, le constructeur de gabarit scanne les informations pour voir si des résultats peuvent être créés. Si c'est le cas, il génère du contenu. Sinon, rien n'est généré pour l'instant. Une chose intéressante à noter est que, du fait de la nature du processus d'analyse du RDF, le constructeur génère les résultats et construit le contenu incrémentalement, pendant que les données arrivent. Bien sûr, comme les données arrivent trop vite depuis partir le réseau, vous ne vous en rendez pas vraiment compte. Si la source de données est déjà chargée, le constructeur génère le contenu en une seule étape, bien que cela ne soit pas entièrement vrai comme nous le verrons plus tard.

Le constructeur de gabarit peut aussi utiliser de multiple sources de données qui sont combinées entre elles en une seule source de données, comme si elles étaient à l'origine dans la même source de données. Un objet d'interface nsIRDFCompositeDataSource est utilisé pour cet usage. Vous pouvez avoir cette source de données composite dans un script en utilisant la propriété database de l'élément, si vous voulez ajouter ou enlever des sources de données.

Comme il a été mentionné, le constructeur de gabarit charge les sources de données en passant les URLs au service RDF. Cependant, une URL spéciale, rdf:null, est utilisée pour indiquer que vous n'avez pas de sources de données, ou alors indiquer une source de données vide. Une source de données composite sera tout de même créée, mais aucune source de données ne sera ajoutée. Cette utilisation peut servir à spécifier une source de données dynamiquement avec un script.

De plus, pour les fichiers XUL du chrome (comme les extensions), la source de données rdf:local-store est toujours incluse dans le composite. Le "stockage local" (NdT : local-store), est une source de données qui est habituellement utilisée pour stocker les informations d'états, comme les tailles des fenêtres, la liste des colonnes affichées dans un arbre, ou la liste des items ouverts dans un arbre. Vous pouvez effectuer une requête sur n'importe quelles données du stockage local depuis un gabarit, bien que cela soit rarement le cas.

Quand de multiples sources de données sont utilisées, le RDF est combiné comme si c'était une grande source de données. Cela signifie qu'une requête de gabarit peut récupérer les données de n'importe quelle de ces sources de données. Cette combinaison est souvent appelée "agrégation". Elle peut être une fonctionnalité intéressante et qui fonctionne indépendamment de la source de données. Par exemple, vous pourriez utiliser la source de données interne des marque-pages qui contient les marque-pages de l'utilisateur, et utiliser votre propre source de données pour ajouter des données personnalisées à ces marque-pages.

<vbox datasources="rdf:bookmarks http://www.xulplanet.com/ds/sample.rdf">

RDF

RDF est, en termes mathématiques, un graphe orienté étiqueté. Cela signifie que RDF est un graphe de sommets séparés par des arcs, et que chaque sommet et arc possèdent une étiquette. Puisqu'il s'agit d'un graphe, les arcs peuvent pointer vers n'importe quel endroit et les sommets peuvent avoir un certain nombre d'arcs pointant vers eux ou à partir d'eux. Et aussi parce que c'est un graphe, il n'y a pas de réel point de départ ou de sommet racine, donc vous pouvez partir de n'importe où. Dans l'image ci-dessous, vous pouvez voir que le sommet A, en haut, a des arcs pointant sur B, C et D. De même, C a un arc pointant sur D. Vous pouvez avoir des arcs pointant n'importe où, par exemple le sommet D peut avoir un arc pointant à son tour vers A. Pour parcourir le graphe, vous pouvez démarrer au sommet A et parcourir le graphe en suivant les arcs de B, C ou D. Ou bien vous pouvez démarrer sur B et aller jusqu'à A, puis aller jusqu'à C et D. Il n'existe pas d'obligation à suivre les arcs dans la direction qu'ils pointent ; vous pouvez aisément aller dans l'autre sens. Cette image a été générée à partir du validateur RDF du W3C, un bon endroit pour vérifier si votre RDF est valide.

graphe RDF

Les textes en rouge sont les étiquettes pour les arcs, nommées attributs. Dans cet exemple, toutes les arcs ont la même étiquette. D'ordinaire, ce n'est pas le cas. Les gabarits fournissent une manière de parcourir en utilisant uniquement les arcs avec des étiquettes spécifiques. Voici le RDF/XML adapté à ce graphe :

<?xml version="1.0"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
         xmlns:rel="http://www.xulplanet.com/rdf/">
  <rdf:Description rdf:about="http://www.xulplanet.com/rdf/A">
    <rel:relatedItem rdf:resource="http://www.xulplanet.com/rdf/B"/>
    <rel:relatedItem rdf:resource="http://www.xulplanet.com/rdf/C"/>
    <rel:relatedItem rdf:resource="http://www.xulplanet.com/rdf/D"/>
  </rdf:Description>
  <rdf:Description rdf:about="http://www.xulplanet.com/rdf/C">
    <rel:relatedItem rdf:resource="http://www.xulplanet.com/rdf/D"/>
  </rdf:Description>
</rdf:RDF>

Pour une requête sur un gabarit XUL, vous avez d'abord besoin de sélectionner un point de départ dans le graphe RDF. Une fois que vous avez sélectionné un point de départ, vous utilisez un nombre d'états qui indiquent où aller ensuite lorsque le graphe est parcouru. Finalement, vous conclurez avec un lot de sommets que vous considérez comme les terminus de votre requête. Ils deviennent vos résultats et du contenu sera généré pour chacun de ces résultats. Disons que vous partez de A. Vous pouvez naviguer jusqu'à B, C et D et générer trois blocs de sortie. Ou bien vous pouvez commencer sur D et remonter deux arcs. Cela produira deux résultats, A et B. Regardez le graphe pour voir si vous pouvez comprendre pourquoi deux résultats seront générés dans ce cas.

Dans la terminologie des gabarits XUL, le point de départ est appelé le conteneur ou le point de référence, et le terminus est appelé le membre. Il est nommé ainsi parce qu'il sert habituellement à rassembler la liste des membres, ou fils, d'un conteneur. Mais ce n'est pas nécessairement le cas. Tout peut être point de départ ou de fin.

En RDF, Les sommets sont identifiés par une chaîne de caractères. Il y a deux types de sommets en RDF, les ressources qui représentent en général des "choses", et les littéraux qui sont des valeurs telles que les noms des choses, les dates des choses, les tailles des choses, et ainsi de suite. Une valeur de littéral est, par exemple, le nom de la chose, tel que "Fred". Une valeur de ressource est un URI inventé pour votre propre donnée RDF. Nous utiliserons l'URI des sommets ressources dans un gabarit. Dans l'image, les URIs des ressource sont les étiquettes bleues de chaque sommet. Il n'y a pas de littéraux dans cet exemple, mais nous les verrons plus tard.

Disons que nous voulons que le point de départ soit A, sur l'exemple graphique ci-dessus. L'URI de A (http://www.xulplanet.com/rdf/A) est la référence du point de départ. Dans un gabarit XUL, vous spécifiez le point de départ en utilisant l'attribut ref. Voici un exemple :

<vbox datasources="http://www.xulplanet.com/ds/sample.rdf"
      ref="http://www.xulplanet.com/rdf/A" flex="1">

Il indique que nous désirons construire un gabarit XUL en utilisant le point de référence possédant l'URI http://www.xulplanet.com/rdf/A.


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.