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 :

Populer Dijit.form.FilteringForm avec des données JSON [Dojo]


Sujet :

Bibliothèques & Frameworks

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Avril 2005
    Messages
    307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2005
    Messages : 307
    Par défaut Populer Dijit.form.FilteringForm avec des données JSON
    Bonjour,

    Je sais qu'il y a des tonnes de topics à ce sujet. Mais j'ai beau les lire et relire, Je n'arrive pas à les adapter.

    Je pense que ça viens du manque de maitrise des stores de ma part...

    Ça me parait pourtant simple, je dois remplir un FilteringForm avec des données JSon récupérer par une requête Ajax. L'objet JSon récupérer possède la structure suivante :
    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
    {
         status:...,
         message:...,
         responses:
              [
                   {
                        id:...
                        user:{...}
                   },
                   {
                        id:...
                        user:{...}
                   },
                   ...
              ]
    }
    "status" et "message" indiquent le status de la requête (Failed, Success...) ainsi qu'un message optionnel indiquant la cause de l'erreur.
    "responses" est un tableau contenant les résultats. C'est cette liste qui doit être affichée dans le FilteringSelect.

    1ère question : comment indiquer au store que la liste des données est "responses" et non pas la racine de l'objet ?
    2ème question : comment indiquer au FilteringSelect que l'id est "user.id" et le label "user.fullName" ?

    Voici mon store :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    this.membersStore = new dojo.data.ItemFileReadStore({
         url: lib.utils.getSlashedUrl() + "ajaxGetMembers?responsibility=" + this.responsibility,
    });
    Et voici mon widget :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    this.membersSelect = new dijit.form.FilteringSelect(
         {
              store: this.membersStore,
         }, 
         dojo.query(".selectMembers", this.container)[0]
    );
    PS : la requête est envoyée par memberStore (vérifié avec Firebug), mais il semble être vide.

  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
    Bonjour,

    Il n'existe pas de solution triviale dans ton cas. Pourquoi ne pas plutôt écrire 3 lignes de code qui transforment ta structure JSON personnelle en une structure JSON de store, avec identifier et label ? Comme ça t'es en natif et plus de souci.

    ERE

  3. #3
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Avril 2005
    Messages
    307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2005
    Messages : 307
    Par défaut
    Bonjour Emmanuel,

    Effectivement je me suis rapproché d'une telle solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    lib.utils.sendAjaxRequest({
         url:lib.utils.getSlashedUrl() + "ajaxGetMembers?responsibility=" + this.responsibility,
         method:"get",
         type:"json",
         success:dojo.hitch(this, function(data){
              this.membersStore.data = {
                   items: data,
              };
     
              this.togglePanels();
         }),
    });
    lib.utils.sendAjaxRequest est une fonction "maison" qui envoi la requête, traite le status de l'objet JSon et appelle la méthode "success" en lui passant en paramètre le tableau "responses" de l'object JSon.

    Je récupère donc l'objet JSon ci-dessous, mais ma liste affiche 3 fois "mon groupe".
    Comment dire que l'id est "id", le label est "fullName", et qu'il ne doit pas être récursif ?

    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
    30
    31
    32
    33
    34
    35
    36
    {
        "message": "",
        "status": 1,
        "responses": [
            {
                "id": 1,
                "group": {
                    "name": "mon groupe",
                    "id": 1
                },
                "fullName": "Prenom1 Nom1",
                "firstname": "Prenom1",
                "lastname": "Nom1"
            },
            {
                "id": 2,
                "group": {
                    "name": "mon groupe",
                    "id": 1
                },
                "fullName": "Prenom2 Nom2",
                "firstname": "Prenom2",
                "lastname": "Nom2"
            },
            {
                "id": 3,
                "group": {
                    "name": "mon groupe",
                    "id": 1
                },
                "fullName": "Prenom3 Nom3",
                "firstname": "Prenom3",
                "lastname": "Nom3"
            }
        ]
    }

  4. #4
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Avril 2005
    Messages
    307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2005
    Messages : 307
    Par défaut
    Au fait, j'ai essayé en remplaçant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    this.membersStore.data = {
         items: data,
    };
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    this.membersStore.data = {
         identifier: "id",
         label:"fullName",
         items: data,
    };
    Mais j'ai l'erreur suivante :
    Error: dojo.data.ItemFileReadStore: The json data provided by the creation arguments is malformed. Items within the list have identifier: [id]. Value collided: [1]
    Je suppose que c'est parce que les 3 utilisateurs font partis du même groupe et donc ont le même group.id...

  5. #5
    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
    Il faudrait que tu mettes les items au format attendu par le store.
    Ensuite il faudra voir, car je crois que si il existe des sous-items (des sous-objets), alors dojo les traite comme des items normaux, ce qui peut expliquer ton conflit d'Id.

    Mais déjà fabrique une structure JSON telle que dojo l'attend.

    ERE

  6. #6
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Avril 2005
    Messages
    307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2005
    Messages : 307
    Par défaut
    C'est ce que j'ai fais ici :
    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
    this.membersStore = new dojo.data.ItemFileReadStore({
         hierarchical:false,
         label: "fullName",
         identifier: "id",
         data:
              {
                   label: "fullName",
                   identifier: "id",
                   items:data
              }
    });
     
    this.membersSelect = new dijit.form.FilteringSelect(
         {
              store: this.membersStore,
              autoComplete: true,
              style: "width: 198px;",
              required: false,
         },
         dojo.query(".selectMembers", this.container)[0]
    );
    avec data =
    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
    {
    {
     
        "id": 1,
        "group": {},
        "fullName": "admin admin",
        "isEnable": true,
        "firstname": "admin",
        "lastname": "admin"
     
    },
    {
     
        "id": 2,
        "group": {...},
        "fullName": "Userfirstname UserLastname",
        "firstname": "Userfirstname",
        "lastname": "UserLastname"
     
    },
    ...
    }
    Mais ça ne fonctionne pas...

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

Discussions similaires

  1. [D3js] Graphique avec des données json
    Par DiverSIG dans le forum Bibliothèques & Frameworks
    Réponses: 1
    Dernier message: 04/02/2017, 14h56
  2. Travailler avec des données de type JSON
    Par rambc dans le forum jQuery
    Réponses: 2
    Dernier message: 21/11/2010, 11h38
  3. Modifier des formes Visio avec des données Excel
    Par Hubs702 dans le forum Visio
    Réponses: 4
    Dernier message: 25/06/2007, 07h19
  4. Créer du xml avec des données Oracle
    Par Baumont dans le forum Oracle
    Réponses: 3
    Dernier message: 23/11/2005, 15h35
  5. [Form/ssForm] rafraichissement des données
    Par michaelbob dans le forum Access
    Réponses: 3
    Dernier message: 14/10/2005, 11h05

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