当包含在由use方法调用的水平可重用模板中时,如何在嵌套块内访问由for循环定义的变量

时间:2014-11-27 01:48:24

标签: symfony twig

注意:这非常复杂。但如果你趟过它,你将获得奖励,以学习有关horizontal reuse of templates in Twig, with the use method的有用信息!

我正在使用Twig 1.16中的use方法,以便以允许我扩展块的方式包含可重用模板(如果您include模板,则无法执行此操作)。

我有一个名为Cms/ListBase.html.twig的模板,它使用use语句来包含可重复使用的模板Cms/includes/ListBase-Include.html.twig。然后我有一个名为Cms/ContentList.html.twig的模板,它扩展了Cms/ListBase.html.twig。当我这样做时,我可以轻松覆盖Cms/includes/ListBase-Include.html.twig中的块,当我这样做时,可以访问for循环中块中的值。

但是,如果我尝试直接在使用use语句的同一文件中覆盖块,它会让我覆盖它们,但是当我调用{{1内部的块内的变量时变量无法访问。

CMS /包括/的ListBase-Include.html.twig

重复使用的布局。

for

CMS / ListBase.html.twig

使用include。

的布局
{% block listBlock %}
    {% block listData %}
            <div id="listContainer" class="table-responsive">
                <table class="list table table-striped table-hover table-condensed">
                    <thead>
                        <tr>
                        {% block listHead %}
                            <th class="type"> Name </th>
                            <th class="title"> Title </th>
                            <th class="status"> Status </th>
                            <th class="action">Action</th>
                        {% endblock listHead %}
                        </tr>
                    </thead>
                    <tbody>
                    {#
                    NOTE: Normally, any template that extends the listRow, has access to 
                    the 'entity' variable that is within the 'for loop' scope. However, if 
                    this include is accessed with the 'use' and then tried to extend in the
                    same file, it doesn't have access to `entity`.
                    #}


                    {% for entity in view.data.list %}
                        {% block listRow %}
                            <tr>
                                <td class="type"> [Insert Data] </td>
                                <td class="title"> [Insert Data] </td>
                                <td class="status"> [Insert Data] </td>
                                <td class="action"> [Insert Actions] </td>
                            </tr>
                        {% endblock listRow %}
                    {% endfor %}

                    </tbody>
                </table>
            </div>
    {% endblock listData %}

{% endblock listBlock %}

内容/ ContentList.html.twig

扩展# Include the reusable listBlock #} {% use 'GutensiteCmsBundle:Cms:includes/ListBase-Include.html.twig' %} {# Include the reusable List Block via "use" statement above #} {% block listBlock %} {{ parent() }} {% endblock listBlock %} 的文件,并成功访问设置该变量的ListBase.html.twig循环内entity块内的listRow变量。 / em>的

for

查看/ ViewVersionEdit.html.twig

直接使用{% extends 'GutensiteCmsBundle:Cms:ListBase.html.twig' %} {% block listRow %} <tr> <td class="title">{{ entity.title }}</td> <td class="status">{{ entity.isPublished }}</td> </tr> {% endblock listRow %} 的文件,就像Cms/includes/ListBase-Include.html.twig一样,但它也会尝试覆盖ListBase.html.twig块中的listRow块。它可以做得很好,但在这种情况下它无法访问listBlock属性。

entity

如果不参考{% extends 'GutensiteCmsBundle:View:ViewEditBase.html.twig' %} {# Include the reusable List Block #} {% use 'GutensiteCmsBundle:Cms:includes/ListBase-Include.html.twig' with link as list_link, script as list_script %} {# Include the reusable listBlock blocks via "use" statement above #} {% block listBlock %} {{ parent() }} {% block listHead %} <th class="revision">Revision</th> <th class="modified">Modified</th> <th class="published">Publish Date</th> <th class="notes">Notes</th> {% endblock listHead %} {# NOTE: This extends the listRow which is inside a for loop that loops through view.data.list as entity. In a normal template that extends Cms/ListBase.html.twig, the value of the loop is accessible in the listRow block. But since this is extending the listRow from the "use" statement it's a little different. #} {% block listRow %} <tr> <td class="revision"> #{{ entity.viewId }}-{{ entity.id }} </td> <td class="modified"> {{ entity.timeMod | localizeddate('medium', 'short', 'en') }} </td> <td class="published"> {{ entity.timePublish | localizeddate('medium', 'short', 'en') }} </td> <td class="notes"> {{ entity.versionNotes }} </td> </tr> {% endif %} {% endblock listRow %} {% endblock listBlock %} 块中的entity,该页面会呈现并正确显示所引用的listRow模板中包含的所有html布局。并且块被成功覆盖。

但是,当引用use时,它会给出错误:

entity

在此上下文中,Variable "entity" does not exist in GutensiteCmsBundle::View\ViewVersionEdit.html.twig 变量不存在于块中。

我首先尝试声明entity,然后再将其他块扩展到块之后。这仍然会覆盖块,但它对丢失的变量没有帮助。

listBlock

我也尝试过{% block listBlock %} {{ parent() }} {% endblock listBlock %} {% block listRow %} {# All the code here #} {% endblock listRow %} 来电,但没有达到预期的效果。

基本上存在一个我不理解的范围问题,当它们从使用parent()方法的同一模板扩展时会影响这些块。

1 个答案:

答案 0 :(得分:1)

根据您的使用案例:

  

我正在使用Twig 1.16中的 use 方法,以便以允许我扩展块的方式包含可重用模板(如果你包括模板)。

我建议您只使用嵌入

来源:twig.sensiolabs.org/doc/tags/embed.html

您可以使用 embed 标记覆盖/扩展块。