Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 13-08-2010 13:13:46

ziedb
Membre
Lieu: Tunis
Date d'inscription: 24-03-2008
Messages: 224

Générer des données au format JSON à partir d'enregistrement de BD

Je cherche à générer des données au format JSON à partir d'enregistrement de BD afin de pouvoir les transmettre depuis mon ACTION vers un composant Autocomplete (Jquery).


Comment faire cette conversion?

A quel niveau faut-il la faire conversion Modèle ou controleur?

MERCI

Hors ligne

 

#2 13-08-2010 13:42:29

Delprog
Administrateur
Date d'inscription: 29-09-2008
Messages: 670

Re: Générer des données au format JSON à partir d'enregistrement de BD

Salut,

Il faut utiliser le switcher de context. En gros Zend va détecter le contexte (type de requête) et le format de données dans lequel la réponse est attendue par le client. Tout ça grâce aux entêtes http.

Pour utiliser ça, tu dois initialiser le helper d'action ContextSwitch dans ton controlleur.

Deux méthodes, soit tu re-déclares la propriété public $contexts pour définir les contextes possibles pour les actions souhaitées, soit tu les ajoutes dans l'initialisation, voici la première méthode :

Code:

class MonController extends Zend_Controller_Action
{
    public $contexts = array(
        'mon-action' => array('json')
    );

    public function init()
    {
        $contextSwitch = $this->_helper->getHelper('ContextSwitch');
        $contextSwitch->setAutoJsonSerialization(false)
                      ->initContext();
    }
}

C'est au controller de déterminer dans quel contexte tu te trouves et à la vue d'afficher le résultat. En fonction du contexte le controlleur va essayer de rendre soit une vue "mon-action.phtml" soit "mon-action.json.phtml". Pour respecter ce principe, la méthode setAutoJsonSerialization empêche le controlleur de rendre immédiatement la sortie en JSON à la fin de l'action.

Dans ce cas, dans "mon-action.json.phtml" tu peux utiliser le helper de vue "json" pour convertir tes données en JSON depuis un array.

Exemple:

controlleur :

Code:

class MonController extends Zend_Controller_Action
{
    public $contexts = array(
        'mon-action'     => array('json')
    );

    public function init()
    {
        $contextSwitch = $this->_helper->getHelper('ContextSwitch');
        $contextSwitch->setAutoJsonSerialization(false)
                      ->initContext();
        
        parent::init();
    }

    public function monActionAction()
    {
        $this->view->data = array('un', 'deux', 'trois', 'quatre'); // ça pourrait aussi bien être un $row->toArray() ou autre
    }

    public function postDispatch()
    {
        $this->view->response = $this->_response;
        parent::postDispatch();
    }
}

mon-action.json.phtml

Code:

$this->response->setHeader('Content-Type', 'application/json');
$this->response->setHttpResponseCode(200);
echo $this->json($this->data);

Depuis javascript tout ce que tu as à faire c'est de passer le paramètre "format=json" en GET.

En utilisant cette méthode, tu peux faire du javascript non intrusif et ton action reste valable quelque soit le contexte (normal = html, json, xml), tout ce que tu as à faire c'est construire la vue correspondante pour rendre ce qu'il faut au client.

A+ benjamin.


http://www.anonymation.com/ - anonymation - Studio de création.
http://code.anonymation.com/ - anonymation - blog - développement et architecture web

Hors ligne

 

#3 13-08-2010 13:44:55

Delprog
Administrateur
Date d'inscription: 29-09-2008
Messages: 670

Re: Générer des données au format JSON à partir d'enregistrement de BD

Petit astuce, tu peux écrire un plugin de controller pour ne pas avoir à gérer le paramètre "format" et détecter automatiquement le contexte en fonction des entêtes http :

Code:

<?php
/**
 * Handle Accept Header and add format param
 * to uri for context switch later.
 * 
 * @author Benjamin Dulau 
 */
class Tight_Controller_Plugin_HeaderAccept extends Zend_Controller_Plugin_Abstract
{
    /**
     * @param Zend_Controller_Request_Abstract $request
     * @return void
     */
    public function dispatchLoopStartup(Zend_Controller_Request_Abstract $request)
    {
        $header = $request->getHeader('Accept');
        switch (true) {
            case (strstr($header, 'application/json')):
                $request->setParam('format', 'json');                
                break;
            
            case (strstr($header, 'application/xml') && (!strstr($header,'html'))):
                $request->setParam('format', 'xml');
                break;
        }
    }
}

http://www.anonymation.com/ - anonymation - Studio de création.
http://code.anonymation.com/ - anonymation - blog - développement et architecture web

Hors ligne

 

#4 13-08-2010 15:05:24

ziedb
Membre
Lieu: Tunis
Date d'inscription: 24-03-2008
Messages: 224

Re: Générer des données au format JSON à partir d'enregistrement de BD

Merci pour ton aide je vais essayer mais il y a juste un détail que je veux éclaircir :
a quoi sert

Code:

    public function postDispatch()
    {
        $this->view->response = $this->_response;
        parent::postDispatch();
    }

Encore une fois merci

Hors ligne

 

#5 13-08-2010 15:11:53

Delprog
Administrateur
Date d'inscription: 29-09-2008
Messages: 670

Re: Générer des données au format JSON à partir d'enregistrement de BD

Je passe l'objet réponse à la vue pour pouvoir paramétrer les entêtes de réponse. L'objet réponse n'est pas accessible depuis les vues sinon.

Je fais ça de sorte que l'action du controlleur n'est pas du tout à gérer ce point là et soit exactement identique quelque soit le contexte. La vue s'occupe d'afficher comme il se doit smile


A+ benjamin.


http://www.anonymation.com/ - anonymation - Studio de création.
http://code.anonymation.com/ - anonymation - blog - développement et architecture web

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