Symfony 4 DateType 已删除禁用 jquery 但未提交数据
Symfony 4 DateType removed disabled with jquery but data not submitted
我在一个设置为 disabled=true 的表单上有一个 DateType 字段。当用户选中一个特定的复选框时,一些 jquery 将其选中并从 html 中删除禁用的 属性 但该值仍未通过表单提交。
只是想知道在 symfony 中是否有更好的方法来完成这个?除非用户选中复选框,否则需要为用户禁用日期字段。字段添加如下:
$builder->add('overrideDate',DateType::class,[
'required'=>false,
'label'=>'Override Date',
'disabled'=>true
]);
我确实尝试通过 SUBMIT 事件更改它,以便 symfony 识别该字段已启用,因为 html 不再禁用该字段,该字段仍应提交,所以我假设它是 symfony 忽略它因为原来的 disabled =true ?
这是构建器的一部分,我试图在提交到 disabled = false 时更改日期字段,但 overrideDate 仍然为 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)
]);
});
你应该看看这里:https://symfony.com/doc/current/form/dynamic_form_modification.html
这是做您想做的事的好方法!您应该使用 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"。此属性启用与 "disabled" 相同的功能,但是当 symfony 获取您的表单数据时,它会考虑 "readonly" 输入。
您可以像这样在表单构建器中添加输入:
$builder->add('overrideDate',DateType::class,[
'required'=>false,
'label'=>'Override Date',
'attr' => ['readonly' => true],
]);
我在一个设置为 disabled=true 的表单上有一个 DateType 字段。当用户选中一个特定的复选框时,一些 jquery 将其选中并从 html 中删除禁用的 属性 但该值仍未通过表单提交。
只是想知道在 symfony 中是否有更好的方法来完成这个?除非用户选中复选框,否则需要为用户禁用日期字段。字段添加如下:
$builder->add('overrideDate',DateType::class,[
'required'=>false,
'label'=>'Override Date',
'disabled'=>true
]);
我确实尝试通过 SUBMIT 事件更改它,以便 symfony 识别该字段已启用,因为 html 不再禁用该字段,该字段仍应提交,所以我假设它是 symfony 忽略它因为原来的 disabled =true ?
这是构建器的一部分,我试图在提交到 disabled = false 时更改日期字段,但 overrideDate 仍然为 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)
]);
});
你应该看看这里:https://symfony.com/doc/current/form/dynamic_form_modification.html
这是做您想做的事的好方法!您应该使用 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"。此属性启用与 "disabled" 相同的功能,但是当 symfony 获取您的表单数据时,它会考虑 "readonly" 输入。 您可以像这样在表单构建器中添加输入:
$builder->add('overrideDate',DateType::class,[
'required'=>false,
'label'=>'Override Date',
'attr' => ['readonly' => true],
]);