Forums : Template et RDF

Aller à la discussion :  Plus récente Plus ancienne

# tree hierarchisé et sqlite template

Envoyé par : obsidienne

Date : 16/01/2008 10:32

Bonjour,

J'ai un petit souci sur le nouveau système template, je m'explique.

J'ai une base de données sqlite contenant une table operations avec une colonne date et une colonne label.

Je souhaite affiché ces données dans un arbre hiérarchisé par date. J'arrive à afficher les données dans l'arbre mais elles ne sont pas hiérarchisées. Pourtant j'ai suivi le tutorial présent sur mdc concernant la génération d'un arbre hiérarchisé par template.

Je pense que le problème vient de la nature de la données, un XML et un RDF sont des données naturellement hiérarchisées, pas la réponse d'une requête SQL. Donc le template ne peut pas créer automatiquement les treechildren.

Quelqu'un a une solution, ou un lien vers un bug ?

Merci

# Re: tree hierarchisé et sqlite template

Envoyé par : ilhooq

Date : 25/01/2008 20:38

C'est peut être naïf comme réponse mais as-tu essayé une requête du type : "SELECT label FROM operations ORDER BY date" ?

Sinon j'ai une question car je pédale quelque peu sur la manière de rafraîchir une datasource SQLITE sur un tree généré par un template (selon cette méthode ) après avoir fait un update ou une suppression de ligne :

exemple :

DBConn.executeSimpleSQL("DELETE FROM factures WHERE id="+row.id );
mytree.builder.rebuild();  //mais le tree ne se rafraîchit pas

J'ai recherché pendant des heures mais je n'ai rien trouvé.

