0

Symfony2 (v 2.2) でのフォームの構築に問題があります。多対多接続のデータシート形式のようなものが必要です。複雑に見えます。

私はDBにそのようなエンティティを持っています:

  • ゲーム
  • 田畑
  • カテゴリー

エンティティ間の接続( PNG ):

Categories <- Values -> Fields -> Game

値には、フィールドとカテゴリへの FK が含まれており、フォームに保存する必要があるフィールド「値」ウィッチがあります (以下を参照)。フィールドにはゲームへの FK が含まれます。

そのようなフォームが必要: PNG

Game1
------------------------------------
          Field1    Field2    Field3
Category1    x         x         x
Category2    x         x         x
Category3    x         x         x

Game2
------------------------------------
          Field1    Field2    Field3
Category1    x         x         x
Category2    x         x         x
Category3    x         x         x

x - <input type='text'>

すべてのゲーム (ページにゲーム タイトルのみを表示) には編集可能なフォーム (テーブル ビュー) があり、列ヘッダーにはフィールド タイトル (フィールド テーブルからのレコード) が含まれ、行ヘッダーにはカテゴリ タイトル (カテゴリ テーブルから記録されたもの) が含まれます。テーブルセルには、保存する必要がある値テーブルに保存された入力フィールドがあります。適切な値がテーブル Values に存在する場合、その値が表示されます (フォームの送信中に更新されます)。いいえの場合は、値を入力して DB にそのようなレコードを作成する必要があります。

私は考えました:

  • ゲームがフィールド型のカスタムフォーム型ゲーム コレクション
  • すべてのゲームには、カスタム フォーム タイプの値 (またはカテゴリ-値-フィールドのようなもの) が含まれています。

しかし、その場合、フォームビルダーでリスト「ゲーム」のリスト「値」を構築する方法さえわかりません。

別の質問は、これらのテーブルを変更する必要がないため、カテゴリとフィールドからの値のみを表示し、入力を表示しない方法です。

そのようなフォームを作成する方法についてアドバイスをください。

ありがとうございました

4

1 に答える 1

0

簡単なことではありません...これは、私がこの問題を検討するすべてのハイレベルなビューです。他のトリッキーな問題が発生しないかどうかはわかりませんが、少なくともいくつかのヒントが得られることを願っています. 一度にすべてを処理する FormType を持つことができるかどうかはわかりません。

最初に、エンティティがどのように関連しているかに従ういくつかの GameType を作成します。

  • FieldType のコレクションを含む GameType
  • ValueType のコレクションを含む FieldType
  • 値のテキストとカテゴリのエンティティの 2 つのフィールドを持つ ValueType

要約すると、疑似コードで:

GameType :
    $builder->add('fields', 'collection', array('type' => new FieldType());

FieldType :
    $builder->add('values', 'collection', array('type' => new ValueType()););

ValueType :
    $builder->add('value', 'text');
    $builder->add('category', 'entity', array('class'=>'YourBundle:Category');

フォームを表形式で表示できるようにするには、使用可能なカテゴリの配列をテンプレートに渡し、それをループして、適切なセルに各ウィジェットを表示します。

このソリューションでは、存在しない値に対して空白の入力フィールドを追加することはできません。エンティティを使用してフォームを作成する前に、フィールド エンティティの欠落しているカテゴリに (空の文字列のような) ファクトスの空の値を追加することで、この問題を回避できます。

// In the controller
$game = whateverYouDoToGetTheEntityFromDB();
$game->addDummyEmptyValues();
$form = $this->createForm(new GameType(), $game);

もう 1 つの方法は、フォーム イベント PRE_SET_DATA をリッスンし、不足しているデータをそこに追加することです。

このソリューションでは、ユーザーがフィールドに何かを入力しないと、空の値を持つ Value エンティティを取得する場合があります。PRE_SUBMIT (v2.0 では PRE_BIND と呼ばれる) イベント リスナーでそれらを削除できます (このディスカッションを参照してください)。

2 番目の質問 (編集不可の表示) については、簡単なはずです。上記のループを実装してみてください。ただし、フォーム ウィジェットを表示する代わりに、エンティティの属性を表示してください。この最初のビューから始めて、テーブルを機能させてから、この機能ベースでフォームを実装してみてください。

于 2013-07-16T09:00:25.210 に答える