0

我有一个“人”实体的表格,其中包含“昵称”的集合。

我已经按照食谱中的指南实现了这一点(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 集合。

4

3 回答 3

0

如果您使用的不是 Symfony master 而是 2.0.x,请注意,因为那里的“collection”类型有问题。但是,如果您使用的是 Symfony master,请确保包含最新版本的 Doctrine(2.2.3 或 2.1.7),因为已经修复了两个影响“集合”类型正确工作的错误。

于 2012-05-01T19:51:58.480 回答
0

也许尝试使用NicknameType::class而不是 new NicknameType()

我建议cascade: [ persist ]为您的实体添加 conf 属性。

于 2016-05-07T11:11:37.783 回答
-1

您必须通过以下方式从请求中获取数据:

$objPerson = $editForm->getData();
$em->persist($objPerson);
$em->flush();

否则,您更新旧对象而不更改表单。

简短:您只更新了之前从数据库加载的对象。

于 2013-08-05T20:05:11.587 回答