首页 > 解决方案 > Symfony 4 DateType 已被 jquery 禁用但未提交数据

问题描述

我在设置为 disabled=true 的表单上有一个 DateType 字段。当用户选中一个特定的复选框时,一些 jquery 会选择它并从 html 中删除 disabled 属性,但该值仍然没有被表单提交。

只是想知道在 symfony 中是否有更好的方法来实现这一点?除非他们选中复选框,否则需要为用户禁用日期字段。字段添加如下:

$builder->add('overrideDate',DateType::class,[
            'required'=>false,
            'label'=>'Override Date',
            'disabled'=>true

        ]);

我确实尝试通过 SUBMIT 事件更改它,以便 symfony 将该字段识别为已启用,因为 html 不再具有禁用该字段仍然应该被提交,所以我假设它是 symfony 忽略它,因为原来的禁用=真?

这是构建器的一部分,我试图在提交到 disabled = false 时更改日期字段,但 overrideDate 仍然为空

$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)

            ]);

        });

标签: symfonysymfony4

解决方案


你应该看看这里: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)
    ]);
});

推荐阅读