2017-10-24 5 views
1

저는 Symfony 2.8을 처음 사용하는 초보자입니다. 내가이 배열 예를 들어렌더링 방법 사용자 정의 symfony

IndexController.php on line 18: 
array:6 [▼ 
    "code" => "Home" 
    "parent" => "master" 
    "labels" => array:1 [▼ 
    "en_US" => "Home" 
    ] 
    "mainMenu" => false 
    "footerMenu" => false 
    "headerMenu" => true 
] 

있습니다에는 mainMenu가 true로 설정되어있을 때, 나는 mainMenu.html.twig를 표시해야합니다. 이 방법

나는이 배열

public function indexAction(Request $request, $locale, $page) { 
    $pageContent = $this->container->get("pimc_akeneo_cms_page_content_builder"); 
    $akeneoConnector = $this->container->get("pimc_akeneo_cms_backend_connector"); 
    $html = $pageContent->build($page, $locale); 

    $elements = $akeneoConnector->getCategoryList($page); 

    if($elements['mainMenu'] == true){ 
     $this->render('base/mainMenu.html.twig'); // I have problem in here 
    } 
    if($elements['headerMenu'] == true){ 
     $this->render('base/headerMenu.html.twig'); // I have problem in here 
    } 
    if($elements['footerMenu'] == true){ 
     $this->render('base/footerMenu.html.twig'); // I have problem in here 
    } 

    return $this->render('base/index.html.twig', ["content" => $html]); 
} 

를 호출하고 난 기본 응용 프로그램/자원 /보기/기본 /에 headerMenu.html.twig, footerMenu.html.twig 및 mainMenu.html.twig 있습니다. 이것은 정말 쉬운 문제인 것처럼 보이지만 해결할 수는 없습니다. 문제는 예를 들어 mainMenu.html.twig가 true로 설정된 경우 작성하는 구문입니다. 어떻게 표시 할 수 있습니까?

+0

return $ this-> render ... –

+0

예, 이미 시도했습니다. 그리고 나서 예를 들어 mainMenu.html.twig를 반환하고 그것이 내가 원하는 것이 아닙니다. – FortuneSoldier

+0

괜찮 았으면 나뭇 가지보기 아래에이 조건부로드 템플릿을 만들어야합니다. –

답변

3

우선 return $this->render()Symfony\Component\HttpFoundation\Response 인스턴스의 형태로 HTTP 응답을 반환합니다. 이는 symfony의 컨트롤러에있는 모든 *Action 메서드에서 필요합니다. 그 은 요청 당 하나 이상의 응답을 반환 할 수없고 return이없는 $this->render()도 Symfony에 아무런 영향을 미치지 않는다고 말했습니다. 귀하의 경우에는

이 같은 뷰 레이어에 템플릿 논리를 표시 이동해야합니다 :

당신 또는 당신의 base/index.html.twig

{% if elements['mainMenu'] is defined and elements['mainMenu'] is same as(true) %} 
    {% include 'base/mainMenu.html.twig' %} 
{% endif %} 

{% if elements['headerMenu'] is defined and elements['headerMenu'] is same as(true) %} 
    {% include 'base/headerMenu.html.twig' %} 
{% endif %} 

etc... 

에서 indexAction

return $this->render('base/index.html.twig', [ 
    "content" => $html, 
    "elements" => $elements // pass this to template 
]); 

(경우에만 경우에 동일한 DOM의 위치에 렌더링 할 수있는 대체 템플릿이 여러 개 있음) :

{% for tmpl in ['mainMenu', 'headerMenu', 'footerMenu'] %} 
    {% if elements[tmpl] is defined and elements[tmpl] is same as(true) %} 
    {% include 'base/' ~ tmpl ~ '.html.twig' %} 
    {% endif %} 
{% endfor %} 

16,은 그래서 당신은 문제의 더 나은 MVC 분리를 유지 템플릿에 그 논리를 넣고 지금은 뷰가 렌더링 할 그 메뉴가 모든 컨트롤러에 그 논리를 반복 할 필요가 없습니다. 변수 $elements 만 전달하면됩니다.

+0

이 게시물을 좋아합니다. –