Zend Framework 2: Auto disable layout for ajax calls

ajax, php, zend-framework2

Solution

Indeed the best thing would be to write another Strategy. There is a JsonStrategy which can auto-detect the accept header to automatically return Json-Format, but as with Ajax-Calls for fullpages, there it's good that it doesn't automatically do things, because you MAY want to get a full page. Above mentioned solution you mentioned would be the quick way to go.

When going for full speed, you'd only have one additional line. It's a best practice to always return fully qualified ViewModels from within your controller. Like:

public function indexAction() 
{
    $request   = $this->getRequest();
    $viewModel = new ViewModel();
    $viewModel->setTemplate('module/controller/action');
    $viewModel->setTerminal($request->isXmlHttpRequest());

    return $viewModel->setVariables(array(
         //list of vars
    ));
}

Problem

An AJAX request to one of my controller actions currently returns the full page HTML. I only want it to return the HTML (.phtml contents) for that particular action. The following code poorly solves the problem by manually disabling the layout for the particular action: ``` $viewModel = new ViewModel(); $viewModel->setTerminal(true); return $viewModel; ``` How can I make my application automatically disable the layout when an AJAX request is detected? Do I need to write a custom strategy for this? Any advice on how to do this is much appreciated. Additionally, I've tried the following code in my app Module.php - it is detecting AJAX correctly but the setTerminal() is not disabling the layout. ``` public function onBootstrap(EventInterface $e) { $application = $e->getApplication(); $application->getEventManager()->attach('route', array($this, 'setLayout'), 100); $this->setApplication($application); $this->initPhpSettings($e); $this->initSession($e); $this->initTranslator($e); $this->initAppDi($e); } public function setLayout(EventInterface $e) { $request = $e->getRequest(); $server = $request->getServer(); if ($request->isXmlHttpRequest()) { $view_model = $e->getViewModel(); $view_model->setTerminal(true); } } ``` Thoughts?

Original source