IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bibliothèques & Frameworks Discussion :

TreeStoreModel : Query sur un store "Inversé"


Sujet :

Bibliothèques & Frameworks

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Juin 2007
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 122
    Par défaut TreeStoreModel : Query sur un store "Inversé"
    Salut ( à tous les courageux qui ne sont pas sur la plage )
    Dans une phase précédente, j'ai affiché une arborescence dans un Tree qui avait pour model un TreeStoreModel lui-même alimenté par un query sur un jsonStore :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var jsonRepertoire = new dojo.data.ItemFileReadStore({
        url: 'javascript/jsonreps.json'
    });
    Le store avait une structure classique ( description descendante parent -> enfants ); cette structure n'étant pas la plus simple à générer, je me suis orienté vers la structure inverse ( description ascendante parent <- enfant ), ce qui me donne un fichier jsonreps.json de type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    { label: 'name',
      identifier: 'id',
     'items':[
        {'id': 'root','name': 'RootFiles','type': 'directory'},
            {'name': 'visuelTotal','parent': 'RootFiles','type': 'file'},
            {'id': 'node1','name': 'visuelsBHV','parent': 'RootFiles','type': 'directory'},
                {'name': 'visuelBHV1','parent': 'visuelsBHV','type': 'file'},
                {'name': 'visuelBHV2','parent': 'visuelsBHV','type': 'file'},
                {'name': 'visuelBHV3','parent': 'visuelsBHV','type': 'file'},
            {'id': 'node2','name': 'visuelsDecathlon','parent': 'RootFiles','type': 'directory'},
                ......
    Mais la je butte sur la réalisation de mon model :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
        var myModel = new dijit.tree.TreeStoreModel({
           store: jsonRepertoire,
           query: {parent: ..... }
           });
     
        var arbo = new dijit.Tree({
                    model: myModel,
                    onClick: stockitem,
                    rowSelector: '20px'
                });
     
        var contenu = new dijit.layout.ContentPane({
                    content: arbo,
                    splitter: false,
                    region: 'leading'
                }, document.createElement('div'));
     
        dojo.byId("affichageRepertoire").appendChild(contenu.domNode);
        contenu.startup();
    D'après mes recherches, il faudrait redéfinir la méthode getChildren(), mais je ne vois pas trop comment? C'est vrai qu'au début, j'avais squizzé le modèle et pluggé directement le Tree sur le store ( avec un beau message deprecated en prime ) ; mais bon , quand il s'agit de valider un principe, on n'est pas très regardant. Ensuite il faut affiner et s'appuyer sur des choses cohérentes ( informatiquement parlant ), et c'est là que les difficultés commencent .

  2. #2
    Membre Expert
    Avatar de emmanuel.remy
    Inscrit en
    Novembre 2005
    Messages
    2 855
    Détails du profil
    Informations personnelles :
    Âge : 57

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 855
    Par défaut
    Salut,

    Planche de surf rangée, bière sur la table, bref que du plaisir...
    Pour faire bref: ce que tu veux faire avec les éléments du Tree de Dojo est impossible en l'état. Donc cela ne sert à rien de chercher à paramétrer quoi que ce soit
    Pour commencer, le store est effectivement deprecated, il faut passer par un model. Il sera complètement supprimé en v2.
    Ensuite le paramètre query du TreeStoreModel doit renvoyer un seul item marquant la racine de l'arbre (c'est différent du ForestStoreModel).
    Mais ce n'est que le début... le point d'orgue concerne ta structure inversée (à mon avis elle n'a rien d'inversée, elle me semble même plus logique que celle choisie par Dojo ): sa structure n'est pas du tout prévue. En effet chaque noeud de l'arbre doit avoir un ou plusieurs attributs considérés comme porteurs des enfants (propriété childrenAttrs du model). Mais toi tu fonctionnes à l'inverse (on y est). Donc tu as deux possibilités:
    1. soit tu redéfinis les fonction getChildren, mayHaveChildren, pasteItem, _onSetItem du model. Autant dire qu'il est préférable de créer ton propre model en implémentant les fonctions définies dans dijit.tree.model, au moins ce ne sera pas bancal... Le travail n'est pas complexe mais demande du temps, donc peut être valable si tu dois réutiliser souvent ce type de structure
    2. soit tu adaptes ta structure pour la conformer à celle attendue par le model choisi. 2 possibilités: soit tu peux ajouter les références aux noeuds enfants AU MOMENT de la génération de la structure (ce qui ne semble pas le cas) soit tu le fais a posteriori. Dans ce cas AU MOMENT de la génération de la structure ajoute au noeud un attribut children (vide) que tu rempliras sur le poste client à l'aide d'une fonction qui parcourt tes données. Tu me diras que le parcours des données n'est pas simple et que cela complique la tâche, mais si tu utilises dojox.jsonPath (un XPath version JSON) cela se réalise facilement. Finalement tu auras une structure compatible avec le TreeStoreModel et tu rentres dans le rang

    La seconde approche ne me semble pas la meilleure d'un point de vue généricité mais est la plus efficace, donc c'est celle que je privilégierais.

    Bon dev,



    ERE

  3. #3
    Membre confirmé
    Inscrit en
    Juin 2007
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 122
    Par défaut
    Hello,

    Merci pour les précisions que tu apportes : celà m'évitera de tourner en rond sur une solution impossible
    Merci aussi pour l'aspect pédagogique :
    1. pas de solution mais
    2. des pistes,
    3. un balisage du terrain

    L'élève n'a plus qu'à ce mettre au travail ( avec une bière ).
    Des pistes que tu suggères, je remettrais dans l'ordre de mes préférences :
    1. Changer la structure de mon jsonStore lors de la génération sur le serveur pour être conforme avec le TreeStoreModel : solution qui pour moi est la plus facile.
    2. Ecrire un modèle adapté à mes besoins : intéressant pour rentrer dans Dojo, mais :de la sueur et des larmes.

    Je suis actuellement sur la concaténation des données d'un formulaire, celà me laisse un peu de temps pour choisir.
    La suite au prochain épisode.

  4. #4
    Membre Expert
    Avatar de emmanuel.remy
    Inscrit en
    Novembre 2005
    Messages
    2 855
    Détails du profil
    Informations personnelles :
    Âge : 57

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 855
    Par défaut
    Salut,
    Je suis actuellement sur la concaténation des données d'un formulaire, celà me laisse un peu de temps pour choisir.
    Juste en passant: si c'est une FORM dojo: dijit.byId("form1").getValues() renvoie une structure JSON de toutes les données du formulaire.

    ERE

Discussions similaires

  1. Query sur 3 tables
    Par Ryan Sheckler dans le forum Langage SQL
    Réponses: 3
    Dernier message: 06/04/2006, 17h59
  2. SQL Query sur deux tables différentes.
    Par kabal22 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 25/12/2005, 18h52
  3. Réponses: 12
    Dernier message: 27/10/2005, 14h06
  4. Query sur plusieurs colonnes avec count(distinct...)
    Par Jeankiki dans le forum Langage SQL
    Réponses: 2
    Dernier message: 18/08/2004, 16h22
  5. faire un Query sur un Query ?
    Par davestar dans le forum C++Builder
    Réponses: 4
    Dernier message: 14/04/2004, 13h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo