Коллекция Symfony Form приводит к тому, что сущность устанавливается внутри себя

При использовании объекта в коллекции объект устанавливается в свойстве, которое я вызываю.

Это имеет смысл, ProductType говорит: «Эй, вы хотите изменить заголовок? Конечно, вот список тех объектов, которые вы хотели» — и при отправке он устанавливает объект в качестве заголовка. Так что это не похоже на правильный способ добиться того, чего я хочу (назначить n количество продуктов пользователю), но это рекомендуемый способ:

http://symfony.com/doc/current/cookbook/form/form_collections.html

Итак, у меня есть пользователь с однонаправленным отношением ManyToMany к продукту:

/**
 * @ORM\ManyToMany(targetEntity="Product")
 */
protected $products;

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

...
->add('products', 'collection', array('type'=>new ProductType()))

и в ProductType у меня есть:

$builder->add('title', 'entity', array(
            'class' => 'ThingsStuffBundle:product',
            'property' => 'title',
            'required'  => false,
            'empty_value' => 'product',
            'query_builder' => function(EntityRepository $er) {
                return $er
                    ->createQueryBuilder('p')
                    ->orderBy('p.title', 'ASC');
            },
        ));

Который работает. Вроде, как бы, что-то вроде. Когда я отправляю форму, кажется, что я обновляю название продукта, а не использую его как просто массив выбора.

Представленные данные:

$userEntity->products[
    productEntity{
        id = 1,
        title = productEntity{
            id = 1,
            title = 'balls'
        }
    },
    productEntity{
        id = 2,
        title = productEntity{
            id = 2,
            title = 'suck'
        }
    }
]

person offwhite    schedule 15.10.2014    source источник


Ответы (1)


Если вы хотите создать этот тип коллекции добавления/удаления

->add('products', 'collection', array('type'=>new ProductType(),
'allow_add' => true,
'allow_delete' => true
))

А затем в ProductType:

$builder->add('product', 'entity', array(
        'class' => 'ThingsStuffBundle:product'
    ));

ПРИМЕЧАНИЕ. Это добавление/удаление будет работать, если вы добавите соответствующий интерфейсный javascript, как описано в документации.
Думайте о коллекции как о сумке, в которую вы добавляете или удаляете Продукты.

person Martin Fasani    schedule 17.10.2014