我正在处理一个表单扩展,当底层数据不是新的时,它可以禁用表单类型中的某些字段。我这样做是因为我不必为更新/创建单独的表单或事件监听器创建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);
时,它也没有用。我能做些什么来实现这个目标?
答案 0 :(得分:0)