1

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 フォームを使い続けることですが、それを検証する方法を見つけます。

4

0 に答える 0