在Symfony 2中创建表单网格

ibi*_*tux 7 forms collections doctrine symfony

我正在编写一个页面,我想在其中呈现一个实体的实例,例如phpMyAdmin.

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

我的问题是我真的不知道做什么是好的做法,Symfony有什么可能(我对这个框架很新).

  • 我的第一个想法是创建一个单独的表单,但似乎很难将单个表单组合在一起.

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

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

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

欢迎任何建议,谢谢!

Joã*_*ves 4

执行“ \xc3\xa0 l\xc3\xa0 symfony ”,您可以创建一个基本表单,例如具有 Type 集合字段的 AllRowsType,并且每一行的类型为 RowType:

\n\n
public function buildForm(FormBuilderInterface $builder, array $options)\n    {\n\n        $builder               \n            ->add(\'rows\', \'collection\', array(\n                \'type\'   => new RowType(),\n                \'allow_add\' => false,\n                \'allow_delete\' => false,\n                \'by_reference\' => false\n             ));\n    }\n
Run Code Online (Sandbox Code Playgroud)\n\n

那么您的 RowType 将是您的实体的正常形式。

\n\n
class RowType extends AbstractType {\n    public function buildForm(FormBuilderInterface $builder, array $options)\n    {\n\n       $builder               \n            ->add(\'name\', \'text\');\n    }\n\n    public function setDefaultOptions(OptionsResolverInterface $resolver)\n    {\n        $resolver->setDefaults(array(\n            \'data_class\' => \'Acme\\Bundle\\DemoBundle\\Entity\\Row\',\n        ));\n    } }\n
Run Code Online (Sandbox Code Playgroud)\n\n

验证可以像普通表单一样在 RowType 上进行,但如果遇到问题,可以在 AllRowsType 的默认选项上设置cascade_validation => true。

\n\n

要迭代 twig 中的每个 RowType,您可以执行以下操作:

\n\n
{% for row in form.rows%} {{ form_row(row.name) }} {% endfor %}\n
Run Code Online (Sandbox Code Playgroud)\n\n

在树枝上为了获取每个行实体的 ID,您可以执行以下操作:

\n\n
{{ row.vars.value.id }}\n
Run Code Online (Sandbox Code Playgroud)\n\n

在控制器上,你可以做$allrowsForm->get(\'rows\')->getData()任何你想做的事情,并且你有一个行实体的ArrayCollection。

\n\n

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

\n