1

私のプロジェクトには、抽象エンティティがあります。これを Parent と呼びましょう。2 つの子エンティティは、Parent クラスを拡張する ChildA と ChildB です。私は教義と単一のテーブル戦略を使用しています.ChildAとChildBは似ています. この部分は正常に機能しています。今、私の問題はフォームにあります。

これらのクラス (ChildA または ChildB) のいずれかのエンティティを作成するために使用できる単一のフォームが必要なため、ユーザーが作成するエンティティの種類を選択するための最初のフィールドがフォームに必要です。そのクラスのフィールドを表示します(異なるフィールドが1つしかありません。選択したクラスに応じてフィールドを表示/非表示にするためにjavascriptを使用しています)

これを達成するために、私は ChildA と ChildB の両方のすべてのフィールドとタイプを選択するためのフィールドを含むフォームを作成しました。私の考えはコントローラーでタイプをチェックし、選択したものに従って ChildA または ChildB に関連付けられた特定のフォームを作成することでした入力し、メインフォームから受け取った値でバインドしますが、ここでの問題は、このフォームでエラーを表示する方法です

誰でもこの問題の良い解決策を持っていますか?

4

1 に答える 1

1

このようにあなたはそれを非常に難しくしていると思います。
この問題については、それに応じて関連するフィールドを使用して 2 つのフォーム (FormChildA、FormChildB) を作成します。
いずれにしても JavaScript を使用しているため、ページを選択してレンダリングし、ajax でフォームを取得するだけです。

<div id="select-type">
    <button value="child_a" type="button">Select ChildA</button>
    <button value="child_b" type="button">Select ChildB</button>
</div>
<div id="form-container"></div>
<script>
    $('#select-type button').on('click', function(event) {
        event.preventDefault();
        $.get('path/to/get_ajax_form', {type: $(this).val()}, function(data) {
            $('#form-container').html(data);
        });
    });
</script>

フォームを取得する Controller メソッドを作成します。

public function getAjaxFormAction()
{
    $type = $this->get('request')->query->get('type');
    switch( $type ) {
        case 'child_a':
            $form = $this->createForm(new FormChildA, new ChildA);
            break;
        case 'child_b':
            $form = $this->createForm(new FormChildB, new ChildB);
            break;
    }

    return $this->render('AcmeBundle:Forms:_type_form.html.twig', array(
       'form' => $form->createView(),
       'type' => $type,
    ));
}

各フォームにフォーム タイプの値を含む隠しフィールドを追加します。
これにより、これらのフォームを 1 つのメソッドで検証できます (フォームを取得するのと同じ方法)。

これにより、各フォームを個別に変更および検証することが容易になります!

于 2013-01-18T15:46:19.697 に答える