【发布时间】:2013-07-23 18:15:10
【问题描述】:
我想在不同的页面中包含一个小部件,并让在此子模板中定义的相关脚本与其他脚本一起在页面末尾自动发生,而无需执行多个包含。
我尝试在包含的子模板中使用 block 并在 base.html.twig 中定义的块中添加一些脚本,以便这些脚本将在页面末尾加载。
在 base.html.twig 我有
<html><body>
<div>{% block content %}{% endblock %}</div>
<aside>{% block aside %}{% endblock %}</aside>
...
{% block javascripts %}
<script src="..."></script>
<script src="..."></script>
...
{% endblock %}
{% block widgetInlineScript %}{% endblock %}
</body></html>
我有一个模板 profile.html.twig 扩展了 base.html.twig 并且看起来如此
{% extends '::base.html.twig' %}
{% block content %}
...
{% endblock %}
{% block aside %}{% include 'ApplicationRcBundle:include:promo/adSpace_topRight.html.twig' %}{% endblock %}
在 include/widget.html.twig 中,我无法使用 {% block javascripts %}{{ parent() }} ...,因为它本身并没有扩展任何东西,因此使用 parent() 失败。相反,我使用了一个特定的块。
{% block widgetInlineScript %}
<script type="text/javascript" id="widgetInlineScript" >
...
</script>
{% endblock %}
Twig 可以很好地编译模板,但在 DOM 中仅在小部件之后渲染脚本,而不是在页面末尾渲染它来代替 {% block widgetInlineScript %}。
那么可以在包含的子模板中使用block 吗?
谢谢
【问题讨论】:
-
有什么问题? Twig 是这样定义的(包含有自己的范围,否则很难维护)。您可以使用其中的 javascript 创建另一个模板并将其包含在块
widgetInlineScript中(就像您为aside块所做的那样)。 -
感谢 Thomas,但其目的是测试是否可以在不同页面中包含一个小部件,并在其中定义相关脚本与其他脚本一起发生在页面末尾。跨度>
-
@svassr 我现在看到你的冲突,你真的需要在最后渲染吗?脚本有多大?
-
不是那么大(大约 130 行),所以我正在考虑将它与小部件分开并将其带到 base.html.twig 中的基本 js 集合中,所以它是随处可见。
-
我还尝试定义一个 twig 全局变量,我将其视为一个数组并 merge 所有小部件脚本最终在该数组上循环并在最后转储所有脚本的页面。但正如你所说,包含有它自己的范围,即使我能够设置它在 base.html.twig 的范围中不可用的值。
标签: symfony include block twig