我的目标:我有一个SYMFONY FORM,其字段应为disabled:true
。当表单被提交时,具有属性disabled:true
的字段不会在表单中发送,并且因此在成功提交后(字段中的值为空),它不会出现在表单上。
我读到我可以使用readonly:true
属性,但它不适合(我喜欢我的只读在屏幕上用灰色背景识别)。
所以我去了SYMFONY FORM EVENTS:我做了一些阅读并改变了MyEntityType Class:
class MyEntityType extends AbstractType {
public function buildForm(FormBuilderInterface $builder, array $options){
$builder>add('....',....,array(...));
$builder>add('email',EmailType::class,array('attr'=>array('disabled'=>true,'readonly'=>true)));
$builder->add('submit',SubmitType::class,array('label'=>'Submit'));
$builder->addEventListener(FormEvents::PRE_SUBMIT, function(FormEvent $event){
$formToAlter = $event->getForm();
$viewData = $event->getForm()->getViewData();
$data = $event->getData();
dump($event);
dump($viewData);
dump($data);
$formToAlter->add('email',EmailType::class,array('attr'=>array('readonly'=>true,'data'=>$viewData->getEmail())));
});
}
...other AbstractType functions...
}
在与PRE_SUBMIT事件绑定的Listener函数中有一些实验。
我认为我可以在PRE_SUBMIT事件中删除disabled:true
属性并使字段EMAIL中的值通过FORM,以便使用我的原始值再次填写字段EMAIL在所有SUBMIT过程结束后。
我注意到,$event->getData()
是表单的SUBMITED字段的数组,因此,在那一点(在PRE_SUBMIT事件中),在该数组中我找不到我的EMAIL,它已经是丢弃,因为该字段具有属性disabled:true
。我想也许我可以更改$event->getData()
的数组值以强制将disabled:true
显示的字段中的值整合,但我不知道该怎么做。
我也尝试对POST_SET_DATA事件采取行动,如:
$builder->addEventListener(FormEvents::POST_SET_DATA, function(FormEvent $event){
$formToAlter = $event->getForm();
$formToAlter->add('email',EmailType::class,array('attr'=>array('readonly'=>true)));
});
但它确实在SUBMIT之前显示没有属性disabled:true
的字段EMAIL。
因此我不知道因为 POST_SET_DATA看起来太早了,而且PRE_SUBMIT似乎迟到才能控制我想要的东西。
有没有人有线索?