Symfony 从嵌入模板扩展父块

Symfony 从嵌入模板扩展父块,symfony,twig,Symfony,Twig,我想在布局中的样式和脚本块中注入新值,但来自嵌入块。 当然,它会抛出错误禁止在块外调用“parent”。。 有什么解决办法吗 layout.html.twig: <!DOCTYPE html> <html> <head> {% block style %} <link rel="stylesheet" href="foo.css"> {% endblock %} </he

我想在布局中的样式和脚本块中注入新值,但来自嵌入块。 当然,它会抛出错误
禁止在块外调用“parent”。
。 有什么解决办法吗

layout.html.twig:

<!DOCTYPE html>
<html>
    <head>
        {% block style %}
            <link rel="stylesheet" href="foo.css">
        {% endblock %}
    </head>
    <body>

        {% block content "" %}

        {% block scripts %}
            <script src="foo.js"></script>
        {% endblock %}

    </body>
</html>
{% extends 'layout.html.twig' %}

{% block content %}
    {% embed datatable.html.twig %}
        {% block tbody %}
            <tr>
                <td>my awesome table</td>
            </tr>
        {% endblock %}
    {% endembed %}
{% endblock %}
<table id="myDatatable">
    <tbody>
        {% block tbody "" %}
    </tbody>
</table>

{% block styles %}
    {{ parent() }}
    <link rel="stylesheet" href="dataTables.css">
{% endblock %}

{% block scripts %}
    {{ parent() }}
    <script src="dataTables.js"></script>
{% endblock %}

{%块样式%}
{%endblock%}
{%块内容“”%}
{%block scripts%}
{%endblock%}
list.html.twig:

<!DOCTYPE html>
<html>
    <head>
        {% block style %}
            <link rel="stylesheet" href="foo.css">
        {% endblock %}
    </head>
    <body>

        {% block content "" %}

        {% block scripts %}
            <script src="foo.js"></script>
        {% endblock %}

    </body>
</html>
{% extends 'layout.html.twig' %}

{% block content %}
    {% embed datatable.html.twig %}
        {% block tbody %}
            <tr>
                <td>my awesome table</td>
            </tr>
        {% endblock %}
    {% endembed %}
{% endblock %}
<table id="myDatatable">
    <tbody>
        {% block tbody "" %}
    </tbody>
</table>

{% block styles %}
    {{ parent() }}
    <link rel="stylesheet" href="dataTables.css">
{% endblock %}

{% block scripts %}
    {{ parent() }}
    <script src="dataTables.js"></script>
{% endblock %}
{%extends'layout.html.twig%}
{%block content%}
{%embed datatable.html.twig%}
{%block tbody%}
我那张很棒的桌子
{%endblock%}
{%endembed%}
{%endblock%}
datatable.html.twig:

<!DOCTYPE html>
<html>
    <head>
        {% block style %}
            <link rel="stylesheet" href="foo.css">
        {% endblock %}
    </head>
    <body>

        {% block content "" %}

        {% block scripts %}
            <script src="foo.js"></script>
        {% endblock %}

    </body>
</html>
{% extends 'layout.html.twig' %}

{% block content %}
    {% embed datatable.html.twig %}
        {% block tbody %}
            <tr>
                <td>my awesome table</td>
            </tr>
        {% endblock %}
    {% endembed %}
{% endblock %}
<table id="myDatatable">
    <tbody>
        {% block tbody "" %}
    </tbody>
</table>

{% block styles %}
    {{ parent() }}
    <link rel="stylesheet" href="dataTables.css">
{% endblock %}

{% block scripts %}
    {{ parent() }}
    <script src="dataTables.js"></script>
{% endblock %}

{%block tbody”“%}
{%block styles%}
{{parent()}}
{%endblock%}
{%block scripts%}
{{parent()}}
{%endblock%}
(我不能/不会在
list.html.twig
中使用块
脚本
样式
。它们是datatable模板的一部分,在
list.html.twig
中定义主题没有任何意义)。 遗憾的是,我不能使用
use
,因为这个函数不支持动力学属性,只支持字符串

:

由于use语句独立于传递给模板的上下文进行解析,因此模板引用不能是表达式


如评论中所述,includes/embeds不能从其includes更改块。 也就是说,有一个扩展可以解决您的问题

可以找到此
延迟的细枝扩展

基本上,节点推迟所述块的执行。 通过这种方式,您可以创建一个包含所有javascript链接的变量并输出它们。这可以在github上的示例中看到


制作此扩展的功劳

includes/embeds无法更改/更改模板中包含它的块似乎是一种有趣的方式,在一个完美的世界中,我不希望为此使用任何捆绑包