Symfony 如何访问嵌套块中由for循环定义的变量(当包含在由use方法调用的水平可重用模板中时)
注意:这相当复杂。但是,如果你涉水而过,你将获得奖励,学习有用的信息 我正在使用Twig 1.16中的Symfony 如何访问嵌套块中由for循环定义的变量(当包含在由use方法调用的水平可重用模板中时),symfony,twig,Symfony,Twig,注意:这相当复杂。但是,如果你涉水而过,你将获得奖励,学习有用的信息 我正在使用Twig 1.16中的use方法来包含一个可重用的模板,这样我就可以扩展块(如果包含模板,你就不能这样做) 我有一个名为Cms/ListBase.html.twig的模板,它使用use语句包含一个可重用的模板Cms/includes/ListBase include.html.twig。然后我有一个名为Cms/ContentList.html.twig的模板,它扩展了Cms/ListBase.html.twig。当我
use
方法来包含一个可重用的模板,这样我就可以扩展块(如果包含模板,你就不能这样做)
我有一个名为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
语句的同一个文件中覆盖块,它允许我覆盖它们,但是当我调用for
中块内的变量时,变量无法访问
Cms/includes/ListBase Include.html.twig
重新使用的布局
Content/ContentList.html.twig
扩展ListBase.html.twig
并成功访问设置该变量的for
循环中listRow
块内的实体
变量的文件
不参考列表行
块中的实体
,页面呈现并正确显示引用的使用
模板中包含的所有html布局。并且成功地覆盖了这些块
但是,当引用实体
时,它会给出错误:
Variable "entity" does not exist in GutensiteCmsBundle::View\ViewVersionEdit.html.twig
在此上下文中,实体
变量不存在于块中
我试着先声明列表块
,然后在块之外扩展其他块。这仍然会覆盖块,但对缺少的变量没有帮助
{% block listBlock %}
{{ parent() }}
{% endblock listBlock %}
{% block listRow %}
{# All the code here #}
{% endblock listRow %}
我也尝试过使用和不使用parent()
调用,但没有达到预期效果
本质上存在一个我不理解的范围问题,当块从使用use
方法的同一模板扩展时,它会影响块。基于您的用例:
我正在使用Twig1.16中的use方法,以便以一种可以扩展块的方式包含一个可重用的模板(如果包含该模板,则不能这样做)
我建议您只需使用嵌入
来源:twig.sensiolabs.org/doc/tags/embed.html
您可以使用embed标记覆盖/扩展块。对于视图/ViewVersionEdit.html.twig
,该标记非常有效。我尝试将它用于mainContent/ContentList.html.twig
,但似乎无法扩展具有嵌入的模板并修改嵌入区域。但是它可以在原始上下文中使用use
语句,这样就可以了。该方法的另一个问题是如何从嵌入框架中嵌入样式表或脚本。我想我可以做一个额外的include(不理想,但比复制/粘贴相同的代码要好),但在第一个上下文中,它使用use
方法,使用的模板需要调用{%block link%}
来注入扩展模板…不确定它是否有帮助,但您可以执行{block('blockname')}
在给定位置渲染块。除此之外,我不知道如何提供帮助,但我非常确定,通过使用、包含、嵌入和扩展的组合,它是可以解决的。
{% extends 'GutensiteCmsBundle:Cms:ListBase.html.twig' %}
{% block listRow %}
<tr>
<td class="title">{{ entity.title }}</td>
<td class="status">{{ entity.isPublished }}</td>
</tr>
{% endblock listRow %}
{% 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 %}
Variable "entity" does not exist in GutensiteCmsBundle::View\ViewVersionEdit.html.twig
{% block listBlock %}
{{ parent() }}
{% endblock listBlock %}
{% block listRow %}
{# All the code here #}
{% endblock listRow %}