Мне нужно загрузить макет моего модуля, но не заменять основной макет. Это означает, что я хочу сохранить Application / layout.phtml и загрузить MyModule / layout.phtml, а также хочу загрузить свой action.phtml из моего контроллера.
Все решение вложенной точки компоновки путем замены Application / layout.phtml новым.
Только одно возможное решение, которое я нашел из Вложенные макеты / представления, сохраняющие переменную содержимого в Zend Framework 2 но каждый раз мой контроллер должен реализовывать дополнительный код. Кроме того, это зависит от последующей отправки, что является дополнительной загрузкой процесса.
Есть ли другой чистый способ добиться этого?
переопределив класс 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 / layout.phtml работает как оболочка для вашего модуля. Приведенный выше код будет загружать три разных макета. «основной макет»> «специальный макет модуля»> «шаблон действия»
Других решений пока нет …