Twig:包含另一个模板的块

时间:2017-12-24 12:41:50

标签: symfony twig

我想只包含另一个模板的某个块的内容。是否可以只访问块的内容而不是整个文件?

据我所见,embedinclude始终包含并输出整个文件。 use导入所有块,显然(?)目标文件需要硬编码,不能是传递给模板的表达式或变量。这是对的吗?

2 个答案:

答案 0 :(得分:7)

使用宏https://twig.symfony.com/doc/2.x/tags/macro.html

渲染块模板(由web profiler使用):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. 工具栏
  4. 然后根据需要的时间呈现每个块。

    工具栏示例:vendor / symfony / symfony / src / Symfony / Bundle / WebProfilerBundle / Resources / views / Profiler / 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 -->
    

答案 1 :(得分:4)

使用partials将是更好的解决方案。我不认为可以block访问templates中另一个twig的{​​{1}},我总是需要重复部分template我创建partial对他们来说。

部分可以遵循不同的路径,例如_partials/Header.twig.html 您也可以使用变量{% include '_partials/Header.twig.html' with {bar: 'foo'}%}

将其包含在模板中