当我发送带有未选中复选框的表单时,如果相关实体属性等于 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;
编辑:问题的发生是因为表单是使用 提交的PATCH 请求 .
在 Symfony 中,
Form::submit
方法由具有以下行的请求处理程序调用:$form->submit($data, 'PATCH' !== $method);
结果
Form::submit
$clearMissing
参数设置为 false
在 PATCH 请求的情况下,因此将未发送的字段保留为旧值。但我不知道如何解决这个问题。如果我明确地传递一个 JSON
{secret: false}
当复选框未被选中时,Symfony 框架会将其解释为 "false"
字符串并认为这是一个真实的值,因此考虑选中复选框...注意。我有完全相同的问题 使用
choice
的复选框数组字段类型 (与 multiple
和 extended
到 true
)链接到一个 Doctrine 简单数组属性:一旦给定的复选框被发送一次,就不可能将相关属性设置回 false
与后续 unchecked
提交。
最佳答案
非上述没有帮助我。
所以,我正在使用这个......
说明
使用“PATCH”方法时此问题的解决方案是在表单类型内添加额外的隐藏“时间戳”字段,并将其放在 Twig 文件中的问题复选框旁边。这需要与复选框一起传递一些东西,这肯定会改变 - 时间戳会改变。
接下来是使用 PRE_SUBMIT 事件并等待表单字段到达,如果未设置,我会手动设置...工作正常,我不介意额外的代码...
表单类型
$builder
...
->add('some_checkbox')
->add('time_stamp', 'hidden', ['mapped' => false, 'data' => time()])
...
Twig
{{ form_widget(form.time_stamp) }}
{{ form_widget(form.some_checkbox) }}
构建器中的 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
}
});
关于forms - Symfony2 表单未选中的复选框未考虑在内,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35502979/