Php Zend Framework 2设置自定义布局和设置终止问题
我不知道这是否是ZF2的一个bug,或者我只是不太理解它,但是我很兴奋为什么会发生这种情况 我正在使用一个解决方案,通过附加一个分派事件来全局更改每个模块的布局。(例如,来自,最后一个示例) 它工作得很好,但问题是,在某些动作中,我想设置终止(true)(对于Ajax调用)它不仅显示控制器/动作模板的内容,而且只显示没有内容的布局模板!这是我没有预料到的Php Zend Framework 2设置自定义布局和设置终止问题,php,zend-framework2,zend-view,Php,Zend Framework2,Zend View,我不知道这是否是ZF2的一个bug,或者我只是不太理解它,但是我很兴奋为什么会发生这种情况 我正在使用一个解决方案,通过附加一个分派事件来全局更改每个模块的布局。(例如,来自,最后一个示例) 它工作得很好,但问题是,在某些动作中,我想设置终止(true)(对于Ajax调用)它不仅显示控制器/动作模板的内容,而且只显示没有内容的布局模板!这是我没有预料到的 public function indexAction() { $this->layout('layout/new');
public function indexAction()
{
$this->layout('layout/new');
$model = new ViewModel();
$model->setTerminal(true);
return $model;
}
这就是如何模拟这种情况,在分派函数中设置布局(而不是附加事件,以使其更干净),然后在控制器的操作中设置终止
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;
}
同样,我希望这将只显示Controller/index模板的内容,但与此相反,它只显示layout/new的内容,而不显示内容
我试着在行动中设置布局,它按照我的预期工作
public function indexAction()
{
$this->layout('layout/new');
$model = new ViewModel();
$model->setTerminal(true);
return $model;
}
这是可行的,它只显示控制器/索引模板的内容,而不显示布局
因此,如果我正在更改每个控制器的全局布局(通过附加分派事件),它将一直工作,直到我想使用其中一个控制器进行Ajax调用并使用setTerminate
感谢您的帮助。如果您只想显示“操作”视图文件中的内容,您可以使用这种方法,而不会出现问题: 1) 为ajax调用创建一个新的布局。这将替换layout.phtml
<?php echo $this->content ?>
application/layout/ajax-layout.phtml
<?php echo $this->content ?>
这将只呈现您的操作内容,并覆盖您的基本布局:)当您将视图模型标记为终端时,dispatch事件上的侦听器将用返回的视图模型替换布局视图模型 所以现在做
$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()
将按预期工作。为了澄清,您可以从操作本身更改布局。但这将是硬编码的东西,甚至不属于那里。如何改变视图本身的布局?