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

AJAX Discussion :

[AJAX] Ecrire proprement un json en php


Sujet :

AJAX

  1. #1
    Membre régulier
    Inscrit en
    Juin 2008
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 99
    Points : 74
    Points
    74
    Par défaut [AJAX] Ecrire proprement un json en php
    Bonjour à tous,

    Je retombe sur un problème que j'avais laissé de côté il y a quelques temps et je fais appel à vous pour voir si c'est réellement une impasse ou si il y a une solution.

    Le contexte:
    Une requête Ajax qui attend un JSon pour construire des objets ExtJS.

    La réponse attendu dans le json est:

    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
    {
    	success: "1" 
    	,data : [
    	{
    		title:'Documents'
    		,id:'myId'
    		,items:[
    			new MY.ExtJS.Object(
    			{
    				url:'action.php'
    				,id:'myObjectId'
    			})
    		]
    	}]
    }
    Actuellement du côté php c'est codé comme ça:

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    [...]
    $sNewGridObject	=	"[{title:'".$aComponentItem['title']."'"
    					.",id:'".$aComponentItem['idTab']."'"
    					.",items:[new MY.ExtJS.Object({"
    						."url:'".$aComponentItem['urlDoc']."'"
    						.",id:'".$aComponentItem['idGrid']."'})
    					]}]";
     
    $response		= 	'{success: "1", data : '.$sNewGridObject.'}';
     
    $this->getResponse()->clearBody();
    $this->getResponse()->setBody($response);
    [...]

    Je voudrais écrire cela plus "proprement" sous forme de tableau, car ici je n'ai qu'un petit extrait du fichier JSon, qui en fait va comporter plusieurs nouveaux objets javascript et plusieurs "niveaux", et là, ça devient tout de suite beaucoup moins lisible et moins facile à gérer. Je travail déjà de cette façon pour beaucoup de JSon, mais les autres ne comportent pas de nouveau objets...
    Voila l'écriture à laquelle je voudrais parvenir:

    Code php : 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
    $aItemsMain		=	array();
    $sNewGridObject	=	"new PDM.manageFiles.directoryFilesgrid({"
    						."url:'".$aComponentItem['urlDoc']."'"
    						.",id:'".$aComponentItem['idGrid']."'})";
     
    $aItemsMain[]	=	array
    (
    	'title'			=>	$aComponentItem['title']
    	,'id'			=>	$aComponentItem['idTab']
    	,'items'		=>	array($sNewGridObject)
    );
     
    $jData		=	Zend_Json::encode($aItemsMain);
     
    $response		= 	'{success: "1", data : '.$jData.'}';
     
    $this->getResponse()->clearBody();
    $this->getResponse()->setBody($response);

    Oui mais voilà, avec cette écriture php, le JSon ressemble à ç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
    {
    	success: "1"
    	, data : [
    	{
    		"title":"Documents"
    		,"id":myId"
    		,"items":[
    			"new PDM.manageFiles.directoryFilesgrid(
    			{
    				url:'action.php'
    			})"
    		]
    	}]
    }
    Ce qui pourrait être parfait... Si il n'y avait pas les guillemets autour de la déclaration de mon object ExtJS (en rouge). Du coup je récupère une erreur javascript car le code entre guilemets est prit pour une chaine de caractères et n'est pas interprété.

    Est-ce qu'il serait donc possible de faire en sorte que le php n'écrive pas de guillemets autour la variable : $sNewGridObject ?

    J'espère avoir été clair, et je vous remercie par avance pour votre aide.
    N'hésitez pas à demander si il vous faut des éléments en plus.

    Le Duc

  2. #2
    Membre émérite
    Avatar de Kaamo
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    1 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 165
    Points : 2 778
    Points
    2 778
    Par défaut
    Mettre des accolades ?

    $sNewGridObject = "{new PDM.manageFiles.directoryFilesgrid({"
    ."url:'".$aComponentItem['urlDoc']."'"
    .",id:'".$aComponentItem['idGrid']."'})}";

  3. #3
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    Est-ce qu'il serait donc possible de faire en sorte que le php n'écrive pas de guillemets autour la variable : $sNewGridObject ?
    Non. C'est la définition du format JSON qui l'oblige !

  4. #4
    Membre régulier
    Inscrit en
    Juin 2008
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 99
    Points : 74
    Points
    74
    Par défaut
    Merci pour vos réponses.
    Kaamo, j'ai tester :
    Citation Envoyé par Kaamo Voir le message
    Mettre des accolades ?
    Mais effectivement, comme prévu par Bovino cela ne fonctionne pas. Lors de la lecture du JSon il me dit que l'Item n'est pas valide.

    Bovino:
    Citation Envoyé par Bovino;
    Non. C'est la définition du format JSON qui l'oblige !
    Ok, et est-ce que du coup il y a un autre moyen pour insérer une création d'object JS dans un tableau php ou il faut définitivement écrire tout le code JavaScript sous forme de string ?

    Merci pour votre aide.

  5. #5
    Membre régulier
    Inscrit en
    Juin 2008
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 99
    Points : 74
    Points
    74
    Par défaut
    Mes recherches m'amènent en fait vers la fonction json_encode (équivalente à Zend_JSon::encode dans mon cas).
    Est-ce qu'il y aurait une écriture particulière en php qui me permettrait de récupérer la chaine "new myObject..." sans les guillemets après le traitement par le json_encode ?

  6. #6
    Membre régulier
    Inscrit en
    Juin 2008
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 99
    Points : 74
    Points
    74
    Par défaut
    J'ai trouvé un contournement un peu brutal mais qui a le mérite de fonctionner.
    J'identifie les guillemets qui me posent problème lors de l'écriture du php, puis après le traitement par le Json_encode je les supprime avant de mettre la string dans la réponse.

    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
    $aItemsMain		=	array();
    $sNewGridObject	=	"?#?new PDM.manageFiles.directoryFilesgrid({"
    						."url:'".$aComponentItem['urlDoc']."'"
    						.",id:'".$aComponentItem['idGrid']."'})?#?";
    						
    $aItemsMain[]	=	array
    (
    	'title'			=>	$aComponentItem['title']
    	,'id'			=>	$aComponentItem['idTab']
    	,'items'		=>	array($sNewGridObject)
    );
    
    $jData		=	Zend_Json::encode(aItemsMain);
    $jData		=	str_replace('["?#?', '[', $jData);
    $jData		=	str_replace('?#?"]', ']', $jData);
    
    $response		= 	'{success: "1", data : '.$jData.'}';
    Je reste à l'écoute pour une solution un peu plus "homolguée".
    Bovino si tu as une idée. ;-)

Discussions similaires

  1. Réponses: 2
    Dernier message: 31/08/2016, 14h20
  2. [AJAX] d'envoi d'un JSON a php
    Par DeeVoiD dans le forum AJAX
    Réponses: 1
    Dernier message: 09/04/2009, 15h46
  3. [AJAX] Ajax et Json - création d'un .json par PHP
    Par versus68 dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 06/06/2008, 18h18
  4. [AJAX] ecrire du PHP dans du X3D
    Par n061384 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 13/07/2007, 16h38
  5. [PHP-JS] Ecrire dans un div en php
    Par J0r_x dans le forum Langage
    Réponses: 2
    Dernier message: 08/01/2007, 15h04

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