2017-10-24 2 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

リターンのようにすべての場合にリターンを使用する$ this-> render ... –

+0

はい、私はすでにそれを試みました。 そして、たとえばmainMenu.html.twigを返します。これは私が望むものではありません。 – FortuneSoldier

+0

[OK]をクリックすると、小枝ビューのテンプレートのこの条件付ロードを行う必要があります。 –

答えて

3

まず、return $this->render()は、Symfony\Component\HttpFoundation\Responseという形式でHTTP応答を返します。このレスポンスは、symfonyのコントローラーのすべてのメソッドで必要です。その を持っていると、returnなしで$this->render()を除いて、1つのリクエストに対して複数の返答を返すことはできないと言われ、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 %} 

ですから、懸念のより良いMVC分離を維持し、今、あなたはビューがレンダリングされるこれらのメニューを持っているすべてのコントローラにそのロジックを繰り返す必要はありません、あなたのテンプレートでそのロジックを置きます。変数$elementsを渡すだけです。

+0

この投稿は気に入りましたか? –

関連する問題