2017-12-24 20 views
2

別のテンプレートの特定のブロックの内容のみを含めたいと思います。ファイル全体ではなくブロックの内容にのみアクセスできますか?小枝:別のテンプレートのブロックを含む

私が見る限り、embedincludeは常にファイル全体を含めて出力します。そしてuseはすべてのブロックをインポートし、明らかに(?)宛先ファイルをハードコードする必要があり、テンプレートに渡される式や変数にすることはできません。あれは正しいですか?

答えて

2

(ウェブプロファイラで使用される)ブロックテンプレートをレンダリングするマクロhttps://twig.symfony.com/doc/2.x/tags/macro.html

を使用しても、テンプレートでこれを含めることができます。https://twig.symfony.com/doc/2.x/functions/block.html

{{ block("title", "common_blocks.twig") }} 

symfony WebProfiler - ブロックとテンプレートの面白い使用

symfonyのWebProfilerそれが良い例です:

ベンダー/ symfonyの/ symfonyの/ SRC/symfonyの/バンドル/ WebProfilerBundle /リソース/ビュー/コレクタ/ request.html.twig

各プロファイラービューテンプレートを持っています3つのブロック:

  1. メニュー
  2. パネル
  3. ツールバー

その後、必要に応じて各ブロックをレンダリングします。

ツールバー例:ベンダー/ symfonyの/ symfonyの/ SRC/symfonyの/バンドル/ WebProfilerBundle /リソース/ビュー/プロファイラー/ toolbar.html.twig

<!-- START of Symfony Web Debug Toolbar --> 
<div id="sfMiniToolbar-{{ token }}" class="sf-minitoolbar" data-no-turbolink> 
    <a href="#" title="Show Symfony toolbar" tabindex="-1" id="sfToolbarMiniToggler-{{ token }}" accesskey="D"> 
     {{ include('@WebProfiler/Icon/symfony.svg') }} 
    </a> 
</div> 
<div id="sfToolbarClearer-{{ token }}" class="sf-toolbar-clearer"></div> 

<div id="sfToolbarMainContent-{{ token }}" class="sf-toolbarreset clear-fix" data-no-turbolink> 
    {% for name, template in templates %} 
     {% if block('toolbar', template) is defined %} 
      {% with { 
       collector: profile.getcollector(name), 
       profiler_url: profiler_url, 
       token: profile.token, 
       name: name, 
       profiler_markup_version: profiler_markup_version, 
       csp_script_nonce: csp_script_nonce, 
       csp_style_nonce: csp_style_nonce 
       } %} 
       {{ block('toolbar', template) }} 
      {% endwith %} 
     {% endif %} 
    {% endfor %} 

    <a class="hide-button" id="sfToolbarHideButton-{{ token }}" title="Close Toolbar" tabindex="-1" accesskey="D"> 
     {{ include('@WebProfiler/Icon/close.svg') }} 
    </a> 
</div> 
<!-- END of Symfony Web Debug Toolbar --> 
+0

よさそうだブロックを、レンダリング。奇妙なことに私は早くそれを見つけられませんでした。ブロックが別のファイルにある場合、そのファイルパスを変数として渡すことができますか?それとも直接文字列としてハードコードする必要がありますか? – tungsten

+1

この例では、ファイルを変数として渡す方法とブロック名を見ることができます – albert

3

partialsを使用すると、より良い解決策になります。私はそれ以外のtemplatesblockにアクセスすることはできないと思っていますが、いつもtemplateの部分を再利用する必要があります。私はpartialを作成します。

パーシャルは_partials/Header.twig.html のように、異なるパスをたどることができそして、あなたは変数{% include '_partials/Header.twig.html' with {bar: 'foo'}%}

関連する問題