Attention : Le contenu de ces pages n'a pas été mis à jour depuis longtemps. Il est probablement obsolète pour Firefox 4.0/Gecko 4.0 et supérieur. Pour du contenu plus récent, allez consulter developer.mozilla.org.

Source de donnees rdf

Principes

Les composants graphiques XUL peuvent avoir leur contenu stocké, non pas directement dans le fichier XUL, mais dans un fichier externe au format RDF.

Cela a deux avantages, surtout pour les composants de type tree,listbox,etc.

  1. Cela évite d'avoir des fichiers XUL surchargés : ils ne contiennent que la structure de l'interface, pas les données,
  2. Il est possible de modifier les données en rechargeant la source de données RDF ou en spécifiant une autre source de données.

Pour ce faire :

  1. On renseigne les attributs datasources et ref qui indiquent respectivement l'emplacement du fichier source (fichier RDF) et la donnée de ce fichier sur laquelle la lecture devra commencer,
  2. On définit un gabarit (template) qui indique quelles informations du fichier source RDF seront utilisées, ainsi que les balises et les attributs qui seront employés pour afficher ces informations (balises template et consœurs).

Voir le tutoriel de xulplanet, chapitre 6, pour des exemples d'utilisation, ainsi la page Template RDF.

S'il s'agit d'une application web, on ne peut spécifier que des sources de données distantes dans l'attribut datasources. Pour une application installée en local, on peut spécifier des sources de données locales (enregistrées sur le disque) ou distantes (provenant d'un site web).

Modifier ou recharger une source de données RDF

Les moyens de modifier ou recharger une source de données RDF dépendent :

  • de la version de Mozilla/Firefox,
  • du fait que l'application XUL est distante (application web), distante signée ou locale,
  • de la provenance de la source de données (locale ou distante).

Rafraîchissement (refresh)

Pour rafraîchir l'affichage d'un conteneur (ici, un conteneur d'id 'conteneur_de_template'), vous pouvez utiliser le code suivant :

 var conteneur = document.getElementById("conteneur_de_template");
 conteneur.builder.refresh();

Modifier l'attribut datasources

Pour les versions de Mozilla >= 1.7a ou Firefox >= 0.8, il suffit de modifier le contenu de l'attribut datasources pour changer la source de données. Pour les versions plus anciennes, il faut passer par l'utilisation des objets XpCom.

 // exemple de rechargement d'une source de donnée
 monTree = document.getElementById('leTree');
 source= monTree.getAttribute('datasources');
 monTree.setAttribute('datasources','');
 monTree.setAttribute('datasources',source);

Il est possible de procéder de la même façon pour les applications locales ou distantes.

Forcer la mise à jour (Lapinator 04/05/2005)

Il y a un petit problème de cache dans Firefox 1.0. Il semble que modifier l'attribut datasources n'est pas suffisant pour prendre en compte une nouvelle version d'une même source de donnée distante, le RDF résultant étant mis en cache. (Voir la discussion sur le forum).

L'idée est donc de forcer la mise à jour de la datasource en modifiant son l'adresse. Dans ce cas en ajoutant un paramètre inutile à l'URL d'accès à la source RDF.

Dans le cas de l'exemple ldap menupopup décrit en annexe, cela donne :

   <script type="text/javascript">
      function updateLdap(m) {
  var update=Math.random();
  var dsUrl="ldap_rdf.php?update="+update;
  m.setAttribute('datasources',dsUrl);
 }
   </script>

   <menupopup datasources="ldap_rdf.php" ref="[[urn:ldap:people]]"
          onpopupshowing="updateLdap(this)">

L'événement onpopupshowing est appelé avant que le menupopup ne soit ouvert. C'est à ce moment que l'on assure la mise à jour de la source.

Si l'élément mis à jour est l'élément sélectionné, la valeur affichée ne sera répercutée que dans la liste.

Utiliser les objets XpCom

Pour utiliser les objets XpCom, il faut que l'application soit installée en local, ou qu'elle soit distante mais signée. Dans le cas contraire, il est nécessaire d'activer les privilèges dans Mozilla (applications web/Activer les privilèges).

Exemples

Pour charger un contenu RDF dans un arbre (tree) :

  function loadTree(treeId, dsUrl)
  {
    try {
      netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
      var RDF = Components.classes["@mozilla.org/rdf/rdf-service;1"].getService(Components.interfaces.nsIRDFService);
      datasource = RDF.GetDataSource(dsUrl);
      var tree = document.getElementById(treeId);
      var remote = datasource.QueryInterface(Components.interfaces.nsIRDFRemoteDataSource);
      // Mozilla utilise un cache pour les sources de données. Si la source de données
      // est déja chargée (propriété loaded à true), on peut l'ajouter directement
      // à la base de données de notre élément et on lui demande de se reconstruire.
      // Si la source de données n'est pas dans le cache on lui attache d'abord un objet
      // Observer pour reconstruire l'élément quand la source de donnée sera complétement
      // chargée (mode asynchrone).
      if (remote.loaded)
      {
        tree.database.AddDataSource(datasource);
        tree.builder.rebuild();
      }
        else
      {
        tree.database.AddDataSource(datasource);
      }
    }
    catch(e) {
      alert(e);
    }
  }

Pour recharger une source de données :

 function reloadTree(treeId)
  {
    try {
      netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
      datasource.QueryInterface(Components.interfaces.nsIRDFRemoteDataSource).Refresh(false);
      tree = document.getElementById(treeId);
    }
    catch(e) {
      alert(e);
    }
  }

Pour connecter des fonctions à des événements sur le chargement de la source de données :

  var Observer = {
    onBeginLoad : function(sink){},
    onInterrupt : function(sink){}, // Lancé si chargement de la source de données est intérompue
    onResume : function(sink){},
    onError : function(sink,status,msg){},
    onEndLoad : function(sink){
      sink.removeXMLSinkObserver(this);
      sink.QueryInterface(Components.interfaces.nsIRDFDataSource);
    }
  };
  //Pour brancher l'Observeur sur la source de données
  datasource.QueryInterface(Components.interfaces.nsIRDFXMLSink).addXMLSinkObserver(Observer);

Rubrique format RDF


Copyright © 2003-2013 association xulfr, 2013-2016 Laurent Jouanneau - Informations légales.

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.