Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 13-03-2014 11:12:18

Seryus
Membre
Date d'inscription: 17-02-2012
Messages: 128

[Résolu] JSON Model forcer la conversion tableau en objet

Bonjour,

J'utilise Zend\View\Model\JsonModel pour récupérer un JSON de mon controller que j'exploite en JavaScript.

Pour mon cas, je veux obtenir un objet JavaScript (sous la forme { 'clé' : 'valeur' }) à partir d'un tableau PHP.
Le problème c'est que si les index de mon tableau PHP sont numériques, le JSON qu'il me retourne est sous la forme ['valeur', 'valeur'].

Comment forcer la conversion d'un tableau à clés numériques PHP en objet JavaScript via JsonModel ?

Dernière modification par Seryus (14-03-2014 14:08:26)

Hors ligne

 

#2 13-03-2014 12:08:36

flobrflo
Membre
Lieu: Marseille
Date d'inscription: 26-04-2013
Messages: 376

Re: [Résolu] JSON Model forcer la conversion tableau en objet

Coucou,

Personnellement pour renvoyer du Json j'utilise la classe Response:
http://framework.zend.com/manual/2.0/en … ponse.html

A quoi ressemble ton tableau php?
Il doit s'agir plus d'un problème de mise en forme de ton tableau à l’envoie.

Hors ligne

 

#3 13-03-2014 12:36:09

Bouks
Membre
Lieu: Paris
Date d'inscription: 31-08-2012
Messages: 241

Re: [Résolu] JSON Model forcer la conversion tableau en objet

Pourquoi pas un foreach avec génération d'un nouveau tableau avec des clés  transtypées en string.
Ca fonctionne en tout cas avec json_encode SAUF POUR LA CLE '0', donc tu dois incrémenter de 1 ou éviter la clé '0'... A tester avec le JsonModel.

Si la clé représente un identifiant de bdd, généralement tu n'as pas de clé 0, donc ça devrait fonctionner.


22914720

Hors ligne

 

#4 13-03-2014 14:40:57

Seryus
Membre
Date d'inscription: 17-02-2012
Messages: 128

Re: [Résolu] JSON Model forcer la conversion tableau en objet

En faite c'est pour récupérer une liste d'options pour un élément de formulaire "select" lié (en fonction du premier choix de l'utilisateur) et les champs sont bien repris de la bdd.
Par contre, je veux aussi avoir "l'empty_option" du select pour le coup et c'est de là que vient mon problème.

Avec le json_encode natif de PHP en passant le 2ème paramètre "JSON_FORCE_OBJECT", ça fonctionne sauf que je ne sais pas comment faire en sorte que l'objet JSONModel le fasse (j'utilise aussi "ViewJsonStrategy").

Si je passe par la fonction native de PHP, je passerais ensuite les paramètres à la vue comme ceci :

Code:

[lang=php]
return new ViewModel(array(
    'monTableau' => array(0 => 'empty value', /* ... */),
));

et ça m'obligerait à passer par mon fichier de vue (je voudrai éviter ça, il me sert à d'autres choses au cas où la requête ne serait pas de l'Ajax) et je devrais donc refaire un test dans la vue pour voir si la requête était de l'Ajax ou pas.

Dernière modification par Seryus (13-03-2014 14:42:01)

Hors ligne

 

#5 13-03-2014 14:49:13

flobrflo
Membre
Lieu: Marseille
Date d'inscription: 26-04-2013
Messages: 376

Re: [Résolu] JSON Model forcer la conversion tableau en objet

L'objet Zend\Http\Response te permet de faire ça wink

ne pas passer par une vue et directement renvoyer ton tableau.

Dernière modification par flobrflo (13-03-2014 14:49:41)

Hors ligne

 

#6 13-03-2014 14:53:13

Bouks
Membre
Lieu: Paris
Date d'inscription: 31-08-2012
Messages: 241

Re: [Résolu] JSON Model forcer la conversion tableau en objet

Je fais ça régulièrement pour des selects.

Dans le controller:

Code:

[lang=php]
return [
 'myList' => json_encode(array_merge(['' => ''], $myList), JSON_UNESCAPED_UNICODE)
]

Dans la vue:

Code:

[lang=php]
$this->inlineScript()->appendScript('var myList=' . $this-> myListList . ';', 'text/javascript', ['noescape' => true]);

Après je gère en javascript.
Pour l'ajax ça fonctionne pareil, tu n'as juste qu'à repeupler ta variable myList et relancer la construction du select.


22914720

Hors ligne

 

#7 14-03-2014 14:07:46

Seryus
Membre
Date d'inscription: 17-02-2012
Messages: 128

Re: [Résolu] JSON Model forcer la conversion tableau en objet

L'objet Zend\Http\Response me convient :

Code:

[lang=php]
return $this->getResponse()->setContent(json_encode($selectOptions, JSON_FORCE_OBJECT))

Merci à vous ! big_smile

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages