1

我正在为我的 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 类来充当“超级表单”,它为每个员工保存 FormAttendance 子表单的集合。但所做的只是创建一个员工考勤表的“空白”实例,它不会将这些值与任何现有员工相关联。

$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.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 %}
于 2013-03-01T17:46:59.543 回答