Symfony2 表单未选中的复选框未考虑在内,为什么?

Sil*_*pur 3 forms checkbox symfony

当我发送带有未选中复选框的表单时,如果相关实体属性等于true,则它不会更改为false

反之亦然(当发送带有选中复选框的表单时将属性设置为 true)效果很好,所有表单其他字段也保存。

以下是我构建表单并声明相关属性的方法:

// --- Form creation function EntityType::buildForm() ---
$builder->add('secret', 'checkbox', array( 'required' => false ));

// --- Entity related property, Entity.php file ---
/** @ORM\Column(name="secret", type="boolean") */
protected $secret;
Run Code Online (Sandbox Code Playgroud)

编辑:出现此问题是因为表单是使用PATCH request提交的。

在 Symfony 中,该Form::submit方法由请求处理程序使用以下行调用:

$form->submit($data, 'PATCH' !== $method);
Run Code Online (Sandbox Code Playgroud)

因此,在 PATCH 请求的情况下,该Form::submit $clearMissing参数被设置为,从而将未发送字段保留为其旧值。false

但我不知道如何解决这个问题。{secret: false}如果我在未选中复选框时显式地将 JSON 传递给 Symfony 框架,它会将其解释为"false"字符串并认为是一个真值,从而考虑选中的复选框...


注意。我对使用链接到 Doctrine Simple Array 属性的字段类型( with和to )的复选框数组choice有完全相同的问题:一旦给定的复选框被选中一次,就不可能设置回相关属性与后续提交。multipleextendedtruefalseunchecked

Vla*_*cic 6

上述都没有帮助我。所以,我正在使用这个...

解释

使用“PATCH”方法时此问题的解决方案是在表单类型内添加额外的隐藏“时间戳”字段,并将其放在 twig 文件中的问题复选框旁边。这需要与复选框一起传递一些东西,这肯定会改变 - 时间戳会改变。

接下来的事情是使用 PRE_SUBMIT 事件并等待表单字段到达,如果未设置,我会手动设置它......工作正常,我不介意额外的代码......

表单类型

$builder
...
->add('some_checkbox')
->add('time_stamp', 'hidden', ['mapped' => false, 'data' => time()])
...
Run Code Online (Sandbox Code Playgroud)

枝条

{{ form_widget(form.time_stamp) }}
{{ form_widget(form.some_checkbox) }}
Run Code Online (Sandbox Code Playgroud)

构建器中的 PRE_SUBMIT 事件

$builder->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) use($options) {

    $data = $event->getData();
    $form = $event->getForm();

    if (!$data) {
        return;
    }
    /* Note that PATCH method is added as an option for "createForm" 
     * method, inside of your controller 
    */       
    if ($options["method"]=="PATCH" && !isset($data['some_checkbox'])) {
        $form->getData()->setSomeCheckbox(false);//adding missing checkbox, since it didn't arrive through submit.. grrr
    }            
});
Run Code Online (Sandbox Code Playgroud)