【问题标题】:How to dynamically add's collections within collections in Symfony2 form types如何在 Symfony2 表单类型的集合中动态添加集合
【发布时间】:2012-04-23 21:50:54
【问题描述】:

我在 symfony2 中有 3 种表单类型

FaultType 是所有下一个集合的父类

<?php

namespace My\FaultBundle\Form;

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilder;

class FaultType extends AbstractType
{

    public function buildForm(FormBuilder $builder, array $options)
    { 
        $builder
                ->add('title')
                ->add('steps', 'collection', array(
                    'type' => new StepType(),
                    'allow_add' => true,
                    'prototype' => true,
                    'by_reference' => false,
                ))
                ->add('created')
                ->add('updated')
        ;
    }

    public function getDefaultOptions()
    {
        return array(
            'data_class' => 'My\FaultBundle\Entity\Fault'
        );
    }

    public function getName()
    {
        return 'my_fault_fault';
    }

}

步骤类型:

<?php

namespace My\FaultBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilder;

class StepType extends AbstractType
{
    public function buildForm(FormBuilder $builder, array $options)
    {
        $builder
            ->add('body')
            ->add('photos', 'collection', array(
                'type' => new PhotoType(),
                'allow_add' => true,
                'allow_delete' => true,
                'prototype' => true,
                'by_reference' => false,
            ))
        ;
    }

    public function getDefaultOptions()
    {
        return array(
            'data_class' => 'My\FaultBundle\Entity\Step'
        );
    }

    public function getName()
    {
        return 'my_fault_step';
    }
}

最后一个 PhotoType:

<?php

namespace My\FaultBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilder;

class PhotoType extends AbstractType
{
    public function buildForm(FormBuilder $builder, array $options)
    {
        $builder
            ->add('name')
            ->add('description')
            ->add('filename')
        ;
    }

    public function getDefaultOptions()
    {
        return array(
            'data_class' => 'My\FaultBundle\Entity\Photo'
        );
    }

    public function getName()
    {
        return 'my_fault_photo';
    }
}

我发现了关于原型的优秀文章link,并且使用一个嵌套表单类型非常好,但是当我想让它与第三个嵌套平均 PhotoType 一起工作时我遇到了问题......照片在收集步骤,这是故障的集合...,如何通过此示例为步骤动态添加/删除照片...?

【问题讨论】:

    标签: collections symfony


    【解决方案1】:

    我做了一个 JS sn-p 可以在这里提供帮助。您只需添加两个按钮 [添加新的,删除最后一个]。 https://gist.github.com/juanmf/10483041

    它可以处理递归/嵌套原型。 它与允许您将生成的控件绑定到事件的中介(与 Symfony 事件调度程序相同)相结合。如果您不需要中介,请删除这些行:

    docdigital.mediatorInstance.send(
        docdigital.constants.mediator.messages.clonePrototype_prototypeAdded,
        $clone
    );
    

    【讨论】:

    【解决方案2】:

    您必须制作自己的原型。

    有两种解决方案:

    1. 用正则表达式查找property_path 的所有数字段,并用占位符替换它们

      $segments_found = preg_match('/\[(\d+)\]/', $prototype, $matches);
      
    2. 使用递归查找顶级集合父级并从那里手动构建路径。

    您是否尝试重新订购商品?这是一场彻头彻尾的灾难;)

    【讨论】:

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