1

我不知道这是 ZF2 的错误还是我不太了解它,但我很兴奋为什么会发生这种情况。

我正在使用一种解决方案,通过附加 Dispatch 事件来全局更改每个模块的布局。(例如来自http://framework.zend.com/manual/2.1/en/modules/zend.view.quick-start.html#dealing-with-layouts,最后一个例子)

它运行良好,但问题是,在某些操作中我想setTerminate(true); (对于 Ajax 调用)它不会只显示控制器/动作模板的内容,而是只显示没有内容的布局模板!这是我没有预料到的。

这是如何模拟这一点,在调度函数中设置布局(而不是附加事件,以使其更清晰),然后在控制器的操作中设置终止。

public function dispatch(Request $request, Response $response = null)
{
    parent::dispatch($request, $response);
    $this->layout('layout/new');
}   

public function indexAction()
{
    $model = new ViewModel();
    $model->setTerminal(true);
    return $model;
}

同样,我希望这将只显示控制器/索引模板的内容,但不是那样,它只显示布局/新的内容而没有内容。

我试图设置布局,它按我的预期工作。

public function indexAction()
{
    $this->layout('layout/new');

    $model = new ViewModel();
    $model->setTerminal(true);

    return $model;
}

这是有效的,它只显示控制器/索引模板的内容而不是布局。

因此,如果我正在为每个控制器更改全局布局(通过附加调度事件),它会一直工作,直到我想使用这些控制器之一进行 Ajax 调用并使用 setTerminate。

感谢您的帮助。

4

2 回答 2

2

当您将视图模型标记为终端时,调度事件的侦听器将布局视图模型替换为您返回的视图模型。

因此,$this->layout('layout/new');在调度后为时已晚,您正在更改视图模型的模板。

你应该做的是附加监听器。例如,从控制器本身:

protected function attachDefaultListeners()
{
    //do not forget to call parent
    parent::attachDefaultListeners();

    $events = $this->getEventManager();
    //attach before action
    $events->attach(MvcEvent::EVENT_DISPATCH, array($this, 'changeLayout'), 10);
}

public function changeLayout(MvcEvent $event)
{
    $this->layout('layout/new');
}

这将为您的控制器设置布局,但您将能够从操作中更改它setTerminal()并按预期工作

于 2014-01-29T20:11:50.973 回答
0

如果您只想显示操作视图文件中的内容,则可以使用此方法而不会出现问题:

1)为ajax调用创建一个新布局。这将替换 layout.phtml

应用程序/布局/ajax-layout.phtml

<?php echo $this->content ?>

2) 在 Ajax 调用期间修改您的操作以覆盖默认布局

在您的控制器/动作内部:

// Don't render base layout if Ajax call
if($this->getRequest()->isXmlHttpRequest()) {
    $this->layout('application/layout/ajax-layout');
}

$model = new ViewModel();
return $model;

这只会呈现您的操作内容,并覆盖您的基本布局:)

于 2013-03-15T11:38:39.753 回答