( j'utilise Xulrunner 1.9b3pre.en-US )

# Re: tree hierarchisé et sqlite template

Envoyé par : ilhooq

Date : 29/01/2008 23:32

Je me répond à moi-même et pour tous ceux qui buttent sur ce problème:

L'erreur est dûe à un vérou sur la table qui bloque toute modification voir doc

Exemple :

//retourne une ligne
function fetchRow (sql)
{
   var row = {};
   var statement = DBConn.createStatement(sql);
   statement.executeStep();

   for (var i=0; i < statement.numEntries; i++) {

       row[statement.getColumnName(i)] =  statement.getString(i) ;
   }

   statement.reset(); //Important! : dévérouille la table

   return row;
}

//efface une ligne
function deleteRow()
{
    var row = fetchRow("SELECT * FROM factures LIMIT 1 OFFSET "+Mytree.currentIndex);
 
    DBConn.executeSimpleSQL("DELETE FROM factures WHERE id="+row.id );
	
    Mytree.builder.rebuild();

}

# Re: tree hierarchisé et sqlite template

Envoyé par : obs

Date : 01/04/2008 16:29

Salut à tous,

Je ne trouve pas de solution. J'ai regarder les exemples de M. Finkle, lu le nouveau tuto sur developer.mozilla.org. Impossible de trouver une méthode pour mon problème.

Le résultat d'une requête SQLite n'est pas hiérarchisé contrairement à du XML ou du RDF. Donc pas de génération récursive.

Je n'ai pas d'évenement auquel me rattacher pour effectuer des actions lors de l'itération.

Une idée ?

# [Résolu]tree hierarchisé et sqlite template

Envoyé par : obs

Date : 09/04/2008 10:45

Pour info,

J'ai discuté hier avec laurentj, et il m'a confirmé qu'on ne pouvait pas à l'heure actuelle faire une hiérarchisation dans les templates sqlite. Ca demanderai une modification du code et vu que gecko 1.9 est freeze ce n'est pas pour tout de suite.

La solution: faire un custom tree qui se débrouillera pour faire la hiérarchisation.

A+ et merci laurentj

# Re: tree hierarchisé et sqlite template

Envoyé par : nab

Date : 26/10/2008 15:37

Bonjour à tous,

je ne sais pas si la réponse de laurentj concerne également mon problème que j'expose ici. En effet je souhaite construire un arbre récursif à partir d'une requête sql sur une table structurée ainsi :

CREATE TABLE `categories` (
`id` INTEGER NOT NULL AUTO_INCREMENT ,
`id_categories` INTEGER NOT NULL ,
`nom` VARCHAR(255) NOT NULL ,
PRIMARY KEY (`id`)
);
INSERT INTO categories VALUES ('1', '0', 'CategortieParent');
INSERT INTO categories VALUES ('2', '1', 'CategortieEnfant1');
INSERT INTO categories VALUES ('3', '1', 'CategortieEnfant2');
INSERT INTO categories VALUES ('4', '1', 'CategortieEnfant3');
ALTER TABLE `categories` 
ADD FOREIGN KEY (id_categories) 
REFERENCES `categories` (`id`);

Où id est parent de id_categories

J'arrive à créer le premier niveau de l'arbre mais je ne vois pas comment mettre à jour l'arbre en y insérant les données enfants.

<tree id="tree_categorie" flex="1"
datasources="mabase.sqlite"
querytype="storage" ref="*"
persist="value"
hidecolumnpicker="false">
<treecols>
<treecol 
id="categorie" 
flex="1" 
label="Catégories" 
primary="true" />
</treecols>
<template>
<query>
select * from categories WHERE id_categorie = 0
</query>
<action>
<treechildren>
  <treeitem  uri="?" container="true" open="false">
    <treerow>
      <!-- CategorieParent -->
      <treecell label="?nom;" value="?id"/> 
    </treerow>
      <treechildren>
	<treeitem>
	  <treerow>
	    <!-- CategortieEnfant1 -->
	    <treecell label="......" value="..." /> 
	  </treerow>
	</treeitem>
	<treeitem>
	  <treerow>
	    <!-- CategortieEnfant2 -->
	    <treecell label="......" value="..." /> 
	  </treerow>
	</treeitem>
	<treeitem>
	 <treerow>
	  <!-- CategortieEnfant3 -->
	  <treecell label="......" value="..." /> 
	 </treerow>
	</treeitem>
      </treechildren>
  </treeitem>
</treechildren>
</action>
</template>
</tree>

L'idée c'est de récupérer les sous catégories ici représenté par ..... ayant pour id_cateogorie l'id de la catégorie parent.

Je remercie d'avance les personnes qui pourront me mettre sur la piste.

A noter que je ne souhaite pas le faire intervenir php mais uniquement xul et javascript.

Nab

# Re: tree hierarchisé et sqlite template

Envoyé par : thibaud74

Date : 15/09/2009 14:39

Dommage que tu n'aies pas eu de réponse... As-tu trouvé la solution à ton problème ? Peux-tu nous la faire partager ? Merci, Thibaud.

# Re: tree hierarchisé et sqlite template

Envoyé par : obs

Date : 15/09/2009 14:57

Il n'y a pas, à l'heure actuelle, de méthode pour hiérarchisé un arbre créé par template SQLite.

C'est clairement l'élément le plus pénalisant des templates SQLite.

# Re: tree hierarchisé et sqlite template

Envoyé par : nab

Date : 15/09/2009 15:03

j'ai généré le rdf avec php

Nab

# Re: tree hierarchisé et sqlite template

Envoyé par : nab

Date : 17/09/2009 12:15

Salut Thibaud,

depuis ton post et pour des besoins personnels je me suis à nouveau penché sur le problème. Je pense avoir trouvé une piste pour ne pas dire une solution car je ne suis pas du tout un spécialiste des langages xul et javascript. Cela dit ça fonctionne même si la méthode employée est sans doute perfectible.

1°) Structure de la base sqlite

CREATE TABLE "matable" (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL , id_parent INTEGER NOT NULL , titre VARCHAR NOT NULL)

id_parent = 0 si c'est la catégorie mère. sinon id_parent = id de la catégorie mère

2°) Contenu du fichier xul affichant les catégories mères (id_parent = 0)

<hbox flex="1"><groupbox id="group_categories_parents">

	<menulist id="menulist_textes" selected="-1"
		onload="afficheParents();" oncommand="afficheEnfants(selectedItem.value, '0', document.getElementById('tree_categories_enfants'))">
		<menupopup id="menupopup_categories_parents" flex="1"></menupopup>
	</menulist>
</groupbox>
<groupbox id="group_categories_enfants" flex="1" hidden="true">
	<tree id="tree_categories_enfants" flex="1" hidecolumnpicker="true">
		<treecols>
			<treecol id="titre" flex="1" label="Arbre des categories" primary="true" />
		</treecols>
	</tree>
