1

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 テーブルの合計値が更新されます。


以前に「コレクション」フォーム タイプを使用してサブフォームをフォーム コレクションに動的に追加したことがありますが、「コレクション」のデータの「ソース」が既存の場合、その考えにつまずいているようです。

いくつかの可能な解決策を検討しました...しかし、単一のフォーム内にサブフォームを複数回埋め込むという基本的なハードルを乗り越えられるものはないようです。

4

1 に答える 1

0

ぐっすり眠った後... この課題は、コレクション フォーム タイプを使用することに他なりません。twig 内からフォーム タイプにリンクされたドメイン オブジェクトにアクセスできることをすっかり忘れていました。

請求書コントローラ

$roster // ArrayCollection of EmployeeRecord domain objects

foreach($roster as $employee) {
    $attendance = new InvoiceAttendance();
    $attendance->setEmployeeFk($employee);
    $invoice->getAttendance()->add($attendance);
}

出席.html.小枝

{% for employee in form.attendance %}
    {{ employee.vars.value.employeeFk.nameFirst }} {{ employee.vars.value.employeeFk.nameLast }}
    {{ form_widget(employee.hourlyRate) }}
    {{ form_widget(employee.hours) }}
{% endfor %}
于 2013-03-01T17:46:59.543 に答える