2011-08-22 74 views
0

是否可以在树枝中获取布局中子模板的名称? 对于实例调用时:树枝主布局中的模板名称

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

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

if page is index.twig => include this javascript 

我能在渲染调用与其他变量做到这一点,但这似乎是臃肿的,因为模板名称会显示它已经。

+0

我认为这个问题几乎相同:https://github.com/fabpot/Twig/issues/350 – ivoba

回答

4

你正在看着这个错误的方式。试想一下,如果你有很多的看法,那么你必须做的每一个:

{% 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的),你也必须调用父():

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

.... 
{% block javascripts %} 
{{ parent() }} 
<script src="asset('index.js')"></script> 
{% endblock %} 

parent()只是确保所有的内容从复制父块也是如此。

+3

用法更改为'_self.getTemplateName()'。 – Sithu

+0

请注意,这会返回一个'Twig_Markup'对象。如果你严格需要一个字符串,那么使用'_self.getTemplateName().__ toString'。 – Alex