Форма Symfony для создания коллекции сущностей, совместно использующих входные данные

Мне нужно создать форму для создания коллекции одного и того же объекта, но я не хочу повторять все поля для каждой записи коллекции (только поля, которые будут иметь разные значения).

Представьте себе Product сущность:

class Product
{
    private $category;
    private $name;
    private $price;
}

Я хотел бы, чтобы форма создавала несколько объектов Product одного и того же category одновременно. Таким образом, форма должна иметь одно поле category и набор name и price.

Моя форма будет выглядеть примерно так:

class ProductCollectionType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('category')
            ->add('products', CollectionType::class, array(
                'entry_type' => ProductType::class,
                'allow_add'  => true,
                'mapped'     => false,
            ))
        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => Product::class,
        ));
    }
}

class ProductType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('name')
            ->add('price')
        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => Product::class,
        ));
    }
}

Кто-нибудь знает, есть ли способ автоматически заполнить все объекты в типе коллекции родительскими полями? (только category в этом примере)

Спасибо!


person Seb33300    schedule 23.03.2017    source источник


Ответы (1)


Я бы решил эту проблему, имея формы для продуктов, которые не требуют значения для члена категории. Затем создайте одно несопоставленное поле для получения значения категории. Вернувшись в контроллер после отправки, примените несопоставленное значение категории к каждому из объектов продукта, а затем обработайте/сохраните/и т. д.

Перейдите на страницу Symfony Forms, найдите "mapped" и вы увидите, как добавить несопоставленное поле в форму.

person JasonGabler    schedule 23.03.2017
comment
Это очень простой пример, который я привожу, но в моем реальном случае это касается не только одного поля, и я хочу сохранить преимущества ограничений, которые я наложил на свою сущность для всех полей. Я надеялся, что Symfony предоставит что-то, предназначенное для этого варианта использования. - person Seb33300; 24.03.2017
comment
Вы можете создать экземпляр дополнительного продукта и сделать так, чтобы для его формы требовалось только поле категории. Теперь вы получаете все ограничения Product::category а-ля Doctrine, формы Symfony и т. д. Использование одного поля формы для набора объектов — довольно необычный вариант использования. Используйте все, что можете, но вы должны ожидать компромисса и дополнительной работы. - person JasonGabler; 24.03.2017