2012-07-15 2 views
3

이 같은 컨트롤러에서 데이터를 반환하고 있습니다 :ZF2 : 컨트롤러 템플릿을 레이아웃 템플릿으로 전파하는 방법은 무엇입니까?

/** 
* Password request sent 
* 
* @return array 
*/ 
public function passwordRequestSentAction() 
{ 
    return array(
     'foo' => $this->bar, 
    ); 
} 

그러나 $this->foo 것은

올바른 컨트롤러 내에서 나는에 postDispatch 방법을 만들어야했습니다 passwordRequestSent.phtml/비록 layout.phtml 내에서 null의 경우 내 추상적 인 컨트롤러와 attachDefaultListeners에 링크()와 postDispatch에서이 작업을 수행 :

$e->getViewModel()->setVariables($e->getResult()->getVariables()); 

인가 정말로 w 그 가서 갈래? 레이아웃이나 페이지 템플릿과 상관없이 모든 변수를 공유하고 싶습니다.

+0

호기심 - 왜이 작업을 수행 하시겠습니까? – Fge

+0

@Fge 저는 이것을 위해 자리 표시자를 사용하여 대부분의 필요를 해결했습니다. 하지만 여전히 가끔은 필요성을 느낄 수 있습니다. 예를 들어, 프로젝트의 모든 단일 .phtml은 $ messages 배열을 전달 받아 $ this-> showMessages ($ messages)와 같은 도우미에게 보냅니다. 필자는 뷰 스크립트 전반에 걸쳐 상당한 보일러 코드를 가지고 있으며이를 줄이기 위해 partials (실행 가능한 솔루션을 사용해야하지만 모든 뷰 스크립트를 호출해야 함) 또는 레이아웃에 상용구 코드가 있어야합니다. – Matsemann

+0

예, 모든 페이지에서 공유하고 싶은 레이아웃 헤더에 몇 가지 로직이 있습니다. 모든 페이지에있는 모든 코드와 로직을 레이아웃에 포함시키고 싶었습니다. 필자가 모든 phtml 파일에 메뉴 헤더를 포함시키지 않습니다. –

답변

2

당신은 $this->layout()를 호출하여 레이아웃 템플릿에 액세스 할 수 있습니다

class MyController extends AbstractActionController 
{ 
    public function myAction() 
    { 
     $layout = $this->layout(); 
     // Returns the ViewModel of the Layout 
    } 
} 

자세한 내용은 & 샘플 the manual's examples을 확인합니다.

그러나 대부분의 경우 이러한 작업을위한 viewhelper를 작성하는 것이 좋습니다. 특히 내비게이션/...에 대한 설명은 컨트롤러의 로직을 I want the navigation displayed here 또는 Show me the user's login box과 같은보기 작업에서 캡슐화합니다. 거의 모든 유형의 상태 메시지에 대해 동일하게 적용됩니다.

+0

문서의이 부분을 놓치고 살펴 봅니다. 감사. 첫인상으로 머리말/꼬리말을하는 법을 다시 생각해 볼 필요가 있습니다. –

+0

@MarekNos 다시 생각해 본 결과가 있습니까? – tihe