2015-04-01 31 views
1

我有一个Symfony 2.6表单集合的问题。只有在至少有一个存在的情况下,才能从收集作品中删除元素。如果从DOM中删除最后一个元素(将集合容器留空),则在处理请求之后,不会从集合中删除元素。完全清除表单集合

例子:

我有收集 “孩子” 和两个孩子, “A” 和 “B” 的形式。我从DOM中删除孩子“b”,保存,removeChild被调用,孩子被删除。现在我还清除孩子“a”,保存,没有任何反应 - 刷新表格后,孩子仍然存在。 在表单处理完请求后转储主实体时,该子对象也存在于它的集合中。

有没有人有类似的问题,并找到了解决方案?

+0

可能是我们展示你的代码? – xurshid29 2015-04-01 18:02:05

回答

1

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

+0

我有类似的问题。您是否找到PATCH方法的解决方案? – 2016-08-25 07:16:10

+0

我找到了一个解决方案 – 2016-08-25 08:33:53

1

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

但不要忘了cascade={"remove"}注释

+0

谢谢你的支持。然而,问题是你不能清空集合**完全** - 所有东西都像文档一样工作,但是如果你删除了dom中的所有**元素,那么表单将不会被调用,而且没有集合,removeElement也不会被调用。所以oprhan删除或级联删除都不会起作用,因为收集本身没有被修改。 – Looted 2015-04-01 16:10:23

+1

@Looted,我想知道是否可以使用“$ form-> submit($ request,false)”,如果缺少它,*将不会清除该字段。您需要确保“$ clearMissing”设置为true。 – Daniel 2015-04-02 01:02:58

+0

@丹尼尔,谢谢你的提示。然而,我使用handleRequest,因为传递请求提交已根据文档弃用。它不接受除请求外的任何参数。 – Looted 2015-04-02 08:20:29

0

你可以简单地通过删除实体的集合中的所有项目:

var item = {field: 'test', collectionName: null}; 
ajaxPatchRequest(item); 

,因为空值:当此$请求来自JavaScript的Ajax调用出现

$request['collectionName'] = null; //or empty array 
$form->submit($request, false); 

问题被接收为字符串“null”。如果collectionName是一个空数组,它将不会在ajax调用中传递。 因此,使用空值和前$形式 - 应用预处理>提交():

$toPatch = array(); 

foreach($request->request->all() as $key => $value) { 
    if($value === 'null') { 
     $toPatch[$key] = null; 
    } else { 
     $toPatch[$key] = $value; 
    } 
} 

$form->submit($toPatch, false);