envoie d'un array php au format json

envoie d'un array php au format json - PHP - Programmation

Marsh Posté le 28-06-2013 à 11:22:17    

Bonjour,
 
Voilà je suis en train de faire un organigramme dynamique à l'aide d'une base de données SQL et de PHP. J'ai découvert un superbe outil en JavaScript qui réponds à tous les besoins de mon tuteur de stage : JavaScript Infovis Toolkit.
Mais voilà j'aimerai y apporté quelques modifications, remplacer les données d'origines par celles contenues dans ma base de données.
On a 3 grands niveaux : le 1er niveau est le Service qui regroupe plusieurs Antennes(le 2eme niveau) et une Antenne regroupe plusieurs équipes(3eme niveau).
Parmi toutes les personnes faisant partit de l'entreprise chacune à des responsabilités à un niveau en particulier par exemple :
 
Le chef de service qui est donc au niveau 1
Ses assistants qui sont aussi au niveau 1 mais sont sous sa responsabilité
Le chef d'antenne au niveau 2 etc...
 
Ces problèmes de niveaux sont résolus dans la base de données, cependant je ne sais pas vraiment comment écraser les données existantes dans le fichier Javascript dont voici la partie qui nous interesse:
 

Code :
  1. function init(){
  2.     //init data
  3.     var json = {
  4.         id: "node02",         #Id correspondant au nom du parent
  5.        name: "0.2",          # Nom du parent
  6.         data: {},
  7.         children: [{
  8.             id: "node13",                      #Id correspondant au nom de l'enfant
  9.             name: "1.3",                      #Nom de l'enfant
  10.             data: {},
  11.             children: [{
  12.                 id: "node24",
  13.                 name: "2.4",
  14.                 data: {},
  15.                 children: [{


 
J'aimerai écraser ces données grâce à mon fichier php, plus précisément avec Json_encode(), mais j'avoue ne pas comprendre comment faire pour modifier les valeurs respectives de "id" et "name" au bon endroit tout en gardant la structure.
 
Après quelques recherches il faudrait stocker le tout dans un array mais lors de l'affichage de l'output Json, ce concept de hiérarchie n'est pas mis en place :(
 
Voici le partie du code PHP qui nous intéresse :
 

Code :
  1. #Creation d'un array qui sera encodé pour le js parent-child org
  2.  $JsonArray = array();
  3.  /*while($data = mysql_fetch_assoc($sqlCDS)){
  4.  
  5.   echo $data['nom_agent'];
  6.   } */
  7.  echo '<table>';
  8.  while($parentServ = mysql_fetch_assoc($sqlCDS))
  9.  {
  10.    $temp = array(
  11.     "id" => $parentServ["No_agent"]
  12.     ,"name" => $parentServ["nom_agent"]
  13.     );
  14.     $JsonArray[] = $temp;
  15.     #echo $temp['id'];
  16.     #echo $temp['name'];
  17.    while ($childServ = mysql_fetch_assoc($sqlAGENT))
  18.    {
  19.      $temp = array(
  20.      "id" => $childServ["No_agent"]
  21.      ,"name" => $childServ["nom_agent"]
  22.      );
  23.     #echo $temp['id'];
  24.     #echo $temp['name'];
  25.    }
  26.   $JsonArray[] = $temp;
  27.  }
  28.  echo'</table>';
  29.  echo json_encode(array("JsonOutput" => $JsonArray)). "<br />";
  30.  #echo $JsonArray[1];
  31. ?>


 
La connexion à la base de données est effective, les requête SQL fonctionnent et les données que je veux sont bonnes, il n'y a vraiment que la création de la structure correspondante au JS qui me bloque.
 
Voilà merci, si vous avez besoin de plus d'informations n'hésitez pas :) et bonne journée.


Message édité par furil le 28-06-2013 à 12:58:02
Reply

Marsh Posté le 28-06-2013 à 11:22:17   

Reply

Marsh Posté le 28-06-2013 à 15:15:15    

Salut,
 
Difficile à tester sans ta base de données mais essaye avec ça pour voir si ça fonctionne mieux:
 

Code :
  1. // Creation d'un array qui sera encodé pour le js parent-child org
  2. $JsonArray = array();
  3. echo '<table>';
  4. while ($parentServ = mysql_fetch_assoc($sqlCDS)) {
  5.    $temp = array(
  6.        "id"   => $parentServ["No_agent"],
  7.        "name" => $parentServ["nom_agent"],
  8.    );
  9.  
  10.    $children = array();
  11.    while ($childServ = mysql_fetch_assoc($sqlAGENT)) {
  12.        $children[] = array(
  13.            "id"   => $childServ["No_agent"],
  14.            "name" => $childServ["nom_agent"],
  15.        );
  16.    }
  17.    $temp['children'] = $children;
  18.  
  19.    $JsonArray[] = $temp;
  20. }
  21. echo'</table>';
  22. echo json_encode(array("JsonOutput" => $JsonArray)). "<br />";


---------------
Mon Feedback !
Reply

Marsh Posté le 01-07-2013 à 09:46:04    

Salut Tirkyth,
 
Désolé du retard je n'avais pas vu ton message  :ange: et merci pour ta réponse. Cela colle mieux à ce que je recherche, j'ai fait le test, j'ai la sortie qu'il me faut.  

Code :
  1. var json = {
  2.         id: "node02",         #Id correspondant au nom du parent
  3.        name: "0.2",          # Nom du parent
  4.         data: {},
  5.         children: [{
  6.             id: "node13",                      #Id correspondant au nom de l'enfant
  7.             name: "1.3",                      #Nom de l'enfant
  8.             data: {},


 
J'ai remarqué qu'en fait le parent (tout en haut dans la variable JSON) n'est pas un tableau mais un objet. Dans cette objet on a d'abord les paramètres du parent(2 string et un autre objet(data)) et ensuite nos fameux arrays un enfant contenu dans un enfant(...). Bref, tu m'as permis de résoudre le plus difficile je pense et je t'en remercie.  
 
Au revoir et bonne journée !  :D

Reply

Marsh Posté le 08-07-2013 à 14:41:01    

Bonjour,
 
Voilà plutôt que de recréer un post vu que ça concerne le même problème autant continuer ici :)
 
Alors cette fois j'ai mes parents et mes enfants mais problème :
 
On a trop de terrains de jeux sur le même niveau que les enfants donc j'ai décidé de regrouper les terrains de jeux  :
 

Code :
  1. //Creation d'un array qui sera encodé pour le js parent-child org
  2.  $JsonArray = array();
  3.  /*while($data = mysql_fetch_assoc($sqlCDS)){
  4.  
  5.   echo $data['nom_agent'];
  6.   } */
  7.  //echo '<table>';
  8.  while($parentServ = mysql_fetch_assoc($sqlCDS))
  9.  {
  10.    $temp2 = array(
  11.     "id" => $parentServ["No_agent"]
  12.     ,"name" => $parentServ["nom_agent"]
  13.     );
  14.     //echo $temp['id'];
  15.     //echo $temp['name'];
  16.     $children = array();
  17.    while ($childServ = mysql_fetch_assoc($sqlAGENT))
  18.    {
  19.      $children[] = array(
  20.      "id" => $childServ["No_agent"]
  21.      ,"name" => $childServ["nom_agent"]
  22.      );
  23.     //echo $temp['id'];
  24.     //echo $temp['name'];
  25.    }
  26.   //$temp[] = $children;
  27.   //$JsonArray[] = $temp;
  28.   while($childServAnt = mysql_fetch_assoc($sqlAntenne))
  29.    {
  30.     $children[] = array(
  31.     "id" => $childServAnt["No_antenne"]
  32.     ,"name" => $childServAnt["Lib_antenne"]
  33.     );
  34.    }
  35.   $ant[] = array(
  36.   "id" => "1"
  37.   ,"name" => "Antennes"
  38.  );
  39.   //Insertion des données dans une structure commune
  40.   $JsonObj['id'] = $temp2['id'];
  41.   $JsonObj['name'] = $temp2['name'];
  42.   $JsonObj['children']=$ant;
  43.   $JsonObj['children']=$children;
  44.  }
  45.  //echo'</table>';
  46.  //encodage des données au format JSON
  47.  echo json_encode($JsonObj);


 
Je m'explique on a :  
- Furil comme Parent  
- Toto,tata,titi,Jean comme enfants et les terrains de jeux respectifs(ici appelées Antennes)
- trop de terrain de jeux alors je les regroupe dans Antennes et lorsque que je déroulerai Antennes j'aurai tout les terrains de jeux
Exemple :
 
{"id":"1234","name":"Furil","children":[
                         {"id": "123", "name":"Jean"},{"id": "124", "name":"toto"},{"id": "125", "name":"titi"},{"id": "126", "name":"tete"},
                         {"id": "127", "name":"Antennes","children":[
                         {"id":"128","name":"gymnase"},{"id":"129","name":"stade"},{"id":"130","name":"ecole"}
                         ]}
                 ]}
 
 
Mais problème je n'arrive pas à regrouper les terrains de jeux dans "Antennes" Je travaille à partir d'une bdd sous MySQL, donc les valeurs id, name(parents,enfants, antennes) sont généré dans les boucles. La valeur "Antennes" qui regroupera toutes les antennes sera une valeur statique et dans cette valeur je veux stocker par exemple tous les terrains de jeux(=antennes).


Message édité par furil le 08-07-2013 à 14:43:09
Reply

Marsh Posté le 11-07-2013 à 08:23:26    

Bonjour,

 

Voilà donc la solution pour ceux qui auront le même problème que moi dans le future :

 
Code :
  1. //Creation d'un array qui sera encodé pour le js parent-child org
  2.      $JsonArray = array();
  3.      while($parentServ = mysql_fetch_assoc($sqlCDS))
  4.      {
  5.        $temp2 = array(
  6.         "id" => $parentServ["No_agent"]
  7.         ,"name" => $parentServ["nom_agent"]
  8.         );
  9.         //echo $temp['id'];
  10.         //echo $temp['name'];
  11.         $children = array();
  12.         $children2 = array();
  13.         $ant = array();
  14.        //On exécute la requête permettant de récupérer tous les enfants
  15.        while ($childServ = mysql_fetch_assoc($sqlAGENT))
  16.        {
  17.          $children[] = array(
  18.          "id" => $childServ["No_agent"]
  19.          ,"name" => $childServ["nom_agent"]
  20.          );
  21.         //echo $temp['id'];
  22.         //echo $temp['name'];
  23.        }
  24.       //-------------------------------------------------
  25.       //$temp[] = $children;
  26.       //$JsonArray[] = $temp;
  27.       //Déclaration de la structure qui va regrouper les antennes
  28.       $ant = array(
  29.       "id" => "1"
  30.       ,"name" =>"Antennes"
  31.       );
  32.      //On execute la requête permettant d'avoir tous les terrains de jeux
  33.       while($childServAnt = mysql_fetch_assoc($sqlAntenne))
  34.        {
  35.         $children2[] = array(
  36.         "id" => $childServAnt["No_antenne"]
  37.         ,"name" => $childServAnt["Lib_antenne"]
  38.         );
  39.        }
  40.     //-----------------------------------------------
  41.       $ant['children'] = $children2; //on stocke les terrains de jeux dans "Antennes"
  42.       $children[] = $ant; //on met "Antennes" au même niveau que les enfants
  43.       //Insertion des données dans une structure commune
  44.       $JsonObj['id'] = $temp2['id'];//stockage du 1er paramètre du parent
  45.       $JsonObj['name'] = $temp2['name']; // 2nd paramètre du parent
  46.       $JsonObj['children']=$children; // tous le reste : tata,titi, Antennes(...)
  47.      }
  48.      //encodage des données au format JSON
  49.      echo json_encode($JsonObj);
 

ce qui va nous donner ce résultat :

 
Code :
  1. {"id":"1234","name":"Furil","children":[
  2.     {"id": "123", "name":"Jean"},
  3.     {"id": "124", "name":"toto"},
  4.     {"id": "125", "name":"titi"},
  5.     {"id": "126", "name":"tete"},
  6.     {"id": "127", "name":"Antennes","children":[
  7.         {"id":"128","name":"gymnase"},
  8.         {"id":"129","name":"stade"},
  9.         {"id":"130","name":"ecole"}
  10.     ]}
  11. ]}
 

En faites la création d'ensemble de structure n'est pas un problème, il fallait juste faire attention au nombre de niveau crée lors la création des tableaux associatifs(tableau composé obligatoirement de la paire clé/valeur ex : "id"=>"1" ). Par niveau, je veux dire lorsqu'on insère un tableau dans un autre. C'est là qu'il faut faire attention :) .
Par exemple si j'avais fait :

 
Code :
  1. $ant[] = array(
  2. "id" => "1"
  3. ,"name" =>"Antennes"
  4. );
 

Au lieu de :

 
Code :
  1. $ant = array(
  2. "id" => "1"
  3. ,"name" =>"Antennes"
  4. );
 

mon résultat aurait été :

 


Code :
  1. {"id":"1234","name":"Furil","children":[
  2.     {"id": "123", "name":"Jean"},
  3.     {"id": "124", "name":"toto"},
  4.     {"id": "125", "name":"titi"},
  5.     {"id": "126", "name":"tete"},{"0":
  6.     {"id": "127", "name":"Antennes"},"children":[
  7.         {"id":"128","name":"gymnase"},
  8.         {"id":"129","name":"stade"},
  9.         {"id":"130","name":"ecole"}
  10.     ]}
  11. ]}
 

Voilà j'espère avoir bien expliquer pour ceux qui en auront besoin.

 

Merci et bonne journée ! :)


Message édité par furil le 11-07-2013 à 08:24:03
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed