11

多くの属性を持つエンティティのフォームを作成したいと考えています。データ入力を簡単にするために、そのフォームを複数のページ (たとえば 2 ページまたは 3 ページ) に分割したいと考えています。広告エンティティの例を見てみましょう:

  1. ページ 1 で、ユーザーは広告テキストを入力します。
  2. 2 ページ目で、ユーザーは自分の連絡先を入力します。
  3. 3 ページ目で、ユーザーは広告の (X,Y) 位置を指定します。

この分割では、次のページに移動する前に、最初のページで使用可能なデータを保存する(データベースに挿入する)必要があります。残念ながら、これは制約により不可能です。

問題は、この問題を解決するドキュメントや例はありますか?

ドキュメントが利用できない場合、エンティティを n 個のエンティティに分割して、ページごとに 1 つのエンティティを作成する方がよいと思いますか?

助けてくれてありがとう。

4

3 に答える 3

12

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

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

セットアップはとても簡単です。すべてがここで説明されています。

于 2014-01-21T10:59:21.580 に答える
12

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

あなたがする必要があります:

  • コントローラー内のすべてのステップで $ad オブジェクトを永続化します (フラッシュしません)
  • コントローラー内で転送するときに、 $ad オブジェクトを引数として渡します
  • 最後のステップで $ad オブジェクトをフラッシュします

疑似コードでは、コントローラーは次のようになります。

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);
}
于 2014-01-21T10:49:29.250 に答える
1

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

フォームのステップは、制約が指示する順序に従っている可能性が高いと思います。

そうは言っても、この種の問題は、より良い設計やプロセスの決定を行うことで解決できると思うことがあります。つまり、質問の数を制限するか、重要なものだけを最初に尋ねます。内外を知らなければ、これができるかどうかを知ることは困難です。

于 2014-01-21T10:36:23.543 に答える