web-dev-qa-db-fra.com

Comment faire pour que Zend Framework ne rende pas une vue / mise en page lors de l'envoi d'une réponse AJAX?

La documentation de Zend n'est pas vraiment claire à ce sujet.

Le problème est que, par défaut, Zend rend automatiquement une vue à la fin de chaque action du contrôleur. Si vous utilisez une mise en page - et pourquoi pas? - cela rend aussi cela. C'est très bien pour les pages Web normales, mais lorsque vous envoyez une réponse AJAX vous ne voulez pas tout cela. Comment empêcher Zend de se rendre automatiquement sur une action par action base?

42
Don Jones

Appelez ce code à partir de toutes les actions que vous allez envoyer AJAX réponses:

$this->_helper->layout->disableLayout();
$this->_helper->viewRenderer->setNoRender(TRUE);

Cela désactive le moteur de disposition pour cette action et désactive le rendu de vue automatique pour cette action. Vous pouvez alors simplement "faire écho" tout ce que vous voulez que votre sortie AJAX soit), sans vous soucier de la vue/mise en page normale envoyée pendant le trajet.

93
Don Jones

Si votre AJAX renvoie JSON, vous pouvez utiliser l’assistant d’action JSON:

$this->_helper->json($data);

Cet assistant va json_encode vos $ données, sortez-les avec des en-têtes JSON et mourez enfin, donc nous obtenons un JSON propre revenu de l'action sans mise en page ni rendu de vue.

f.e. J'utilise cette construction en action pour éviter plusieurs vérifications de l'ACL pour différentes actions juste pour ajax

public function photosAction() {

if ($this->getRequest()->getQuery('ajax') == 1 || $this->getRequest()->isXmlHttpRequest()) {
    $params = $this->getRequest()->getParams();
    $result = false;

     switch ($params['act']) {
        case 'deleteImage':
           //deleting something
           ...
           $result = true; //ok
           break;

        default :
           $result = array('error' => 'Invalid action: ' . $params['act']);
           break;
      }

    $this->_helper->json($result);
}

// regular action code here
...
}
19
Valeriy Selitskiy