如何在Symfony2表单类型的集合中动态添加集合

Kar*_*ski 8 collections symfony

我在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';
    }

}
Run Code Online (Sandbox Code Playgroud)

步骤类型:

<?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';
    }
}
Run Code Online (Sandbox Code Playgroud)

和最后一个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';
    }
}
Run Code Online (Sandbox Code Playgroud)

我找到了关于原型的优秀文章链接,并且有一个嵌套的表单类型非常好,但我有一个问题,当想要使用第三个嵌套工作时意味着PhotoType ...照片是在步骤的集合,这是收集的错误...,如何动态添加/删除照片以获取此示例中的步骤...?

jua*_*nmf 3

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

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

docdigital.mediatorInstance.send(
    docdigital.constants.mediator.messages.clonePrototype_prototypeAdded,
    $clone
);
Run Code Online (Sandbox Code Playgroud)