Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Symfony 4日期类型已删除,已禁用jquery,但未提交数据_Symfony_Symfony4 - Fatal编程技术网

Symfony 4日期类型已删除,已禁用jquery,但未提交数据

Symfony 4日期类型已删除,已禁用jquery,但未提交数据,symfony,symfony4,Symfony,Symfony4,我在表单上有一个DateType字段,设置为disabled=true。当用户选中某个特定的复选框时,一些jquery会将其选中并从html中删除禁用的属性,但表单仍不会提交该值 只是想知道在symfony中是否有更好的方法来实现这一点?除非用户选中复选框,否则需要为用户禁用日期字段。添加的字段如下所示: $builder->add('overrideDate',DateType::class,[ 'required'=>false,

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

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

$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请编辑您的答案并添加更多信息。链接将随着时间的推移而中断。