【问题标题】:Symfony2 / FOSUserBundle / Twig: Set variable in template to be accessable in LayoutSymfony / FOSUserBundle / Twig:在模板中设置变量以在布局中访问
【发布时间】:2025-11-28 01:15:01
【问题描述】:

我将 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)

关键是我想为我的包的 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' %}

包含在之前 {% 块内容 %} 这不应该显示! {% endblock %}

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

有人知道怎么解决吗?

【问题讨论】:

    标签: php symfony templates twig fosuserbundle


    【解决方案1】:

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

    {% 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 内容文件中的任何位置设置变量,并在内容块结束之前使用它。如果这还不够,请定义 它在更高的水平上。如果您说需要在菜单中使用它,请尝试将其设置在菜单块上方。

    重点是定义的地方..而不是你设置的地方。

    【讨论】:

    • 您好,感谢您的回答!我试过了,但没有用。我的菜单看起来像第一篇文章中的编辑
    • 会不会是我覆盖布局有问题?
    • 嗨,Sepp,对不起,我正在度假。我不这么认为。你真的应该开始把你的变量放在你的布局之上,并尽可能频繁地通过 twig test-wise 来回显它,看看它在模板的哪个部分超出了范围。
    最近更新 更多