在Symfony 2中创建表单网格

时间:2014-09-23 09:05:01

标签: forms symfony collections doctrine

我正在处理一个页面,我希望以phpMyAdmin为例来呈现实体的实例。

更具体地说,我想得到一个表,其中列是实体的字段,行是该实体的所有实例,并使所有值(除了id)可编辑,并将它们保存到数据库。

我的问题是我真的不知道做什么是好的做法以及Symfony的可能性(我对这个框架很新)。

  • 我的第一个想法是创建一个单独的表单,但似乎很难 以单一形式组合多个实例。

  • 我还考虑过每行创建一个表单,但这意味着每一行都有自己的"提交"字段,并且不可能一次保存多行中的更改。

  • 在Symfony的文档中,我看过一个关于表单集的主题,但我不知道这是否是我可以使用的,因为我的实体的实例是完全独立的。

嗯,我想我并不是第一个想要这样做的人,但是我找不到任何办法去做,也许我错过了什么?

欢迎任何建议,谢谢!

1 个答案:

答案 0 :(得分:4)

执行“àlàsymfony”您可以创建一个基本表单,例如具有Type集合字段的AllRowsType,并且每个行都是Type 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上,但如果您遇到问题,可以设置cascade_validation =>对于AllRowsType的默认选项为true。

要在树枝中迭代每个RowType,您可以这样做:

{% for row in form.rows%} {{ form_row(row.name) }} {% endfor %}

在twig上,为了获得每行实体的ID,你可以这样做:

{{ row.vars.value.id }}

在Controller上,您可以执行$allrowsForm->get('rows')->getData(),并且您拥有行实体的ArrayCollection并执行任何操作。

您可以阅读http://symfony.com/doc/current/cookbook/form/form_collections.html了解如何处理表单集合。