</groupbox>

</hbox>

3°) Le code javascript

  • Code pour se connecter à la base et lire les données

var myDBFile = "chemin/vers/la/base/sqlite.sqlite"; var $sqlite = {

storageService : [],
mDBConn : [],
_initService : function(file) {
	////remplacer par l'id de l'extension
	var MY_ID = "monextensionxul.fr";
	var em = Components.classes["mozilla.org/extensions/manager;1"].
	         getService(Components.interfaces.nsIExtensionManager);
	var db = em.getInstallLocation(MY_ID).getItemFile(MY_ID, file);
	db.append(file.path);
	this.storageService[file] = Components.classes["mozilla.org/storage/service;1"]
			.getService(Components.interfaces.mozIStorageService);
	this.mDBConn[file] = (this.storageService[file]).openDatabase(db);
},
select : function(file, sql) {
	if (this.storageService[file] == undefined) {
		this._initService(file);
	}
	var ourTransaction = false;
	if ((this.mDBConn[file]).transactionInProgress) {
		ourTransaction = true;
		(this.mDBConn[file])
				.beginTransactionAs((this.mDBConn[file]).TRANSACTION_DEFERRED);
	}
	var statement = (this.mDBConn[file]).createStatement(sql);
	try {
		var dataset = new Array;
		while (statement.executeStep()) {
			var row = new Array;
			for ( var i = 0; i < statement.columnCount; i++) {
				row[statement.getColumnName(i)] = statement.getUTF8String(i);
			}
			dataset.push(row);
		}
	}
	finally {
		statement.reset();
	}
	if (ourTransaction) {
		(this.mDBConn[file]).commitTransaction();
	}
	return dataset;
}

};

  • fonction affichesParents() qui affiche les éléments parents dans le menupopop lorsque le menu se charge

function afficheParents() {

var requete = "SELECT * FROM matable WHERE id_parent ='0' ORDER BY id ASC";
var row = $sqlite.select(myDBFile, requete);
var categories_parents = document.getElementById("menupopup_categories_parents");
for ( var i = 0; i < row.length; i++) {
	var menuitem_titre = document.createElement("menuitem");
	menuitem_titre.setAttribute("label", row[i]['titre']);
	menuitem_titre.setAttribute("value", row[i]['id']);
	categories_parents.appendChild(menuitem_titre);
}

}

  • fonction afficheEnfants(id, parent, el) qui affiche les éléments enfants lorsque l'on sélectionne une catégorie du menupopup

function afficheEnfants(id, parent, el) {

document.getElementById("group_categories_enfants").hidden = false;
if (parent == '0')
{
	var current_treechildren = el.getElementsByTagName("treechildren");
	if (current_treechildren.length > 0){
		for (var i = 0; i < current_treechildren.length; i++) {
			el.removeChild(current_treechildren[i]);
		}
	}	
}
var requete = "SELECT * FROM matable WHERE id_parent ='"+id+"' ORDER BY id ASC";
var row = $sqlite.select(myDBFile, requete);
var treechildren = document.createElement("treechildren");
el.appendChild(treechildren);
if (row.length != "0"){
	el.setAttribute("container", "true");
}
else{
	el.setAttribute("container", "false");
}
for ( var i = 0; i < row.length; i++) {
	var treeitem_categorie = document.createElement("treeitem");
	treeitem_categorie.setAttribute("id", "treeitem_categorie_"+row[i]['id']);
	treechildren.appendChild(treeitem_categorie);
	
	var treerow_categorie = document.createElement("treerow");
	treeitem_categorie.setAttribute("container", "true");
	treeitem_categorie.appendChild(treerow_categorie);
	
	var treecell_categorie = document.createElement("treecell");
	treecell_categorie.setAttribute("label", row[i]['titre']);
	treecell_categorie.setAttribute("id", "treecell_categorie_"+row[i]['id']);
	treecell_categorie.setAttribute("value", row[i]['id']);
	treerow_categorie.appendChild(treecell_categorie);
	
	afficheEnfants(row[i]['id'], row[i]['id_parent'], treeitem_categorie);
}

}

J'espère que cela pourra t'aider.

Nab

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.