我有一个“人”实体的表格,其中包含“昵称”的集合。
我已经按照食谱中的指南实现了这一点(http://symfony.com/doc/current/cookbook/form/form_collections.html)
当我创建一个新的“人”时,我可以按预期成功添加“昵称”。
使用类似的表格,我有一个编辑页面。在编辑页面上,我已经以与新页面相同的方式设置了前端。
在编辑页面上,我可以成功编辑现有的昵称和其他简单字段。但是,当我提交一个新的“昵称”(或尝试删除一个)时,它不起作用。
在绑定到“Person”之前,我已经对请求对象进行了 var_dump() 处理,并且在绑定之后对“Person”对象进行了 var_dump() 处理。该请求确实正确传递了“昵称”集合。但是,它们根本没有绑定到 Person,尽管事实上一切都与新页面相同。此外,我仍然可以编辑现有的昵称,以便它在这方面工作。
我一生都无法弄清楚为什么 Symfony 没有创建这些新昵称或将它们添加到 Person 中。我环顾四周并进行了搜索,但一切都证实它应该工作 - 但事实并非如此。
以下是 Person 表单类型上的 Nicknames 条目:
->add('nicknames', 'collection', array(
'type' => new NicknameType(),
'allow_add' => true,
'allow_delete' => true,
'prototype' => true,
'by_reference' => false,
'required' => false
))
昵称类型只有一个字段 - “昵称”及其文本输入。
有什么帮助吗?谢谢阅读。
编辑:
这是更新操作(将 Person 更改为 Player):
public function updateAction($id, Request $request)
{
$em = $this->getDoctrine()->getManager();
$player = $em->getRepository('SCDBAppBundle:Player')->find($id);
if (!$player) {
throw $this->createNotFoundException('Unable to find Player.');
}
$editForm = $this->createForm(new EditPlayerType(), $player);
$deleteForm = $this->createGenericIDForm($id);
$editForm->bindRequest($request);
if ($editForm->isValid()) {
$em->persist($player);
$em->flush();
return $this->redirect($this->generateUrl('admin_player_edit', array('id' => $id)));
}
return array(
'player' => $player,
'edit_form' => $editForm->createView(),
'delete_form' => $deleteForm->createView(),
);
}
我意识到要真正坚持删除昵称,我需要更改代码以保持不变。我现在什至不担心持久性,因为主要问题是在我将请求绑定到 Player 表单后,$player 对象不包含更新的 Nicknames 集合。