完全清除表格 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 种方法做到这一点:

但不要忘记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);