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],
    ]);