Symfony2中的多个子表单映射到现有数据

时间:2013-02-28 22:39:20

标签: symfony

我正在为Symfony2项目创建月度发票模块。我正在尝试为用户提供一个表单,列出当前发票期间的所有员工,每个员工有两个输入字段。与电子表格类似,每行都有员工姓名,然后是一个字段,用于输入每月的个人小时费率和当月的总工作小时数。

这是实体定义(为了简洁起见仅发布相关字段)

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'));

我已经考虑过构建一个FormInvoiceAttendance类来充当“superform”,它为每个员工保存FormAttendance子表单的集合。但所有这一切都会创建一个员工出勤表单的“空白”实例,并且不会将这些值与任何现有员工相关联。

$builder->add('attendance', 'collection', array('type' => new FormAttendance()));

理论上,整个过程如下:

1)用户在系统中创建新的发票,为发票分配日期(以及其他一般信息)。

2)创建后,用户可以转到表单输入发票期间员工的出勤情况(这是“电子表格”类型表格)。

3)电子表格表单的每一行基本上都是FormAttendance类型,应该映射到相应的员工。

4)用户提交表格并执行各种计算。最终,InvoiceAttendance值的集合将持久保存到数据库中的InvoiceAttendance表中,并为数据库中的Invoice表更新总值。


之前我曾使用“集合”表单类型动态地将子表单添加到表单集合中,但是当“集合”的数据“源”预先存在时,我似乎对这个想法感到磕磕绊。

我已经探索了几种可能的解决方案......但似乎没有人能够让我超越在单个表单中多次嵌入子表单的基本障碍。

1 个答案:

答案 0 :(得分:0)

经过一夜好眠......这个挑战实际上只不过是使用收集表单类型。我完全忘了你可以从树枝内访问链接到表单类型的域对象。

<强> InvoicesController

$roster // ArrayCollection of EmployeeRecord domain objects

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

<强> attendance.html.twig

{% for employee in form.attendance %}
    {{ employee.vars.value.employeeFk.nameFirst }} {{ employee.vars.value.employeeFk.nameLast }}
    {{ form_widget(employee.hourlyRate) }}
    {{ form_widget(employee.hours) }}
{% endfor %}