2014-11-26 2 views
1

모듈의 레이아웃을로드해야하지만 기본 레이아웃을 바꾸지 않아야합니다. 즉, Application/layout.phtml을 유지하고 MyModule/layout.phtml을로드하려는 경우 컨트롤러에서 action.phtml을로드하려고합니다.Zend Framework 2의 중첩 된 레이아웃 구현

Application/layout.phtml을 새로운 것으로 대체하여 중첩 된 레이아웃 포인트의 모든 솔루션을 제공합니다.

내가 찾을 수있는 유일한 해결책은 Nesting layouts/views keeping the content variable in Zend Framework 2이지만 내 컨트롤러를 사용할 때마다 추가 코드를 구현해야합니다. 또한 추가 프로세스로드 인 post-dispatch에 의존합니다.

달성하기위한 다른 방법이 있습니까? 재정의 기본 뷰 모델 클래스에 의해

답변

0

- 당신이 당신의 모듈의 뷰 루트, 그 작품을 잘에서 "레이아웃"폴더로 레이아웃 파일을 넣으면

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')을 호출해야합니다.

이제 컨트롤러를 int로는 다음과 같은 방법처럼이 사용자 정의보기 모델을 사용합니다 -

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

이 레이아웃/layout.phtml은 모듈의 래퍼로 작동합니다. 위의 코드는 세 가지 다른 레이아웃을로드합니다. "main layout"> "모듈 별 레이아웃"> "액션 템플릿"

관련 문제