【问题标题】:Clearing form collection entirely完全清除表单集合
【发布时间】:2015-06-06 03:19:02
【问题描述】:

我对 Symfony 2.6 表单集合有疑问。从集合中删除元素有效,但仅在至少存在一个时。如果从 DOM 中移除最后一个元素(使集合容器为空),则在处理请求后不会从集合中移除任何元素。

例子:

我有一个包含集合“children”和两个孩子“a”和“b”的表单。我从 DOM 中删除子“b”,保存,调用 removeChild,删除子。现在我也删除了孩子“a”,保存,没有任何反应 - 刷新表单后孩子仍然存在。 在表单处理完请求后转储主实体时,子实体也存在于它的集合中。

有没有人遇到过类似的问题并找到了解决办法?

【问题讨论】:

  • 可以给我们看一些代码吗?

标签: symfony symfony-forms formcollection


【解决方案1】:

感谢@Daniel 为我指明了新的方向,我找到了解决方案。方法 submit 实际上接受第二个参数 - 清除为空。然而,传递请求提交已被弃用,并将在 Symfony 3.0 中删除。 处理请求确实实际上支持清空功能。 它根本不是手动传递的,而是基于请求方法。如果方法是 post,则 clear empty 设置为 true。如果方法是补丁,则清空为假。在我的情况下,方法是补丁,因此问题。

【讨论】:

  • 我也有类似的问题。您找到 PATCH 方法的解决方案了吗?
  • 我找到了解决办法
  • 非常感谢,我遇到了完全相同的问题……文档应该对此发出警告,我会要求他们这样做。
【解决方案2】:

您可以通过两种方法做到这一点:

但不要忘记cascade={"remove"}注解

【讨论】:

  • 感谢您的回答。但是问题是您不能完全清空集合 - 一切都像在文档中一样工作,但是如果您删除 dom 中的 all 元素,则提交的表单没有collection 和 removeElement 永远不会被调用。所以 oprhan 删除或级联删除都不起作用,因为集合本身没有被修改。
  • @Looted,我想知道您是否使用了“$form->submit($request, false)”,如果字段丢失,不会清除该字段。您需要确保“$clearMissing”设置为 true。
  • @Daniel,感谢您的提示。但是,我使用handleRequest,因为根据文档不推荐传递提交请求。除了请求之外,它不接受任何参数。
【解决方案3】:

您可以通过以下方式删除实体集合的所有项目:

$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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-12
    • 2014-04-03
    • 2012-08-07
    • 2011-01-28
    相关资源
    最近更新 更多