禁用PRE_SET_DATA symfony2上的表单

时间:2014-09-27 15:55:39

标签: php forms symfony

我正在处理一个表单扩展,当底层数据不是新的时,它可以禁用表单类型中的某些字段。我这样做是因为我不必为更新/创建单独的表单或事件监听器创建forms.ie:我创建实体创建表单,如果底层实体不是new,扩展将禁用选项表示的字段。我将事件监听器绑定到PRE_SET_DATA事件:

class RemoveFieldsExtension extends AbstractTypeExtension{
public function buildForm(FormBuilderInterface $builder, array $options)
{
    if (!$options['disable_on_update']) {
        return;
    }

    $isNewCallback = $options['disable_on_update_is_new'];
    $em = $this->em;
    $builder->addEventListener(FormEvents::PRE_SET_DATA, function(FormEvent $event) use ($em, $isNewCallback, $builder){
            if(is_bool($isNewCallback))
                return $isNewCallback;

            if(is_callable($isNewCallback)){
                $isNew = call_user_func($isNewCallback, $event->getData(), $em);
                if(!$isNew){//the check for resolving if this is an update form or creation form
                 //   $builder->setDisabled(true);
                    $form = $event->getForm();
                    $form->getConfig()->setDisabled(true);
                }
            }
        },
        -200
    );

}
}

扩展工作正常,问题是上面的代码会产生'一旦将构建器转换为FormConfigInterface实例,就无法访​​问FormConfigBuilder方法。'
  当我尝试$builder->setDisabled(true);时,它也没有用。我能做些什么来实现这个目标?

1 个答案:

答案 0 :(得分:0)

好消息和坏消息。

坏消息:你不能这样做。

好消息:您可以采用不同的方式,请参阅类似的问题:https://stackoverflow.com/a/14346520/1205171