Реализация вложенного макета в Zend Framework 2

Мне нужно загрузить макет моего модуля, но не заменять основной макет. Это означает, что я хочу сохранить Application / layout.phtml и загрузить MyModule / layout.phtml, а также хочу загрузить свой action.phtml из моего контроллера.

Все решение вложенной точки компоновки путем замены Application / layout.phtml новым.

Только одно возможное решение, которое я нашел из Вложенные макеты / представления, сохраняющие переменную содержимого в Zend Framework 2 но каждый раз мой контроллер должен реализовывать дополнительный код. Кроме того, это зависит от последующей отправки, что является дополнительной загрузкой процесса.

Есть ли другой чистый способ добиться этого?

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);
}
}

если вы поместите свой файл макета в папку «layout» под корнем представления вашего модуля, он работает нормально. если вам нужен другой макет, вам нужно вызвать setLayout (‘my-module / layout / mobile.phtml’);

Теперь в вашем контроллере вам нужно использовать эту модель представления следующим образом:

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

этот файл layout / layout.phtml работает как оболочка для вашего модуля. Приведенный выше код будет загружать три разных макета. «основной макет»> «специальный макет модуля»> «шаблон действия»

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]