2014-01-21 6 views
6

多くの属性を持つエンティティのフォームを作成したいと考えています。データの入力を容易にするために、そのフォームを複数のページ(2ページまたは3ページなど)に分割したいと考えています。 の広告エンティティの例を見てみましょう:1ページ中複数のページで長いsymfonyフォームを分割する方法は?

  1. 、ユーザーがページ2では、広告テキスト
  2. に入りますが、ユーザーは、3ページでは彼の接触
  3. に入りますが、ユーザーが提供します広告

このスプリットの(X、Y)の位置は、次のページに移動する前に、1ページ目に(データベースに挿入する)利用可能なデータを保存する必要があります。残念ながら、これは制約のために可能ではありません。

質問は次のとおりです。この問題を解決するドキュメントや例はありますか?

ドキュメントがない場合は、ページごとに1つのエンティティを持つために、エンティティをn個のエンティティで分割するほうが良いと思いますか?

ありがとうございました。

答えて

10

おそらくCraueFormFlowBundleを使用する必要があります。それは、複数ステップのフォームを構築するための機能を提供します。

フロー全体に対して1つのフォームタイプを作成することも、ステップごとに1つのフォームタイプを作成することもできます。

セットアップが非常に簡単です。すべてが説明されてhere

+0

ありがとうございました。素晴らしい解決策に見えます! :) –

+0

絶対完璧!再度、感謝します! –

+0

バンドルが素晴らしい解決策になるかどうかは疑問です。個人的には、良い解決策としてコーディングが好まれます。 – Trix

0

送信されたすべてのデータをセッションまたはテンポラリテーブルに格納し、最後にまとめて保存することができます。しかし、私はこのような余分な作業を避けるために最善を尽くしています。

私は、あなたのフォームのステップが、制約が指示する順序に従っていることは間違いないと思います。

このような問題は、より良い設計やプロセスの決定を行うことで解決できると私は思っています。質問の数を制限するか、最初に重要な質問のみを行う。インサイドとアウトを知らずに、これができるかどうかを知ることは難しいです。

+0

ありがとうございます... –

+0

セッションは良い場所ではなく、セッションの乱用につながります。私はキャッシュを使用します。 –

7

エンティティを分割する必要はありませんが、フォームは3つのフォームを作成し、それぞれに広告エンティティから必要なプロパティが含まれています。あなたがする必要があります

  • が持続(およびフラッシュません)$の広告オブジェクトあなたのコントローラ
  • 内部のすべてのステップであなたのコントローラ
  • の内側に転送する際に、引数として$広告オブジェクトを渡します
  • に最後のステップの擬似コードで

に$の広告オブジェクトをフラッシュし、あなたのコントローラは、次のようになります。

public function newAdStep1() { 
    new Ad() // New instance of $ad 
    new formStep1($ad) // The first form containing only the ad text field 

    // The form was filled, manage it... 
    form->isValid()? { 
     persist($ad); // Persist the first part of your ad object 
     forward(newAdStep2, $ad) // Go on to step 2, your $ad object as an argument 
    } 

    // ... or display step1 to user 
    createView createAdStep1.html.twig('form' => $form); 
} 

public function newAdStep2($ad) { 
    new formStep2($ad); // Now the second form, containing the "contact" fields 
    isValid ? { 
     persist($ad) 
     forward(newAdStep3, $ad) 
    } 
    createView createAdStep2($form, $ad); // Your $ad object needs to be sent to the view 
} 

public function newAdStep3($ad) { 
    new formStep3($ad); // Third and last form, containing the (X,Y) fields 
    isValid ? { 
     $em->persist($ad); 
     $em->flush(); // Your instance of $ad can be stored in database now 
     return('success !'); 
    } 
    return view createAdStep3($form, $ad); 
} 
+0

ありがとうございます。私はあなたに解決策を試さなければならない。私はisValid()について少し心配しています。 –

+0

私はそれを試しましたが、isValidはcreateFormの後にtrueを返します。したがって、この解決策は実行可能ではないかもしれません。しかし、フォワードの使用の概念はかなり上品です。 – crafter

+0

コードスニペットを修正して現実のコードに置き換えた場合に役立ちます – Trix

関連する問題