POSProductエンティティの配列があり、それぞれのフォームを表示したいので、ユーザーはリストから必要なものを編集して保存できます。以前は、配列を反復処理してそれぞれのPOSProductTypeフォームを作成し、フォームの配列を twig テンプレートに送信していました。
この手法の代わりにコレクションを使用する必要があると、複数の人から言われました。この使用例を実際にカバーする例を見つけることができませんでしたが、次のように、コントローラーから直接フォームを作成し、組み込みの CollectionType フォームを使用することをお勧めします。
$arrayProducts = return_array_of_product_entities();
$form = $this->createForm('collection', $arrayProducts, array( 'type' => 'pos_product',
'csrf_protection' => true,
'intention' => 'vendor_add',
'allow_add' => true,
));
return $this->render('MyBundle:Default:myform.html.twig', array(
'form' => $form->createView(),
));
*type => pos_product* は、独自のクラスで定義した POSProductType フォームです。
フォームは正常にレンダリングされますが、送信して検証すると 2 つのエラーが発生します。
CSRF トークンが無効です。フォームを再送信してください / このフォームに余分なフィールドを含めないでください
フォームのソースを表示すると、CSRF トークンが表示されます。createForm() でcsrf_protectionと intent およびallow_addオプションのすべての組み合わせを試しましたが、結果は常に同じです。
また、デフォルトの CollectionType を使用する必要がないように、独自の ProductCollectionType フォーム クラスを作成しようとしましたが、必要な構文が本当にわかりません。私は次のようなことを試みています:
$builder->add('pos_product', 'collection', array(
'type' => new POSProduct()));
(1 番目と 3 番目の引数について考えられるすべての組み合わせで)、結果は "posproduct" というラベルの付いたフォームになります。
私のソリューションの好みは、「pos_product」タイプのフォームでそれぞれ表される POSProduct() エンティティの配列をレンダリングする独自の ProductCollectionType クラスを作成する方法です。
私のバックアップソリューションは、現在持っているのと同じ CollectionType フォームを使い続けることですが、それを検証する方法を見つけます。