30

我有一个简单的问题。

我有一个带有字段的表单,例如:

$builder
    ->add('x')
    ->add('y')
    ->add('z')
;

在我的树枝文件中,我使用了多个块,我想停止渲染字段...我查看 b.html.twig 文件!

一个.html.twig

{% block body %}
    {% block form %}
        {{ form_widget(form) }}
    {% endblock form %}
{% endblock body %}

b.html.twig

{% block form %}
    {{ form.x.set('rendered', true) | default() }}
    {{ parent() }}
{% endblock form %}

如果我删除“default()”我得到错误,该对象不能转换为字符串。实际上,表单会呈现所有字段...包括 x 字段。但他们不应该渲染 x 字段......

先感谢您!

4

3 回答 3

91

我在这里错过了这个问题吗?如果你想将一个字段设置为渲染,即使它不是简单的调用是:

{% do form.x.setRendered %}

如果我误解了,我很抱歉。

于 2013-07-12T12:44:43.833 回答
6

您可以使用下一个关闭表单语句来防止呈现在表单中定义但在模板中未描述的表单字段:

{{ form_end(form, {'render_rest': false}) }}

例如,我们定义下一种形式:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add(
            'id',
            HiddenType::class,
            array(                                     
                'required' => false
            )
        )
        ->add(
            'name',
            TextType::class,
            array(                                     
                'required' => false
            )
        )
        ->add(
            'comment',
            TextType::class,
            array(
                'required' => false
            )
        )
        ->add(
            'amount',
            TextType::class,
            array(
                'required' => false
            )
        );
}

对于这个表单,我们描述了下一个模板,但我们不想渲染 field id,所以我们可以render_restform_endblock 中使用 option 来省略 field 的渲染id

{# render opening form tag #}
{{ form_start(form) }}
{# render field with label #}
{{ form_row(form.name) }}
{# render only field #}
{{ form_widget(form.comment) }}
{# render only label #}
{{ form_label(form.amount) }}

{# render only field #}
{{ form_widget(form.amount) }}

{# if csrf token is enabled for form render field #}
{% if form._token is defined %}
{{ form_widget(form._token) }}
{% endif %}

{# render closing form tag and do not render rest form elements #}
{{ form_end(form, {'render_rest': false}) }}
于 2015-12-23T15:06:10.200 回答
4

您应该通过包含某种决策逻辑来删除(或仅添加)FormType 中的表单字段。

例如检查 cerain 变量的存在/值。

然后可以将该变量注入构造函数中。

从您的模板中删除它是不属于您的模板的应用程序逻辑。

如果没有其他选择,请查看FormView::setRendered()方法。

您可以使用 Twigs属性函数访问对象的方法:

{{ attribute(object, method, arguments) }}
于 2013-05-24T12:09:58.000 回答