【问题标题】:Creating a grid of forms in Symfony 2在 Symfony 2 中创建表格网格
【发布时间】:2014-11-17 10:07:04
【问题描述】:

我正在处理一个页面,我想在该页面上呈现一个实体的实例,例如 phpMyAdmin 会这样做。

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

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

  • 我的第一个想法是创建一个单一的表单,但似乎很难 将多个实例组合在一个表单中。

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

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

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

欢迎任何建议,谢谢!

【问题讨论】:

    标签: forms symfony collections doctrine


    【解决方案1】:

    执行“à 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 了解如何处理表单集合。

    【讨论】:

    • 非常感谢这个详细的回答。我正在尝试这个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-12
    • 2012-03-13
    • 1970-01-01
    • 2020-08-29
    • 1970-01-01
    • 2013-08-11
    • 1970-01-01
    相关资源
    最近更新 更多