0

「ニックネーム」のコレクションを持つ「人」エンティティのフォームがあります。

クックブック (http://symfony.com/doc/current/cookbook/form/form_collections.html) のガイドに従ってこれを実装しました。

新しい「人」を作成すると、期待どおりに「ニックネーム」を追加できます。

同様のフォームを使用して、編集ページがあります。編集ページでは、新しいページと同じ方法でフロント エンドを設定しました。

編集ページでは、既存のニックネームとその他の単純なフィールドを正常に編集できます。しかし、新しい「ニックネーム」を送信しても (または削除しようとしても)、機能しません。

「Person」にバインドされる前にリクエスト オブジェクトを var_dump() し、バインド後に「Person」オブジェクトを var_dump() しました。リクエストには、「Nicknames」コレクションが正しく渡されています。ただし、すべてが新しいページと同じであるという事実にもかかわらず、それらは Person にまったくバインドされていません。さらに、既存のニックネームを引き続き編集できるので、その面で作業しています。

Symfony がこれらの新しいニックネームを作成したり、必要に応じて Person に追加したりしない理由を、私は一生理解できません。私は周りを見回して検索しましたが、すべてが機能していることを確認していますが、そうではありません。

Person フォーム タイプのニックネームのエントリは次のとおりです。

->add('nicknames', 'collection', array(
        'type'           => new NicknameType(),
        'allow_add'      => true,
        'allow_delete'   => true,
        'prototype'      => true,
        'by_reference'   => false,
        'required'       => false
))

ニックネーム タイプには、「ニックネーム」とそのテキスト入力の 1 つのフィールドしかありません。

何か助けはありますか?読んでくれてありがとう。

編集:

更新アクションは次のとおりです (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 フォームにバインドした後、更新された Nicknames コレクションが $player オブジェクトに含まれていないことです。

4

3 に答える 3

0

Symfony マスターではなく 2.0.x を使用している場合は、「コレクション」タイプにバグがあるため注意してください。ただし、Symfony マスターを使用している場合は、Doctrine の最新バージョン (2.2.3 または 2.1.7) を含めるようにしてください。「コレクション」タイプの正しい動作に影響する 2 つのバグが修正されているためです。

于 2012-05-01T19:51:58.480 に答える
0

NicknameType::classnew の代わりに使用してみてください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 に答える