Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Symfony 如何访问嵌套块中由for循环定义的变量(当包含在由use方法调用的水平可重用模板中时)_Symfony_Twig - Fatal编程技术网

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

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。当我

注意:这相当复杂。但是,如果你涉水而过,你将获得奖励,学习有用的信息

我正在使用Twig 1.16中的
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
,该标记非常有效。我尝试将它用于main
Content/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 %}