Zend Framework 2中的嵌套布局实现

时间:2014-11-26 19:33:45

标签: php templates layout view zend-framework2

我需要加载模块的布局,但不能替换主布局。这意味着我想保留Application / layout.phtml并想加载MyModule / layout.phtml,我也想从我的控制器加载我的action.phtml。

嵌套布局的所有解决方案都是用新的替换Application / layout.phtml。

我从Nesting layouts/views keeping the content variable in Zend Framework 2找到了一个可能的解决方案,但每次我的控制器都需要实现一些额外的代码。此外,它依赖于后期调度,这是额外的过程负载。

有没有其他干净的方法来实现它?

1 个答案:

答案 0 :(得分:0)

通过覆盖默认的ViewModel类 -

namespace MyModule\Extension;
use Zend\View\Model\ViewModel;
class MyModuleViewModel extends ViewModel {
    private $innerTemplate;
    private $myLayout = 'my-module/layout/layout';
    public function setTemplate($template) {
        $this->template = $this->myLayout;
        $myTemplate = (string) $template;
        $this->innerTemplate = new ViewModel($this->variables);
        $this->innerTemplate->setTemplate($myTemplate);
        $this->innerTemplate->parent=$this;
        $this->addChild($this->innerTemplate);
        return $this;
    }
    public function setLayout($layout) {
        $this->myLayout = $layout;
        return $this;
    }
    public function setVariable($pName, $pVar){
        if(isset($this->innerTemplate)) $this->innerTemplate->setVariable($pName, $pVar);
        return parent::setVariable($pName, $pVar);
    }
    public function setVariables($variables, $overwrite=NULL){
        if(isset($this->innerTemplate)){
            if(isset($overwrite)) $this->innerTemplate->setVariables($variables, $overwrite);
            else $this->innerTemplate->setVariables($variables);
        }
        if(isset($overwrite)) return parent::setVariables($variables, $overwrite);
        else return parent::setVariables($variables);
    }
}

如果您将布局文件放入模块视图根目录下的“layout”文件夹中,它的工作正常。如果你想要一个不同的布局,那么你需要调用setLayout('my-module / layout / mobile.phtml');

现在在您的控制器中,您需要使用此自定义视图模型,如下所示 -

public function indexAction() {
    /* your action code in your controller */
    return new MyModuleViewModel();
}

此布局/ layout.phtml用作模块的包装器。上面的代码将加载三种不同的布局。 “主要布局”> “模块特定布局”> “行动模板”