Symfony2 プロジェクトの月次請求書モジュールを作成しています。従業員ごとに 2 つの入力フィールドを使用して、現在の請求期間のすべての従業員を一覧表示する単一のフォームをユーザーに提供しようとしています。スプレッドシートと同様に、各行には従業員名と、個々の時給とその月の合計作業時間を入力するフィールドがあります。
エンティティの定義は次のとおりです(簡潔にするために関連するフィールドのみを掲載しています)
class EmployeeRecords
$id (auto-increment)
$name_first
$name_last
class Invoice
$id (auto-increment)
$invoice_date (datetime)
$attendance (Doctrine mapped to InvoiceAttendance)
class InvoiceAttendance
$id (auto-increment)
$invoice_fk (Doctrine mapped to Invoice)
$employee_fk (Doctrine mapped to EmployeeRecords)
$hours
$hourly_rate
InvoiceAttendance エンティティの FormAttendance フォーム タイプを作成しました
$builder->add('hours', 'number', array('precision' => 4));
$builder->add('hourly_rate', 'money', array('currency' => 'USD', 'precision' => 4));
...
$resolver->setDefaults(
array(
'data_class' => 'Entity\InvoiceAttendance'));
各従業員の FormAttendance サブフォームのコレクションを保持する「スーパーフォーム」として機能する FormInvoiceAttendance クラスを構築することを検討しました。しかし、従業員出席フォームの「空白」のインスタンスを 1 つ作成するだけで、既存の従業員と値を関連付けることはできません。
$builder->add('attendance', 'collection', array('type' => new FormAttendance()));
理論的には、プロセス全体は次のようになります。
1) ユーザーはシステムで新しい請求書を作成し、請求書に日付を割り当てます (その他の一般情報と共に)。
2) フォームが作成されると、ユーザーはフォームに移動して、請求期間の従業員の出席を入力できます (これは「スプレッドシート」タイプのフォームです)。
3) スプレッドシート フォームの各行は基本的に FormAttendance タイプであり、対応する従業員にマップする必要があります。
4) ユーザーがフォームを送信すると、さまざまな計算が実行されます。最終的に、InvoiceAttendance 値のコレクションはデータベースの InvoiceAttendance テーブルに保存され、データベースの Invoice テーブルの合計値が更新されます。
以前に「コレクション」フォーム タイプを使用してサブフォームをフォーム コレクションに動的に追加したことがありますが、「コレクション」のデータの「ソース」が既存の場合、その考えにつまずいているようです。
いくつかの可能な解決策を検討しました...しかし、単一のフォーム内にサブフォームを複数回埋め込むという基本的なハードルを乗り越えられるものはないようです。