2016-10-19 10 views
0

セッションに送信する際にFormBuilderで作成したフォームを保存します。ユーザーが同じページに戻るとすぐに、フォームには、前回の送信済み情報がある場合に備えて再投入する必要があります。フォームデータをセッションに保存し、リフレッシュ時にフォームに再投入する(symfony)

// Create form 
    $form = $this->createForm(MappingType::class, $mapping); 
    $form->handleRequest($request); 

    // Populate it if we already have data from the request or from session, only when not submitted 
    if (!$form->isSubmitted() && $request->getSession()->has('mapping')) { 
     $form->setData($request->getSession()->get('mapping')); 
    } 

    // Save form data to session 
    if ($form->isSubmitted() && $form->isValid()) { 
     $request->getSession()->set('mapping', $form->getData()); 
    } 

MappingTypeフォームは子供がいるだけでなく、トップレベルのフィールドにはもう一度データが表示されないようです。子供は主にChoiceTypeフィールドで構成されます。

セッションデータには、すべてのフォームデータが入力されます。私はDoctrineを使用していないので、単純なエンティティであるため、永続性に関する問題はありません。

フォームはPOSTリクエスト(handleRequest)で正しく読み込まれますが、もう一度読み込むと(GET)読み込まれません。

アイデア?

+0

'handleRequest'の前にデータを設定するブロック? – Veve

+0

残念ながら何も変わらない@Veve – stefandoorn

答えて

2

Veveを使用すると、データが前にそのようなフォームを作成しなければなりません言ったように:オブジェクトは、データ・ベースの例のために存在している場合

if($request->getSession()->has('mapping'))) { 
    $mapping->setSomething('value'); 
    $mapping->setSomethingOhter('value'); 
} 
$form = $this->createForm(MappingType::class, $mapping); 

編集

をあなたが移動するとどうなり

$mapping = $em->getRepository('AppBundle:Object')->findBy('field'=>'value'); 
$form = $this->createForm(MappingType::class, $mapping); 
+0

申し訳ありませんが、多くの手作業が必要です。最初の投稿をしようとしているときに、すべてのリクエストデータを再度挿入することは可能でしょうか?私はそれを働かせることはありません。私はすべてのフィールドを反復して1つずつ設定したいとは思わないが、それは非効率的だと感じている。 – stefandoorn

+0

だから、基本的には、フォームデータ($ form-> getData())をセッションに保存し、後で再びフォームに設定する必要があります。それはいくつかの子供がいるかなり複雑なフォームなので、私はそのような方法を使用することを望んでいた。ユーザーがアップロードしたファイルに応じて、フォームも毎回異なります。 – stefandoorn

+0

ショートカットは、$ request-> getSession() - > get( 'マッピング')を受け取り、 'createForm'呼び出しで使用することです。私の問題は、子供たちにフィールドを作ってもらい、クラスのサブインスタンスを使用していて、それが動作しなくなったことです。これを調整すると機能したので、適切な方法を探していたので、これが要求された答えだと思います。 – stefandoorn

関連する問題