Symfony2 -> Twig -> 表单 -> 字段 -> 设置 rendered = true

30

我有一个简单的问题。

我有一个表单,其中包含一个字段,例如:

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

在我的twig文件中,我使用了多个块,并且希望停止呈现字段...我查看了b.html.twig文件!

a.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字段...

提前感谢!

3个回答

95

我是否理解错了问题?如果你想将一个字段设置为已呈现,即使它不是简单调用的方法是:

{% do form.x.setRendered %}

如果我误解了,我道歉。


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
            )
        );
}

对于这个表单,我们描述了下一个模板,但是我们不想呈现字段id,因此我们可以在form_end块中使用选项render_rest来省略呈现字段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}) }}

4
如果你加上解释的话,这个回答会更好。 - johnnyRose
1
但是这适用于所有字段。对于_csrf_token,您需要手动添加_csrf字段来记住它。 - Tom
1
这是一个更好的答案,但我们必须记得在模板中添加 {{ form_widget(form._token) }} - A.Seddighi

4

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

例如,检查某个变量的存在/值。

然后可以在构造函数中注入此变量。

将其从模板中删除是应用程序逻辑,不属于模板。

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

您可以使用Twig的attribute function访问对象的方法:

{{ attribute(object, method, arguments) }}

问题是,我使用了一个包含“form_widget(form)”作为默认值的全局表单主题。我需要在底部添加一个字段,因此我会将rendered = true设置为真。然后我可以在底部使用它,我的全局主题就不会渲染该字段... - PatrickB
我更新了我的回答...你的确切问题是如何手动调用表单中一行的setRendered()方法? - Nicolai Fröhlich
问题是如何使用twig(仅限)来实现这一点^^目前我使用了一个自制的twig函数:public function renderState(FormView $field) { $field->setRendered(true); } - PatrickB

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接