【问题标题】:Zend Framework 2 set custom layout and setTerminate issueZend Framework 2 设置自定义布局和 setTerminate 问题
【发布时间】:2013-03-14 21:17:19
【问题描述】:

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

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

它运行良好,但问题是,当我想在某些操作中 setTerminate(true);(用于 Ajax 调用)时,它不会只显示 controller/action 的内容em> 模板,但只是没有内容的布局模板!而这正是我所没有预料到的。

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

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

再次,我希望这将只显示 controler/index 模板的内容,但不是那样,它只显示 layout/new 的内容而没有内容.

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

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

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

    return $model;
}

这是有效的,它只显示 controller/index 模板的内容而不是布局。

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

感谢您的帮助。

【问题讨论】:

    标签: php zend-framework2 zend-view


    【解决方案1】:

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

    所以在调度之后再做$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() 将按预期工作

    【讨论】:

      【解决方案2】:

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

      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;
      

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

      【讨论】:

      • 为了澄清,您可以从动作本身更改布局。但这将是对甚至不属于那里的东西进行硬编码。
      • 如何改变视图本身的布局?
      猜你喜欢
      • 2012-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-26
      • 2012-10-22
      • 1970-01-01
      • 2013-01-30
      相关资源
      最近更新 更多