我有一个简单的问题。
我有一个带字段的表单,例如:
$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场......
提前谢谢!
答案 0 :(得分:74)
我在这里错过了这个问题吗?如果你想将一个字段设置为渲染,即使它不是简单的调用:
{% do form.x.setRendered %}
如果我误解了,我的道歉。
答案 1 :(得分:5)
您可以使用下一个结束表单语句来阻止呈现在表单中定义但未在模板中描述的表单字段:
{{ 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
,因此我们可以在render_rest
块中使用选项form_end
来省略字段{{1 }}:
id
答案 2 :(得分:3)
您应该通过包含某种决策逻辑来删除(或仅添加)FormType中的表单字段。
例如检查一个cerain变量的存在/值。
然后可以在构造函数中注入此变量。
从模板中删除它的应用程序逻辑不属于您的模板。
如果没有其他选择,请查看FormView::setRendered()方法。
您可以使用Twigs attribute function访问对象的方法:
{{ attribute(object, method, arguments) }}