如何在 Symfony 中构建嵌套表单

How to build nested forms in Symfony

我正在使用 EasyAdmin 为一个实体 (Processes) 创建一个控制器,它与另一个实体 (Sections) 相关(一对多关系)与另一个实体(子部分)有关系(也一个-对多).

在 Processes 的“新”形式中,我有一个类型为 EasyAdmin Collection 的字段来添加部分,但是由于这些部分有小节,我需要在 Sections 中为小节添加另一个相等的字段...与小节具有相同的行为。 EasyAdmin 集合类型的字段(单击“添加项目”时,会显示该其他实体的迷你表单)。

主窗体用于创建流程,“部分”字段用于向该流程添加部分,在部分内,我需要另一个按钮(如 EasyAdmin 中的按钮)来为其创建更多子部分部分。

这是进程的主要形式:


这就是 Collection type 字段与创建 Sections 的字段的样子:



这是流程控制器:(我为名为“SeccionType”的部分创建了一个自定义字段)

    namespace App\Controller\Admin;

    use App\Entity\Proceso;
    use App\Form\Type\SeccionType;
    use EasyCorp\Bundle\EasyAdminBundle\Config\Crud;
    use EasyCorp\Bundle\EasyAdminBundle\Controller\AbstractCrudController;
    use EasyCorp\Bundle\EasyAdminBundle\Field\TextField;
    use EasyCorp\Bundle\EasyAdminBundle\Field\TextEditorField;
    use EasyCorp\Bundle\EasyAdminBundle\Field\CollectionField;

    class ProcesoCrudController extends AbstractCrudController
    {
       public static function getEntityFqcn(): string
       {
           return Proceso::class;
       }

       public function configureFields(string $pageName): iterable
       {
           yield TextField::new('nombre');
           yield TextEditorField::new('descripcion');
           yield CollectionField::new('secciones')        // <--- This is Sections field with the custom Symfony formType
                ->setEntryType(SeccionType::class)
                ->setFormTypeOptions(['block_prefix' => 'secciones_form',])
                ->addCssClass('actividadesFld');
           yield BooleanField::new('estado')->renderAsSwitch(false);
       }
    }

这是自定义字段的class SeccionType

namespace App\Form\Type;

use App\Entity\Seccion;
use App\Entity\Proceso;
use App\Entity\Subseccion;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\FormType;
use Symfony\Component\Form\Extension\Core\Type\CollectionType;
use Symfony\Component\Form\FormTypeInterface;
use EasyCorp\Bundle\EasyAdminBundle\Field\CollectionField;
use Symfony\Component\Validator\Constraints\NotNull;

class SeccionType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options): void
    {
        $builder
            ->add('name')
            ->add('description')
            ->add('order')
            ->add('tag')
            // ->add('proccess')
            ->add('subSection', CollectionType::class, ['entry_type' => ..?]);
        ;
    }

    public function configureOptions(OptionsResolver $resolver): void
    {
        $resolver->setDefaults([
            'data_class' => Seccion::class,
        ]);
    }
}

任何帮助或建议,我将感激不尽

您似乎没有添加 allow-add => true option to your CollectionType in SeccionType.php, as well as prototype => true. You should also probably create a SubSeccionType to give in the entry-type 选项。这应该是一个好的开始。