Forums : Template et RDF

Aller à la discussion :  Plus récente Plus ancienne

Aller à la page :  1 2 3

# Re: Modification sequence RDF

Envoyé par : bross

Date : 26/04/2006 16:43

l'arbre n'est pas modifie directement par les différents appels, mais le fichier Rdf l'est pas contre

# Re: Modification sequence RDF

Envoyé par : bross

Date : 26/04/2006 16:53

de plus, lorsque je relance l'appli, les modifications sont bien prises en compte, donc c'est assez bizarre ...

# Re: Modification sequence RDF

Envoyé par : alexp

Date : 26/04/2006 16:53

Le problème doit être ailleurs, ce n'est pas autour du refresh. D'après le code que tu nous montres, tu ne lies pas "ds" à ton arbre. Tu peux le faire avec : tree.database.AddDataSource(ds);

En effet dès lors que l'on utilise les xpcom RDF, il est préférable de mettre datasource="rdf:null" et de l'ajouter avec AddDataSource, ainsi chaque appel xpcom répercute directement les modifications.

# Re: Modification sequence RDF

Envoyé par : bross

Date : 27/04/2006 10:51

merci alexp, j'ai donc relie le "ds" grace à tree.database.AddDataSource(ds); maintenant le seul problème restant est que l'élément effacé reste toujours à l'ecran bien qu'il soit supprimé dans le fichier rdf, l'insertion marche par contre

# Re: Modification sequence RDF

Envoyé par : bross

Date : 27/04/2006 15:58

ça fonctionne correctement maintenant,il est donc bien préférable de mettre datasource="rdf:null", merci Alexp pour ton aide :-)

# Re: Modification sequence RDF

Envoyé par : Eric

Date : 27/04/2006 16:13

En fait, voici un exemple de manipulation d'un RDF associé à un template :

Comme l'a dit alexp, il faut dans le XUL positionner l'attribut datasource à "rdf:null".

Par exemple :

<tree id="_prtRfrnList"
       datasources="rdf:null"
       ref="urn:null"
       flags="dont-build-content">
...

Ensuite, il faut associer la datasource au tree et indiquer à partir de quelle référence le template doit être construit :

var tree = document.getElementById("myTree");
tree.database.AddDataSource(myDatasource);
tree.setAttribute("ref", aBaseReference);

Lorsque l'on modifie une datasource en relation avec un tree, pour éviter d'avoir un refresh du tree à chaque modification de la datasource, on peut utiliser les fonctions beginUpdateBatch et endUpdateBatch.

var tree = document.getElementById("myTree");	
tree.treeBoxObject.beginUpdateBatch();
//Modifier ici myDatasource
tree.treeBoxObject.endUpdateBatch();
tree.builder.rebuild();

Il faut donc appeler la fonction rebuild sur le builder et pas refresh.

La ligne tree.builder.rebuild() devrait être optionelle. D'après les docs, le template est reconstruit automatiquement lors d'une modification de la datasource ou de la référence (ref).

Parfois cependant, j'ai constaté que le rebuild n'avait pas lieu alors même que la datasource a été modifiée. N'ayant pas encore de réponse claire à la question je laisse la ligne tree.builder.rebuild().

# Re: Modification sequence RDF

Envoyé par : bross

Date : 27/04/2006 16:23

Merci pour tes explications Eric aussi :-)

# Re: [Resolu] Modification sequence RDF

Envoyé par : Vilya

Date : 27/04/2006 23:33

Je profite de ce fil maintenant que ton problème est résolu pour enchaîner sur le mien.

Avant de détailler je voulais savoir s'il était possible que tu donnes un lien vers toute ou partie de ton code fonctionnel. Au moins la structure de ton RDF ainsi que tes fonctions de chargement du contenu, de rafraichissement, de modification, ajout etc des données dans le RDF. Un peu ce que tu as déjà donné mais mis à jour :)

Ca me permettrait, sur un exemple concret, d'essayer de transposer. Pasque là je galère depuis 2 jours et je commence à saturer :/

Merci d'avance,

Vilya

# Re: [Resolu] Modification sequence RDF

Envoyé par : bross

Date : 28/04/2006 09:56

le rdf est celui poste plus haut,

voila le tree en question :

<tree id="treeUser" flex="1" width="200" height="200" onselect="doSelect(event);" datasources="rdf:null"
                        ref=""  seltype="single">
                      <treecols>
                        <treecol id="name" label="Classe de document / Utilisateur" primary="true" flex="1"/>
                        <treecol id="nid" label="nid" flex="1" disabled="true" hidden="true" primary="true"/>
                      </treecols>
                    
                      <template>
                         <rule>
                            <treechildren>
                               <treeitem uri="rdf:*" open="true">
                                  <treerow>
                                     <treecell label="rdf:http://www.site.com/rdf#name"/>
                                     <treecell label="rdf:http://www.site.com/rdf#nid" />
                                  </treerow>
                               </treeitem>
                            </treechildren>
                        </rule>
                      </template>
                   </tree>

voila mon js :

var classdoc = document.getElementById("labelClasse").value;
var ancienNom = document.getElementById("selectedLabel").value;
var nouveauNom = document.getElementById("nouveau-nom").value; 
var nid = document.getElementById("labelNid").value;
var rdfService = Components.classes["@mozilla.org/rdf/rdf-service;1"].
                  getService(Components.interfaces.nsIRDFService);
var prefixResource = "http://www.site.com/";
   	var ds = rdfService.GetDataSourceBlocking("file:///home/users.rdf");
	ds.QueryInterface(Components.interfaces.nsIRDFRemoteDataSource);
	var monTree = document.getElementById("treeUser");
	monTree.database.AddDataSource(ds);
	var subject = rdfService.GetResource(prefixResource + classdoc + "/" + ancienNom );
	var predicate = rdfService.GetResource(prefixResource + "rdf#name");
	var oldName = rdfService.GetLiteral(ancienNom);
	var newName = rdfService.GetLiteral(nouveauNom);
	var newSubject = rdfService.GetResource(prefixResource + classdoc + "/" + nouveauNom);
 	var predicate2 = rdfService.GetResource(prefixResource + "rdf#nid");
 	var newNid = rdfService.GetLiteral(nid);

	ds.Unassert(subject,predicate,oldName);
	ds.Unassert(subject,predicate2,newNid);
	
	ds.Assert(newSubject, predicate, newName, true);
	ds.Assert(newSubject, predicate2, newNid, true);
	var folderRes = rdfService.GetResource(prefixResource + classdoc);
	var container = Components.classes["@mozilla.org/rdf/container;1"].
                createInstance(Components.interfaces.nsIRDFContainer);
    
try {
  container.Init(ds, folderRes);
  container.AppendElement(newSubject);
  container.RemoveElement(subject,true);
}
catch (ex){}; 	
	ds.Flush();

De plus je charge mon arbre sur le onload maintenant Voila en esperant que ça puisse t'aider :-)

# Re: [Resolu] Modification sequence RDF

Envoyé par : Vilya

Date : 28/04/2006 10:00

Merci :) ça m'aidera surement à avancer c'est certain.

Aller à la page :  1 2 3

Il n'est plus possible de poster des messages dans ce forum.


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.