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 :

Générer tree à partir d'un store [Dojo]


Sujet :

Bibliothèques & Frameworks

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    320
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 320
    Par défaut Générer tree à partir d'un store
    Salut,

    Je générais jusqu'ici mon store à partir d'un fichier json, lui-même généré par un fichier PHP, mais je trouve cette solution lourde car difficile à maintenir au niveau de l'accumulation des fichiers json et des risques de mise en cache.

    J'ai donc décidé de générer le même store à partir d'une chaîne JSON récupére par l'appel à mon script PHP via un dojo.xhrGet.

    Seulement, même si la chaîne est valide et tout et tout, j'ai une erreur dans Firebug, et le tree ne s'affiche pas.

    L'erreur:

    [Widget dijit.Tree, arbre] srcNodeRef=div#arbre _connects=[5] : error loading root children: TypeError: this._arrayOfTopLevelItems is undefined message=this._arrayOfTopLevelItems is undefined
    La seule chose qui a changé, c'est le store.
    Je fais ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    var sourceStore = dojo.xhrGet({
                                        url: "../ajax/makeStore.php?id_site=" + id_site,
                                        handleAs: "json",
                                        load: function(data){
                                            console.log(data);
                                            return data;
                                        },
                                        error: function(error){
                                            alert(error);
                                        }
                                    });
                var store = new dojo.data.ItemFileWriteStore({
                    data: sourceStore
                });
    Tandis qu'avant, je faisais ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var store = new dojo.data.ItemFileWriteStore({
                   url: "1107.json"
                });
    Pour info, voici d'autres bouts de code qui peuvent aider.

    La chaîne JSON récupérée(valide d'après JSONLint.com):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    {"identifier": "id","label": "nom","items":[{"id":"21","nom":"Test","id_site":"1107","id_parent":"0"
    ,"enfants":[{"id":"22","nom":"Test2","id_site":"1107","id_parent":"21","enfants":[{"id":"24","nom":"Test4"
    ,"id_site":"1107","id_parent":"22"}]},{"id":"25","nom":"Test5","id_site":"1107","id_parent":"21"}]},
    {"id":"23","nom":"Test3","id_site":"1107","id_parent":"0"}]}
    Et enfin, l'arbre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    var treeModel = new dijit.tree.ForestStoreModel({
                store: store,
                id: "model",
                query: {"id" : "*"},
                rootId: "root",
                rootLabel: "Dossiers",
                childrenAttrs: ["enfants"]
            });
     
            var tree = new dijit.Tree({
                            model: treeModel,
                            onClick: function(item){selectedItem = item}
                        }, "arbre");

    EDIT
    -----

    Je viens de faire un test en réutilisant le fichier .json, dans lequel j'ai collé la chaîne retournée par xhrGet, et ça fonctionne.

    Donc a priori ça ne devrait pas être un souci de malformation du json.

  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 Pour commencer
    Salut *.Har(d)t,

    Regarde ton source que je t'ai commenté:

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    //Là tu déclares un appel AJAX donc ** ASYNCHRONE **
    //sourceStore est donc un DeferredObject
    var sourceStore = dojo.xhrGet({
                                        url: "../ajax/makeStore.php?id_site=" + id_site,
                                        handleAs: "json",
                                        load: function(data){
                                            console.log(data);
                                            return data;
                                        },
                                        error: function(error){
                                            alert(error);
                                        }
                                    });
                
    /**
    * et la tu construis ton VRAI store
    * 2 problèmes:
    *   -  la ligne de code précédente tu es asynchrone, donc il y a de très fortes  
    *     chances que ton store cherche à être construit alors que l'appel 
    *     précédent n'est pas terminé (problématique AJAX, pas spécialement 
    *      DOJO)
    *   - ensuite tu affectes sourceStore à data, alors que sourceStore ne 
    *     représente pas les données, mais le DeferredObject
    */
    
    var store = new dojo.data.ItemFileWriteStore({
                    data: sourceStore
                });
    Tandis qu'avant, je faisais ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var store = new dojo.data.ItemFileWriteStore({
                   url: "1107.json"
                });
    Là tout est vu comme étant synchrone (même si ce n'est pas l'exacte vérité) , donc pas de souci.
    L'affectation url: "1107.json" déclenchera le téléchargement des données et l'affectation à data

    Enfin, avant de te proposer une solution, note que le chargement de ta page induit des allers-retours avec le server pour obtenir les données JSONS, ce qui peut produire des performances dégradées si tu dois charger plusieurs stores de la même manière.

    D'après ton code, le store que tu crées l'est au chargement de la page et ne semble plus être rechargé. Si tel est le cas, la solution la plus simple et la plus rapide est celle-ci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    var store = new dojo.data.ItemFileWriteStore({
                    data: /* ICI LES DONNEES JSON, TOUT SIMPLEMENT 
                                QUELQUE CHOSE DU STYLE 
                            */ <?php echo getDataJson() ?>
                });
    soit dans ton cas cela produira (et là tu vas t'en vouloir tellement c'est plus simple qu'un téléchargement Ajax ):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    var store = new dojo.data.ItemFileWriteStore({
                    data: {"identifier": "id",
                              "label": "nom",
                              "items":[{"id":"21","nom":"Test", "id_site":"1107", "id_parent":"0", "enfants":[{"id":"22","nom":"Test2","id_site":"1107","id_parent":"21","enfants":[{"id":"24","nom":"Test4"
    ,"id_site":"1107","id_parent":"22"}]},{"id":"25","nom":"Test5","id_site":"1107","id_parent":"21"}]},
    {"id":"23","nom":"Test3","id_site":"1107","id_parent":"0"}]}
     
                });
    Maintenant si tu veux quand même conserver l'aspect asynchrone du xhrGet alors va falloir enchainer les taches dans le bon ordre. Mais c'est un autre sujet.

    A+,

    ERE

    EDIT
    Tu as aussi la possibilité de faire un appel xhrGet synchrone mais je n'en vois pas l'intérêt ici, si tu es au chargement de ta page comme je le pense.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    320
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 320
    Par défaut
    Arf, merci

    J'ai toujours le même problème avec ces histoires de synchrone/asynchrone, j'ai un peu de mal.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XSD] Générer BDD à partir d'un schéma XSD
    Par n00bi dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 15/05/2012, 16h15
  2. [Dojo] Générer tree à partir BD
    Par pupkri64 dans le forum Bibliothèques & Frameworks
    Réponses: 9
    Dernier message: 08/04/2009, 12h40
  3. Réponses: 2
    Dernier message: 08/04/2007, 22h49
  4. Générer documents à partir de XML
    Par blastobi dans le forum XML/XSL et SOAP
    Réponses: 3
    Dernier message: 05/04/2006, 11h37
  5. Réponses: 6
    Dernier message: 03/03/2006, 09h06

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