【问题标题】:Nested Layout Implementation in Zend Framework 2Zend Framework 2 中的嵌套布局实现
【发布时间】:2015-01-25 06:32:00
【问题描述】:
【问题讨论】:
标签:
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 作为你的模块的包装器。上面的代码将加载三种不同的布局。 “主布局”>“模块特定布局”>“动作模板”