在运行时更改字段属性

时间:2015-04-16 02:36:23

标签: php symfony

假设我们在表单构建器中定义了一个表单,如下所示:

    $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()元素。这也是丑陋的。

那么,设置它的任何正确的方法?

场景:表单已构建,然后经过验证,如果它无效,我需要将字段标记为已禁用并再次呈现。

3 个答案:

答案 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;
}