执行“à là symfony”你可以创建一个基本表单,例如 AllRowsType,它有一个类型集合的字段,并且每一行都是类型 RowType:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('rows', 'collection', array(
'type' => new RowType(),
'allow_add' => false,
'allow_delete' => false,
'by_reference' => false
));
}
那么您的 RowType 将是您实体的正常形式。
class RowType extends AbstractType {
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('name', 'text');
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'Acme\Bundle\DemoBundle\Entity\Row',
));
} }
验证可以像普通表单一样在您的 RowType 上进行,但如果您有问题,您可以在 AllRowsType 的默认选项上设置 cascade_validation => true。
要迭代 twig 中的每个 RowType,您可以这样做:
{% for row in form.rows%} {{ form_row(row.name) }} {% endfor %}
在树枝上为了获取每个行实体的 ID 你可以这样做:
{{ row.vars.value.id }}
在 Controller 上,您可以执行 $allrowsForm->get('rows')->getData() 并且您有一个行实体的 ArrayCollection 并做任何您想做的事情。
您可以阅读http://symfony.com/doc/current/cookbook/form/form_collections.html 了解如何处理表单集合。