从嵌入模板扩展父块

时间:2017-03-09 17:47:24

标签: symfony twig

我想在我的布局新值中注入样式和脚本块,但是来自嵌入块。 当然它会引发错误Calling "parent" outside a block is forbidden.。 有没有解决方法?

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>

list.html.twig:

{% extends 'layout.html.twig' %}

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

datatable.html.twig:

<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 %}

(我不能/不会在scripts中使用块styleslist.html.twig。它们是数据表模板的一部分,在定义主题时不会有任何感觉。 list.html.twig)。 遗憾的是我不能使用use因为这个函数不支持动态属性,只支持字符串。

From the doc

  

因为use语句的解析与传递给模板的上下文无关,所以模板引用不能是表达式。

1 个答案:

答案 0 :(得分:2)

正如评论中所说,include / embeds不能改变其包含者的块。 也就是说有一个扩展可以解决你的问题。

可以找到此Deferred Twig Extension here

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

Eugene Leonovich提供此延期