Symfony表单主题避免块输出并在块中使用自定义变量

时间:2015-06-13 19:10:00

标签: symfony twig symfony-forms

一个。我想渲染表单并使用表单主题。但我创建的块直接在我的doctype之前输出隐藏的输入字段。但我只想在表单(表单)函数中进行渲染。

B中。另外,我不能在块中使用 {{template}} 变量或在块外创建的其他变量?模板变量由控制器创建。

{# FORM THEME #}
{% form_theme form _self %}
{% block _my_form_example__token_widget %}
    {% set type = type|default('hidden') %}
    <input data-test="is-this-render" type="{{ type }}" {{ block('widget_attributes') }} value="{{ 
    render_esi(
            controller(
                    'MyController:Form:token',
                    { 'form': template }  {# template variable can't be accessed here?? #}
             )
     ) }}" />
{% endblock %}

<!doctype html>
<html>
<head>
    <title>Basic Form</title>
</head>
<body>
    <h1>Basic Form {{ template }}</h1>{# This output works #}
    {{ form(form) }}
</body>
</html>

输出如下:

<input data-is-rendered="test" type="hidden"  value="...." /> <!-- this should not be here -->
<!doctype html>
<html>
    <head>
    <title>Basic Form</title>
</head>
<body>
    <h1>Basic Form template_variable_content</h1><!-- {{ template }} works here -->

    <form ....>
    <!-- ... --->
    <input data-is-rendered="test" type="hidden"  value="...." /> <!-- Render Correct when no template variable is used -->
    <!-- ... --->
    </form>
</body>
</html>

1 个答案:

答案 0 :(得分:1)

我认为你误解了Twig中块的使用。当模板使用extends扩展另一个模板时,您可以使用block标记来定义将替换父模板中某些命名区域的区域。

由于您的模板不会扩展另一个模板,因此您对block标记的使用只是告诉Twig您希望子模板能够通过定义名为的块来替换模板的该部分&#34; _my_form_example__token_widget&#34;

Symfony documentation for form theming中,您会注意到他们以所有重要的extends标记开始示例。

{% extends 'base.html.twig' %}

{% form_theme form _self %}

{% block integer_widget %}
    <div class="integer_widget">
        {% set type = type|default('number') %}
        {{ block('form_widget_simple') }}
    </div>
{% endblock %}

{% block content %}
    {# ... render the form #}

    {{ form_row(form.age) }}
{% endblock %}

即使他们的示例文件扩展的基本模板与表单主题无关,但它只是一个子模板切换block标签来定义要替换的区域并使它们定义可用于替换的区域。简单地使模板扩展为基础可以解决使用此块时所描述的所有问题。

但是,我建议你使用所描述的方法来创建一个外部文件来保存你的主题,这样你就可以更容易地保持你的表单在页面之间保持一致,并将所有表单主题保存在一个中央您和其他可能处理您的代码的人将能够在以后找到它的位置。