我有一个“Person”实体的表单,其中包含“Nicknames”的集合。
我按照食谱中的指南(http://symfony.com/doc/current/cookbook/form/form_collections.html)实现了这个
当我创建一个新的“Person”时,我可以成功地添加“Nicknames”。
使用类似的表格,我有一个编辑页面。在编辑页面上,我以与新页面相同的方式设置了前端。
在编辑页面上,我可以成功编辑现有的昵称和其他简单字段。但是,当我提交一个新的“昵称”(或尝试删除一个)时,它不起作用。
在将请求对象绑定到“Person”之前,我已经对其进行了var_dump(),并且在绑定后我将var_dump()编辑为“Person”对象。该请求确实正确传递了“Nicknames”集合。但是,尽管所有内容都与新页面相同,但它们根本没有绑定到Person。此外,我仍然可以编辑现有的昵称,因此它正在这方面工作。
我不能为我的生活弄清楚为什么Symfony不会创建这些新的昵称或者将它们添加到Person中。我环顾四周搜索,但一切都确认它应该有效 - 但事实并非如此。
表示人员表单类型上的昵称条目:
->add('nicknames', 'collection', array(
'type' => new NicknameType(),
'allow_add' => true,
'allow_delete' => true,
'prototype' => true,
'by_reference' => false,
'required' => false
))
昵称类型只有一个字段 - “昵称”及其文本输入。
有任何帮助吗?谢谢你的阅读。
编辑:
以下是更新操作(将人员更改为播放器):
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集合。
答案 0 :(得分:0)
如果您不使用Symfony master而是使用2.0.x,请注意,因为“集合”类型存在错误。但是,如果您使用的是Symfony master,请确保包含最新版本的Doctrine(2.2.3或2.1.7),因为已修复了两个影响“集合”类型正确工作的错误。
答案 1 :(得分:0)
也许尝试使用NicknameType::class
代替新的NicknameType()
。
我建议将cascade: [ persist ]
conf属性添加到您的实体。
答案 2 :(得分:-1)
您必须使用以下命令从请求中获取数据:
$objPerson = $editForm->getData();
$em->persist($objPerson);
$em->flush();
否则,您无需更改表单即可更新旧对象。
简短:您之前只更新了从数据库加载的对象。