如果未选中复选框(= 请求为空),则不处理 Symfony 表单

Symfony-form not treated, if checkboxes are unchecked (= request empty)

我有一个只有两个复选框的表单。当两者都未选中时,request 为空,因此提交的表单不会在控制器中处理。

知道吗,我如何才能 post 在 'unchecked' 复选框的请求中添加内容?

MyChoiceFormType

    [...]

    public function buildForm(FormBuilderInterface $builder, array $options) {

        $builder
            ->add('voucher_buy', CheckboxType::class, [
                'label' => 'buy voucher',
                'data'  => false,               // un-checked as default
                'label_attr' => [
                    'class' => 'switch-custom'  // Bootstrap-toggle (=switch-button)
                ],
            ])
            ->add('voucher_use', CheckboxType::class, [
                'label' => 'use voucher',
                'data'  => false,               // un-checked as default
                'label_attr' => [
                    'class' => 'switch-custom'  // Bootstrap-toggle (=switch-button)
                ],
            ])
        ;
    }

    [...]

控制器

    [...]

    // generate the FORM
    $form = $this->createForm(MyChoiceFormType::class);


    // handle the submitted FORM
    $form->handleRequest($request);

    if ( $form->isSubmitted() && $form->isValid() ) {
        dd($form->getData());   // <-- not getting here, when both checkboxes are unchecked

        // form shall be treated here and then
        // redirect to another page
    }

    [...]

肮脏的骇客

我添加了一个 hidden-field,解决了这个问题。

MyChoiceFormType

    [...]

    public function buildForm(FormBuilderInterface $builder, array $options) {

        $builder
            ->add('voucher_buy', CheckboxType::class, [
                'label' => 'buy voucher',
                'data'  => false,               // un-checked as default
                'label_attr' => [
                    'class' => 'switch-custom'  // Bootstrap-toggle (=switch-button)
                ],
            ])
            ->add('voucher_use', CheckboxType::class, [
                'label' => 'use voucher',
                'data'  => false,               // un-checked as default
                'label_attr' => [
                    'class' => 'switch-custom'  // Bootstrap-toggle (=switch-button)
                ],
            ])
        ;

        // as the from post will be empty, if both checkboxes are unchecked
        // this dummy-field only ensures that at least something is in the
        // posted form
        $builder->add('dummy', HiddenType::class, [
            'data' => 'only_dummy_data',
        ]);
    }

    [...]

我今天学到了一件事:未选中的复选框不会被传输。我不明白为什么,我有一个我需要传输错误值,因为我的意思是用它在 PRE_SUBMIT 上做一些事情。嗯,我有一个 choiceType 而不是复选框,它看起来不太漂亮,但它有效!

有同样的问题,不明白为什么没有未选中的复选框类型的选项值,如 'unchecked_value' => false。

我必须手动检查提交的字段,检查字段是否尚未提交然后我知道它在表单提交中丢失,这意味着它等于 false。

这是我的 class

public function setUncheckedReplacementFields(array $data)
{
    foreach($this as $property => $value){
        if(str_contains('Replacement', $property) !== false){
            if(!in_array($property, $data)){
                $method = sprintf('set%s', ucfirst($property));
                if(method_exists(this, $method)){
                    $this->$method(false);
                }
            }
        }
    }
}

在我坚持形成之前 运行 这个

$object->setUncheckedReplacementFields($request->request->get($form->getName()));

因此,如果字段不是表单的一部分,我知道它已被取消选中,我遍历对象以找到那些复选框并将它们设置为 false,在我未选中的情况下。