web-dev-qa-db-fra.com

Comment désactiver la mise en page et afficher le rendu dans ZF2?

Comment puis-je désactiver la mise en page et l'affichage du rendu dans Zend Framework 2.x? J'ai lu la documentation et je n'ai pas de réponse en cherchant dans google j'ai trouvé une réponse à Zend 1.x et c'est

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

Mais cela ne fonctionne plus dans Zend Framework 2.x. J'ai besoin de désactiver le rendu de vue et la mise en page pour les demandes Ajax.

Toute aide est la bienvenue.

22
Viszman

Utilisez simplement setTerminal(true) dans votre contrôleur pour désactiver la disposition.

Ce comportement est documenté ici: Zend View Quick Start :: Dealing With Layouts

Exemple:

<?php
namespace YourApp\Controller;

use Zend\View\Model\ViewModel;

class FooController extends AbstractActionController
{
    public function fooAction()
    {
    $viewModel = new ViewModel();
    $viewModel->setVariables(array('key' => 'value'))
              ->setTerminal(true);

    return $viewModel;
    }
}

Si vous souhaitez envoyer une réponse JSON au lieu de rendre un fichier .phtml, essayez d'utiliser JsonRenderer:

Ajoutez cette ligne en haut de la classe:

use Zend\View\Model\JsonModel;

et voici un exemple d'action qui retourne JSON:

public function jsonAction()
{
    $data = ['Foo' => 'Bar', 'Baz' => 'Test'];
    return new JsonModel($data);
}

MODIFIER:

N'oubliez pas d'ajouter ViewJsonStrategy à votre module.config.php fichier pour permettre aux contrôleurs de retourner JSON. Merci @Remi!

'view_manager' => [
    'strategies' => [
        'ViewJsonStrategy'
    ],
],
36
edigu

Un peu plus d'informations sur la réponse ci-dessus ... Je l'utilise souvent lors de la sortie dynamique de différents types de fichiers: json, xml, pdf, etc. C'est l'exemple de la sortie d'un fichier XML.

// In the controller
$r = $this->getResponse();

$r->setContent(file_get_contents($filePath)); //

$r->getHeaders()->addHeaders(
    array('Content-Type'=>'application/xml; charset=utf-8'));

return $r;

La vue n'est pas rendue et seuls le contenu et les en-têtes spécifiés sont envoyés.

4
Katya S

Vous pouvez ajouter ceci à la fin de votre action:

return $this->getResponse();
4
vcsfrl