是否可以在 twig 中获取布局中子模板的名称? 例如,在调用时:
$app['twig']->render('index.twig');
然后在 layout.twig 中,这是主要的布局,应该问:
if page is index.twig => include this javascript
我可以在渲染调用中使用其他变量来执行此操作,但这似乎很臃肿,因为模板名称已经指示它。
答案 0 :(得分:5)
你正在以错误的方式看待这个问题。想象一下,如果你有很多观点,那么你必须为每个观点做到这一点:
{% if _self.getTemplateName() == 'index.twig' %}
<script src="{{ asset('somescript1') }}"></script>
{% endif %}
{% if _self.getTemplateName() == 'members.twig' %}
<script src="{{ asset('somescript2') }}"></script>
{% endif %}
{% if _self.getTemplateName() == 'news.twig' %}
<script src="{{ asset('somescript3') }}"></script>
{% endif %}
...
我发现这种方法非常糟糕。您可以在主布局文件中执行的操作(假设此示例中的'layout.html.twig')是一个块:
{% block javascripts %}
{% endblock %}
然后,在您的视图文件中:
{% extends 'AcmeHelloBundle::layout.html.twig' %}
....
{% block javascripts %}
<script src="asset('index.js')"></script>
{% endblock %}
基本上,您使用新内容覆盖布局文件中的块。如果您在'layout.html.twig'中有任何内容(例如jquery),您还必须调用parent():
{% extends 'AcmeHelloBundle::layout.html.twig' %}
....
{% block javascripts %}
{{ parent() }}
<script src="asset('index.js')"></script>
{% endblock %}
parent()
只是确保从父块中复制所有内容。