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
上述都没有帮助我。所以,我正在使用这个...
解释
使用“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)
| 归档时间: |
|
| 查看次数: |
10259 次 |
| 最近记录: |