Коллекция форм Symfony 3 с вложенной коллекцией - PullRequest
0 голосов
/ 26 сентября 2018

У меня есть форма с полем с именем "плоскости".

Это поле может быть множественным (коллекция) со следующими подполями: - скорость - вес - цвет - двигатели

Подполе «engine» также представляет собой набор полей: - rpm - fuel_type - weight

Интересно, как бы выглядел конструктор форм Symfony, так как у пользователя должна быть возможность добавлять столько самолетов?как он хочет.То же самое относится к двигателям.

1 Ответ

0 голосов
/ 26 сентября 2018

Это будет выглядеть так:

строитель в классе с коллекцией самолетов:

public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('planes', CollectionType::class, array(
            'entry_type' => PlaneType::class,
            'allow_add'    => true,
            'allow_delete' => true, 
            'by_reference' => false,// this will call get/set of your entity
            'prototype' => true, // is needed coz there will be 2 prototypes 
            'prototype_name'=> '__planes__'//1-st prototype name

        ));
    }

строитель в классе PlaneType:

public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('speed');
        $builder->add('weight');
        $builder->add('color');
        $builder->add('engines', CollectionType::class, array(
            'entry_type' => EngineType::class,
            'allow_add'    => true,
            'allow_delete' => true, 
            'by_reference' => false,// this will call get/set of your entity
            'prototype' => true, // is needed coz there will be 2 prototypes 
            'prototype_name'=> '__engines__'//2 -nd prototype

        ));
    }

строитель в классе EngineType:

public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('rpm');
        $builder->add('fuel_type');
        $builder->add('weight');
    }

Также вы должны добавить некоторый javascript для динамического добавления / удаления полей, во время добавления вы должны обмениваться именами прототипов с идентификатором количества полей.

...