Php 删除Zend\Form\Collection的所有元素(带有DoctrineModule ObjectSelect的字段集)
我正在开发一个ZF2应用程序,它使用ZF2表单和DoctrineModule,或者在一个简单的CRUD系统中创建/更新实体。该实体(联盟)与另一实体(团队)有一个单一的关联,该关联由表单站点上的Php 删除Zend\Form\Collection的所有元素(带有DoctrineModule ObjectSelect的字段集),php,doctrine-orm,zend-framework2,zend-form2,Php,Doctrine Orm,Zend Framework2,Zend Form2,我正在开发一个ZF2应用程序,它使用ZF2表单和DoctrineModule,或者在一个简单的CRUD系统中创建/更新实体。该实体(联盟)与另一实体(团队)有一个单一的关联,该关联由表单站点上的Zend\Form\Element\Collection表示。使用表单创建新实体或更新现有实体时,一切正常,但有一种情况除外:清空预先存在的实体的关联集合。当我删除集合的所有元素并单击“保存”时,表单将被反弹回来,集合的每个现有元素都显示错误值是必需的,不能为空 显示问题的视频: 代码: 控制器: 服务
Zend\Form\Element\Collection
表示。使用表单创建新实体或更新现有实体时,一切正常,但有一种情况除外:清空预先存在的实体的关联集合。当我删除集合的所有元素并单击“保存”时,表单将被反弹回来,集合的每个现有元素都显示错误值是必需的,不能为空
显示问题的视频:
代码:
- 控制器:
- 服务:
- 表格:
- 字段集:
- 联合字段集:
- 联合\团队字段集:
- 实体:
- 工会:
- 小组:
问题似乎归结为InputFilter,但我似乎无法确定到底是什么地方出了问题。删除集合的N个条目中的(N-1)项效果很好,所以InputFilter结构本身没有问题。可能当发布的集合为空时,Zend\Form
不会删除分配给teams
集合的每个元素的现有NotEmpty验证器
为Union字段集提供了自定义输入筛选器(),但是teams
集合元素没有列出输入。我还尝试过完全删除自定义InputFilter,并为团队
集合添加合适的InputFilter定义,但最终结果是相同的
有人知道我做错了什么吗 尝试让您的TeamFieldset
实现Zend\InputFilter\InputFilterProviderInterface
,然后将以下方法添加到该字段集:
public function getInputFilterSpecification()
{
return array(
'id' => array(
'required' => false,
)
);
}
修改了TeamFieldset
:为了解决这个问题,我更新了接收表单POST的控制器,以检测何时从客户端清空了集合,并手动清空实体上的集合:
if ( !isset($data['union']['teams']) || empty($data['union']['teams']) ) {
$entity->removeTeams($entity->getTeams());
}
这给了我一个稍微不同的结果。集合元素不再具有与它们相关联的错误,因此表单将进行验证,但实体仍然会在原始集合元素完好无损的情况下从另一侧弹出。在某种程度上,POST请求不包含团队
集合的痕迹这一事实导致表单“忘记”调用实体上的removeTeams来清除集合。这真是奇怪的情况。似乎github上的问题和/或与此相关。