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

Symfony form theme avoid block output and use custom variables in block

一个。我想呈现一个表单并使用 表单主题 。但是我创建的块是在创建隐藏输入字段的文档类型之前直接输出的。但我只希望它在 form(form) 函数中呈现。

乙。我也不能 使用 {{ 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>

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

因为你的模板没有扩展另一个模板,所以你使用 block 标签只是告诉 Twig 你希望子模板能够通过定义一个名为的块来替换模板的那部分“_my_form_example__token_widget”。

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 标签从定义要替换的区域切换并使它们定义了可用于替换的区域。简单地让你的模板扩展一个基础应该可以解决你描述的所有使用这个块的问题。

不过,我真的建议您使用所描述的方法来创建一个外部文件来保存您的主题,这样您就可以更轻松地使您的表单在页面之间保持一致,并将所有表单主题内容保存在一个中心位置,您和任何其他可能使用您的代码的人以后都可以找到它。