树枝主要布局中的模板名称

时间:2011-08-22 09:15:42

标签: php symfony twig

是否可以在 twig 中获取布局中子模板的名称? 例如,在调用时:

$app['twig']->render('index.twig');

然后在 layout.twig 中,这是主要的布局,应该问:

if page is index.twig => include this javascript

我可以在渲染调用中使用其他变量来执行此操作,但这似乎很臃肿,因为模板名称已经指示它。

1 个答案:

答案 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()只是确保从父块中复制所有内容。