Symfony 4日期类型已删除,已禁用jquery,但未提交数据
我在表单上有一个DateType字段,设置为disabled=true。当用户选中某个特定的复选框时,一些jquery会将其选中并从html中删除禁用的属性,但表单仍不会提交该值 只是想知道在symfony中是否有更好的方法来实现这一点?除非用户选中复选框,否则需要为用户禁用日期字段。添加的字段如下所示:Symfony 4日期类型已删除,已禁用jquery,但未提交数据,symfony,symfony4,Symfony,Symfony4,我在表单上有一个DateType字段,设置为disabled=true。当用户选中某个特定的复选框时,一些jquery会将其选中并从html中删除禁用的属性,但表单仍不会提交该值 只是想知道在symfony中是否有更好的方法来实现这一点?除非用户选中复选框,否则需要为用户禁用日期字段。添加的字段如下所示: $builder->add('overrideDate',DateType::class,[ 'required'=>false,
$builder->add('overrideDate',DateType::class,[
'required'=>false,
'label'=>'Override Date',
'disabled'=>true
]);
我确实尝试过通过提交事件对其进行更改,以便symfony将该字段识别为已启用,因为html不再禁用该字段。该字段仍应被提交,因此我假设是symfony忽略该字段,因为原始的disabled=true
这是构建器的一部分,我试图在日期字段提交到disabled=false时更改它,但覆盖的日期仍然为null
$builder->add('overrideDates',CheckboxType::class,[
'label'=>'Override Dates',
'required'=>false
]);
$builder->add('overrideDate',DateType::class,[
'required'=>false,
'label'=>'Override Date',
'disabled'=>true
]);
$builder->addEventListener(FormEvents::SUBMIT,function(FormEvent $event){
$form = $event->getForm();
$data = $form->getData();
if($data->isOverridingDates()){
$form->add('overrideDate',DateType::class,[
'required'=>false,
'label'=>'Override Date',
'disabled'=>false
]);
}
});
解决方案
好吧,这感觉有点笨重,但它适合我想做的事情:
// event listener to enable/disable the overrideDate field if overrideDates === true
$builder->addEventListener(FormEvents::PRE_SUBMIT,function(FormEvent $event){
// get form and data
$form = $event->getForm();
$data = $event->getData();
// add the overridedDate field back into the form
$form->add('overrideDate',DateType::class,[
'required'=>false,
'label'=>'Override Date',
'disabled'=>((bool)$data['overrideDates'] === true ? false : true)
]);
});
你应该看看这里: 这是做你想做的事的好方法!您应该使用FormEvents::PRE_SUBMIT而不是FormEvents::SUBMIT
// event listener to enable/disable the overrideDate field if overrideDates === true
$builder->addEventListener(FormEvents::PRE_SUBMIT,function(FormEvent $event){
// get form and data
$form = $event->getForm();
$data = $event->getData();
// add the overridedDate field back into the form
$form->add('overrideDate',DateType::class,[
'required'=>false,
'label'=>'Override Date',
'disabled'=>((bool)$data['overrideDates'] === true ? false : true)
]);
});
我有一个更简单的解决方案,您必须使用HTML属性“readOnly”。此属性启用与“禁用”相同的功能,但当symfony获取表单数据时,它会考虑“只读”输入。 您可以在表单生成器中添加输入,如下所示:
$builder->add('overrideDate',DateType::class,[
'required'=>false,
'label'=>'Override Date',
'attr' => ['readonly' => true],
]);
嘿,这就是我所做的,使用FormEvents::SUBMIT并重新添加了disabled=false的字段,但它仍然在DateType字段中提交NULL。我已更新我的问题以显示代码。它确实启用了字段,但它会通过整个验证过程,并使用修改的字段重新显示表单,而不是允许提交的数据通过。如果使用FormEvents::PRE_SUBMIT,会发生什么?我已经使用了它,用解决方案更新了我的问题。我唯一不喜欢的是$data此时不是实体对象,而是数组,所以复选框是“1”,而不是实体拥有的布尔值-因此我必须键入cast。将此标记为正确答案。@Nicolas请编辑您的答案并添加更多信息。链接将随着时间的推移而中断。