方法一:

$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;
    }
}

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注