【问题标题】:Symfony2 create form from collectionSymfony2 从集合创建表单
【发布时间】:2015-02-18 14:12:43
【问题描述】:

我需要创建一个表单来编辑实体列表。这与经典用例(以及我找到的所有示例)不同,我们有一个作为嵌套实体的实体。

就我而言,我想使用:

$form = $this->get('form.factory')->create(
        new MyType(),
        mycollectionofobjects
    );

所以表单需要处理一个对象集合(在我的例子中是一个推进集合)。

在经典案例中,我们可以使用:

$formBuilder->add(
            'getTheCollection',
            "collection", etc...

因此,从主对象开始,子表单是使用 getTheCollection 的数据构建的,但是没有主实体,它就不起作用。

【问题讨论】:

    标签: forms symfony collections types


    【解决方案1】:

    我用来解决这种情况的解决方案如下

    • 当然,创建一个不会持久化到 DB 的实体,并且只表示一个容器。类似的东西

      use Doctrine\Common\Collections\ArrayCollection;
      class YourTypeCollector
      {
          protected $your_type_colletion;
      
          public function __construct() 
          {
              $this->your_type_colletion = new ArrayCollection();
          }
      
          public function setYourTypeCollection(ArrayCollection $yourTypeCollection)
          {
              $this->your_type_collection = $yourTypeCollection
          }
      
          public function getYourTypeCollection()
          {
              return $this->your_type_collection;
          }
      }
      
    • 创建YourTypeCollectorForm

      class YourTypeCollectorFormType extends AbstractType
      {
          public function buildForm(FormBuilderInterface $builder, array $options)
          {
              $builder->add('your_type_collection', 'collection', array(
                  'type' => new YourTypeType()
              );
          }
      
         public function getName()
         {
             return 'your_type_collector_form';
         }
      
         public function setDefaultOptions(OptionsResolverInterface $resolver)
         {
             $resolver->setDefaults(array(
                 'data_class' => 'Path\To\Your\Type\Collector',
                  'cascade_validation' => true, //!Important
             ));
          }
      }
      
    • 将其实例化到控制器中并像“正常”其他具有集合的表单一样使用它

      $your_type_colletor = new YourTypeCollector();
      $your_type_collector->setYourTypeCollection(//an array collection here);
      $form = $this->createForm(new YourTypeCollectorType());
      

    我不确定这是否是解决此问题的最佳方法,但我确信它在我目前将其用于我的旧项目中时有效

    【讨论】:

    • 谢谢,我用一个只有一个方法'getChild'的假根对象这样做了,然后当我创建子表单时,我给出了参数'child',仅此而已。我不确定这是不是最好的方法,我很好奇是否有更好(更“漂亮”)的解决方案?
    • 你可以只使用一个数组而不是创建一个特殊的集合对象。
    • @Cerad:我很确定你在这里展示的方法,而且很明显。但是,正如我在这里所说,这是我用于旧项目的解决方案,对于这个答案,我只是在这里复制/粘贴/改编:)
    • 是的。我想我前段时间做过同样的事情,直到我意识到数组可以正常工作。
    • @Cerad:你知道这个过程,不是吗?问题 -> 工作代码 -> 好代码 -> 完美代码 :)
    【解决方案2】:

    另一种可能是这个(相信是适应性强的):

    假设存在一个名为 Collection 的实体,其中包含一组对象,请创建一个表单视图,以支持编辑所有(或选定的)对象。

    1) 为单个 Object 创建表单类型:

    class CollectionType extends AbstractType
    {
    
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder
                    ->add('object')
                ;
        }
    
        public function getName()
        {
            return 'collection';
        }
    
        /**
         * @param OptionsResolverInterface $resolver
         */
        public function setDefaultOptions(OptionsResolverInterface $resolver)
        {
            $resolver->setDefaults(array(
                'data_class' => 'YourBundle\Entity\Collection',
            ));
        }
    

    2) 为一组对象创建表单类型

    class ObjectsType extends AbstractType
    {
    
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder
                    ->add('objects', 'collection', ['type' => new CollectionType(),
                        ])
                    ))
                ;
        }
    

    3) 在控制器中实例化表单

    public function editObjectsAction(Request $request)
    {
        $em = $this->getDoctrine()->getManager();
        $objects = $em->getRepository("YourBundle:Collection")->findAll();
        $form = $this->createForm(new ObjectsType(), array('objects' => $objects));
        ...
    }
    

    [希望我已经正确概括了我对这个解决方案的使用!]

    有关“真实世界”应用程序,请参阅this SO answer。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-13
      • 1970-01-01
      相关资源
      最近更新 更多