Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
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
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
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.
Hors ligne
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 :
[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
L'objet Zend\Http\Response te permet de faire ça
ne pas passer par une vue et directement renvoyer ton tableau.
Dernière modification par flobrflo (13-03-2014 14:49:41)
Hors ligne
Je fais ça régulièrement pour des selects.
Dans le controller:
[lang=php] return [ 'myList' => json_encode(array_merge(['' => ''], $myList), JSON_UNESCAPED_UNICODE) ]
Dans la vue:
[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.
Hors ligne
L'objet Zend\Http\Response me convient :
[lang=php] return $this->getResponse()->setContent(json_encode($selectOptions, JSON_FORCE_OBJECT))
Merci à vous !
Hors ligne