「ニックネーム」のコレクションを持つ「人」エンティティのフォームがあります。
クックブック (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 オブジェクトに含まれていないことです。