1

PHP プロジェクトで symfony 1.4 を使用しています。ユーザー構成に応じて拡張される可能性のあるフォームがあります。ユーザーが追加のラベルまたはタスクの予算を選択した場合、この情報はフォーム クラスに埋め込まれ、フォーム パーシャル (追加の入力) でウィジェットとして表示される必要があります。

例えば:

  1. 管理者は、予算やラベルを付けずに基本的なタスクのみを実行したいと考えています。新しいタスクを編集または作成するときは、TasksForm ウィジェットのみが表示されます。

  2. 管理者は、ラベルを使用して基本的なタスクを実行したいと考えています。TasksForm が表示され、ユーザーがラベルを選択できる追加のフィールドが表示されます。

  3. 管理者はすべてのオプション (ラベル + 予算) を希望しています

db の関係は次のとおりです。

Tasks:
  columns:
    name: string(127)
    created_at: timestamp
    updated_at: timestamp

Budget:
  columns:
    task_id: integer
    budget_prognosis: integer
    budget_used: integer
  relations:
    Tasks:
      local: task_id
      foreign: id
      type: one

TaskHasLabel:
  columns:
    task_id: 
      type: integer
      primary: true
    label_id:
      type: integer
      primary: true
  relations:
    Tasks:
      local: task_id
      foreign: id
      type: one
      onDelete: CASCADE
    Labels:
      local: label_id
      foreign: id
      type: one
      onDelete: CASCADE

Labels:
  columns:
    name: string(127)
  relations:
    Tasks:
      class: Task
      local: label_id
      foreign: task_id
      refClass: TaskHasLabel

目的は、フォームの構成を簡単に変更し、将来的に新しい構成オプションを追加することです。組み合わせごとに個別のフォームを作成することでこれを実行できることはわかっていますが、繰り返したくありません。もう 1 つのアイデアは、すべてのフィールドを 1 つのフォームにまとめて非表示にすることですが、私には良いアイデアとは思えません。フォームコンストラクターのパラメーターを介して構成を考えましたが、それもわかりません。この状況でのベストプラクティスは何ですか?

4

1 に答える 1

1

すべての可能性のうち:

  • フォームをサブクラス化して、「自分自身を繰り返さない」ようにします。これは、選択肢が1つか2つしかない場合には便利ですが、選択肢が増えるとすぐに問題になります(2つのオプションとすべての組み合わせが有効な場合は4つのフォーム)。
  • オプションごとにフォームを作成します。次に、コンストラクターパラメーターを使用して、ユーザーが表示したい追加機能ごとに埋め込みフォームを追加します。これにより、ユーザーがデータを表示する権限を持っていない場合に一部のオプションが表示されないようにすることもできます(情報がブラウザーに非表示になっている場合に表示されます)。

埋め込みフォームはSF1.4で非常にうまく機能します(ここを参照)。これが私の解決策になります。また、MVCが機能し続けます。モデルにDoctrineを使用している場合は、これも読むことができます。

于 2012-11-26T15:37:43.297 に答える