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

ivo*_*oba 0 php symfony twig

twig中是否可以在布局中获取子模板的名称?举例来说:

$app['twig']->render('index.twig');
Run Code Online (Sandbox Code Playgroud)

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

if page is index.twig => include this javascript
Run Code Online (Sandbox Code Playgroud)

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

Nem*_*vić 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 %}
...
Run Code Online (Sandbox Code Playgroud)

我发现这种方法非常糟糕.您可以在主布局文件中执行的操作(假设此示例为'layout.html.twig')是一个块:

{% block javascripts %}
{% endblock %}
Run Code Online (Sandbox Code Playgroud)

然后,在您的视图文件中:

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

....
{% block javascripts %}
<script src="asset('index.js')"></script>
{% endblock %}
Run Code Online (Sandbox Code Playgroud)

基本上,您使用新内容覆盖布局文件中的块.如果您在'layout.html.twig'中有任何内容(例如jquery),您还必须调用parent():

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

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

parent() 只是确保从父块中复制所有内容.

  • 用法改为`_self.getTemplateName()`. (3认同)
  • 请注意,这将返回一个 `Twig_Markup` 对象。如果你严格需要一个字符串,那么使用`_self.getTemplateName().__toString`。 (2认同)