假设我们在表单构建器中定义了一个表单,如下所示:
$builder
->add('username', 'text', ['disabled' => false]);
我们可以在创建disabled
实例后更改form.username
字段的属性$form
吗?
我发现您可以使用
获取属性$formBuilder->get('username')->getAttributes('data_collector/passed_options')['data_collector/passed_options']
然后相应地替换为setAttributes
。
但它看起来很脏。
我发现的另一个替代方案是$formBuilder->remove
和->add()
元素。这也是丑陋的。
那么,设置它的任何正确的方法?
场景:表单已构建,然后经过验证,如果它无效,我需要将字段标记为已禁用并再次呈现。
答案 0 :(得分:1)
您应该为此使用表单事件。 FormEvents :: POST_SUBMIT可能是您追求的那个
Check the documentation尤其是dynamic generation for submitted forms,这里有一些很好的例子。
答案 1 :(得分:1)
这是演示如何使用动态表单元素进行操作的简化示例,默认情况下禁用名称字段,仅在提供成员编号时才会启用:
class ExampleType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('member_number', 'integer', array(
'required' => false
));
$f = function(FormEvent $event) {
$form = $event->getForm();
$data = $event->getData();
$attr = array('disabled' => true);
if (isset($data) && $data['member_number']) {
unset($attr['disabled']);
}
$form->add('name', 'text', $attr);
};
$builder->addEventListener(FormEvents::PRE_SET_DATA, $f);
$builder->addEventListener(FormEvents::PRE_SUBMIT, $f);
}
答案 2 :(得分:1)
我可能错了,但我认为您可以使用buildView
并在那里更新。
public function buildView(FormView $view, FormInterface $form, array $options)
{
$view->offsetGet('username')->vars['disabled'] = false;
}