完全清除表格 collection
Clearing form collection entirely
我对 Symfony 2.6 表单 collections 有疑问。从 collection 中删除元素是有效的,但前提是至少存在一个元素。如果从 DOM 中删除最后一个元素(使 collection 容器为空),则在处理请求后不会从 collection 中删除任何元素。
示例:
我有一个表格 collection "children" 和两个 children,"a" 和 "b"。我从 DOM 中删除 child "b",保存,调用 removeChild,删除 child。现在我也删除 child "a",保存,没有任何反应 - 刷新表单后 child 仍然存在。
在表单处理请求后转储主要实体时,child 也出现在它的 collection 中。
有没有人遇到类似的问题并找到了解决方案?
您可以通过 2 种方法做到这一点:
- 如 symfony 文档中所示:form collection doc
- 或带有学说注释:doctrine orphanRemoval doc
但不要忘记cascade={"remove"}
注释
感谢@Daniel 为我指明了新的方向,我找到了解决方案。提交方法实际上接受第二个参数——清空。然而,传递请求提交已被弃用,并将在 Symfony 3.0 中删除。
Handle request确实其实是支持清空功能的。
根本就不是手动传递,而是基于请求方式。如果方法是 post,clear empty 设置为 true。如果 method 是 patch,则 clear empty 为 false。在我的例子中,方法是补丁,因此是问题。
您可以简单地通过以下方式删除实体集合的所有项目:
$request['collectionName'] = null; //or empty array
$form->submit($request, false);
当此 $request 来自 javascript Ajax 调用时会出现问题:
var item = {field: 'test', collectionName: null};
ajaxPatchRequest(item);
因为接收到的空值是字符串 "null"。如果 collectionName 是一个空数组,它将不会在 ajax 调用中传递。
因此,使用空值并在 $form->submit():
之前应用预处理
$toPatch = array();
foreach($request->request->all() as $key => $value) {
if($value === 'null') {
$toPatch[$key] = null;
} else {
$toPatch[$key] = $value;
}
}
$form->submit($toPatch, false);
我对 Symfony 2.6 表单 collections 有疑问。从 collection 中删除元素是有效的,但前提是至少存在一个元素。如果从 DOM 中删除最后一个元素(使 collection 容器为空),则在处理请求后不会从 collection 中删除任何元素。
示例:
我有一个表格 collection "children" 和两个 children,"a" 和 "b"。我从 DOM 中删除 child "b",保存,调用 removeChild,删除 child。现在我也删除 child "a",保存,没有任何反应 - 刷新表单后 child 仍然存在。 在表单处理请求后转储主要实体时,child 也出现在它的 collection 中。
有没有人遇到类似的问题并找到了解决方案?
您可以通过 2 种方法做到这一点:
- 如 symfony 文档中所示:form collection doc
- 或带有学说注释:doctrine orphanRemoval doc
但不要忘记cascade={"remove"}
注释
感谢@Daniel 为我指明了新的方向,我找到了解决方案。提交方法实际上接受第二个参数——清空。然而,传递请求提交已被弃用,并将在 Symfony 3.0 中删除。 Handle request确实其实是支持清空功能的。 根本就不是手动传递,而是基于请求方式。如果方法是 post,clear empty 设置为 true。如果 method 是 patch,则 clear empty 为 false。在我的例子中,方法是补丁,因此是问题。
您可以简单地通过以下方式删除实体集合的所有项目:
$request['collectionName'] = null; //or empty array
$form->submit($request, false);
当此 $request 来自 javascript Ajax 调用时会出现问题:
var item = {field: 'test', collectionName: null};
ajaxPatchRequest(item);
因为接收到的空值是字符串 "null"。如果 collectionName 是一个空数组,它将不会在 ajax 调用中传递。 因此,使用空值并在 $form->submit():
之前应用预处理$toPatch = array();
foreach($request->request->all() as $key => $value) {
if($value === 'null') {
$toPatch[$key] = null;
} else {
$toPatch[$key] = $value;
}
}
$form->submit($toPatch, false);