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.
Pour ce faire :
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).
Les moyens de modifier ou recharger une source de données RDF dépendent :
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();
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.
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.
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).
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.