首页 文章

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

提问于
浏览
0

我使用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>

(/home/simon/server/html/portal/app/Resources/FOSUserBundle/views/Registration/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 %}

(/home/simon/server/html/portal/app/Resources/FOSUserBundle/views/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

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

    {% block fos_user_content %}{% endblock %}
    

    ..it可能在您的模板中的其他位置的菜单块中不可用 .

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

    默认情况下,块可以访问外部作用域中的变量(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内容文件中的任何位置设置变量,并在内容块结束之前使用它 . 如果这还不够,请在更高级别定义它 . 如果您在菜单中说需要它,请尝试在菜单块上设置一个块 .

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

相关问题