Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Zend Framework 2设置自定义布局和设置终止问题_Php_Zend Framework2_Zend View - Fatal编程技术网

Php Zend Framework 2设置自定义布局和设置终止问题

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');

我不知道这是否是ZF2的一个bug,或者我只是不太理解它,但是我很兴奋为什么会发生这种情况

我正在使用一个解决方案,通过附加一个分派事件来全局更改每个模块的布局。(例如,来自,最后一个示例)

它工作得很好,但问题是,在某些动作中,我想设置终止(true)(对于Ajax调用)它不仅显示控制器/动作模板的内容,而且只显示没有内容的布局模板!这是我没有预料到的

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()
将按预期工作。

为了澄清,您可以从操作本身更改布局。但这将是硬编码的东西,甚至不属于那里。如何改变视图本身的布局?