方法一:
$sharedEvents = $app->getEventManager()->getSharedManager();
$sharedEvents->attach('ZendMvcControllerAbstractController','dispatch', function($e) {
$result = $e->getResult();
$request = $e->getApplication()->getRequest();
if ($result instanceof ViewModel && $request->getQuery('modal') !== null) {
$result->setTerminal(true);
}
});
在模块初始化的时候进行设置, 分发的时候就禁用。
方法二:
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);
}
}
方法三:
分发到动作之前进行设置
use ZendViewModelViewModel;
ZendMvcControllerAbstractActionController;
class AjaxController extends AbstractActionController
{
protected $viewModel;
public function onDispatch(MvcEvent $mvcEvent)
{
$this->viewModel = new ViewModel; // Don't use $mvcEvent->getViewModel()!
$this->viewModel->setTemplate('ajax/response');
$this->viewModel->setTerminal(true); // Layout won't be rendered
return parent::onDispatch($mvcEvent);
}
public function someAjaxAction()
{
$this->viewModel->setVariable('response', 'success');
return $this->viewModel;
}
}