我需要加载模块的布局,但不能替换主布局。这意味着我想保留Application / layout.phtml并想加载MyModule / layout.phtml,我也想从我的控制器加载我的action.phtml。
嵌套布局的所有解决方案都是用新的替换Application / layout.phtml。
我从Nesting layouts/views keeping the content variable in Zend Framework 2找到了一个可能的解决方案,但每次我的控制器都需要实现一些额外的代码。此外,它依赖于后期调度,这是额外的过程负载。
有没有其他干净的方法来实现它?
答案 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用作模块的包装器。上面的代码将加载三种不同的布局。 “主要布局”> “模块特定布局”> “行动模板”