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
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 )
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(); }
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 ?
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
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
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.
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.
Envoyé par : nab
Date : 15/09/2009 15:03
j'ai généré le rdf avec php
Nab
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
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; }
};
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); }
}
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.