【问题标题】:Nested Layout Implementation in Zend Framework 2Zend Framework 2 中的嵌套布局实现
【发布时间】:2015-01-25 06:32:00
【问题描述】:

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

嵌套布局点的所有解决方案,将Application/layout.phtml替换为新的。

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

还有其他干净的方法可以实现吗?

【问题讨论】:

    标签: php templates layout view zend-framework2


    【解决方案1】:

    通过覆盖默认 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);
        }
    }
    

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

    现在进入你的控制器,你需要像下面这样使用这个自定义视图模型 -

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-22
      • 1970-01-01
      • 1970-01-01
      • 2012-10-22
      • 1970-01-01
      相关资源
      最近更新 更多