当我发送带有未选中复选框的表单时,如果相关实体属性等于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请求的情况下,将参数设置为,从而使未发送字段保持其旧值。
但是我不知道如何解决这个问题。如果{secret: false}
在未选中复选框的情况下将JSON显式传递给Symfony框架,它将把它解释为"false"
字符串,并认为该值为真值,因此考虑了选中的复选框...
注意 对于使用choice
链接到Doctrine Simple Array属性的字段类型(带有multiple
和extended
到true
)的复选框数组,我遇到了完全相同的问题:一旦给定的复选框被发送一次,一旦被检查,就无法回退相关属性到false
随后unchecked
提交。
发生此问题的原因是使用PATCH请求提交了表单。
这导致打开了此Symfony问题。
如所解释的,一种解决方法是在未选中复选框时显式发送特定的保留值(例如字符串'__false')(而不是不发送任何内容),并使用以下格式的自定义数据转换器将其替换为'null'类型:
// MyEntityFormType.php -- buildForm method
$builder->add('mycheckbox', ...);
$builder->get('mycheckbox')
->addViewTransformer(new CallbackTransformer(
function ($normalizedFormat) {
return $normalizedFormat;
},
function ($submittedFormat) {
return ( $submittedFormat === '__false' ) ? null : $submittedFormat;
}
));
带有“选择”字段的情况无法以相同的方式解决。这实际上是Symfony的一个错误,已在本期中解决。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句