Symfony2 / FOSUserBundle / Twig:在模板中设置变量,以便在Layout中访问

时间:2014-10-21 17:57:11

标签: php symfony templates twig fosuserbundle

我使用Symfony2框架和FOSUserBundle。我通过覆盖一些FOSUserBundle模板来修改布局。这非常有效! 唯一的问题是我无法在我的模板中设置变量来扩展FOSUserBundle中被我自己的模板覆盖的模板。很难描述,但我尝试了:

我正在覆盖Registration / register_content.html.twig,如下所示:

{% trans_default_domain 'FOSUserBundle' %}
{% set section='register' %}

<h1>{{ 'Anmeldung'|trans }}</h1>
<form action="{{ path('fos_user_registration_register') }}" {{ form_enctype(form) }} method="POST">
    {{ form_widget(form) }}
    <div>
        <input type="submit" value="{{ 'registration.submit'|trans }}" />
    </div>
</form>

(/家/西蒙/服务器/ HTML /门户/应用/资源/ FOSUserBundle /视图/注册/ register_content.html.twig)

关键是我要为我的bundle的layout.html.twig设置section变量以突出显示菜单中的当前部分。这适用于我的常规模板(不会被FOSUserBundle覆盖)

我还覆盖了FOSUserBundle中的layout.html.twig:

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

{% block content %}
    {% block fos_user_content %}{% endblock %}
{% endblock %}

(/家/西蒙/服务器/ HTML /门户/应用/资源/ FOSUserBundle /视图/ layout.html.twig)

如果我在该布局文件中设置我的变量direclty,它就可以工作。但那不是我想要的。

我该如何解决这个问题?

其他信息:

我的菜单看起来像这样

<ul class="nav nav-pills menu">

    {% if section is not defined %} 
        {% set section = '__dummy_undefined' %} 
    {% endif %}

    <li{% if section == 'home' %} class="active"{% endif %}><a href="{{ path('home') }}">    {{ 'general.home'|trans }}</a></li>  
    <li{% if section == 'search' %} class="active"{% endif %}><a href="{{ path('search') }}">{{ 'general.search'|trans }}</a></li>
    <li{% if section == 'events' %} class="active"{% endif %}><a href="{{ path('events') }}">{{ 'general.calendar'|trans }}</a></li>          
    <li{% if section == 'register' %} class="active"{% endif %}><a href="{{ path('fos_user_registration_register') }}">{{ 'general.register'|trans }}</a></li>
</ul> 

因此变量在使用之前就已定义。 该菜单包含在menu.html.twig文件中,该文件包含如下:

{% include 'DancePortalFrontendBundle::headline.html.twig' %}

包括来之前     {%block content%}         永远不应该显示!     {%endblock%}

但即使我在内容块之后或内容块中执行include,我也没有得到我在register_content.html.twig中设置的section值

有人知道如何解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

问题是您的变量不属于您尝试访问的当前范围。这意味着您在以下块中定义了变量:

{% block fos_user_content %}{% endblock %}

..它可能无法在模板中其他位置的菜单块中使用。

当您以后尝试访问该变量时,它已经消失(超出范围)。你能做的就是使用这个方便的功能:

  

默认情况下,块可以访问外部作用域(http://twig.sensiolabs.org/doc/tags/extends.html

中的变量

在主布局中或在相对于当前模板变为全局的任何位置定义变量:

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

{% block content %}
    {# 
        I did it here but you can really set it anywhere. The point is: 
        From now on the variable exists and will only be deleted when the
        content block closes.
    #}
    {% set hightlighted_section = '' %} 
    {% block fos_user_content %}{% endblock %}
{% endblock %}

我不知道您的确切用例,但在此示例中,您可以在FOSUserBundle内容文件中的任何位置设置变量,并在内容块结束之前使用它。如果这还不够,请定义 它在更高的层次上。如果您在菜单中说需要它,请尝试在菜单块上设置一个块。

关键在于它被定义的地方..而不是你设置的地方。