Symfony FormType, получите выпадающий список из Arraycollection

у меня есть продукт Entity с набором массивов featureTypes (ManytoMany)
Класс продукта:

/**
* @var FeatureType
*
* @ORM\ManyToMany(targetEntity="AppBundle\Entity\FeatureType", mappedBy="products")
*/
private $featureTypes;

public function __construct()
{
$this->variants = new ArrayCollection();
$this->featureTypes = new ArrayCollection();
}

Класс FeatureType:

/**
* @var Product[]|ArrayCollection
*
* @ORM\ManyToMany(targetEntity="AppBundle\Entity\Product", inversedBy="featureTypes")
* @ORM\JoinTable(name="products_featureTypes")
*/
private $products;

Теперь я хочу создать форму, которая предоставит мне выпадающий список всех доступных типов объектов. Я хочу выбрать один и отправить его.

Я попробовал это так в моем addFeatureTypeToProductType:

public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('featureTypes', EntityType::class, [
'class' => FeatureType::class,
'choice_label' => 'name',
])
->add('submit', SubmitType::class)
->getForm();
}

Результатом является раскрывающийся список со всеми доступными типами объектов. Но когда я отправляю выбранный featureType, я получаю сообщение об ошибке: «Не удалось определить тип доступа для свойства« featureType »».

Тогда я попробовал так:

public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('featureTypes', CollectionType::class, [
'entry_type' => FeatureType::class,
'allow_add' => true,
])
->add('submit', SubmitType::class)
->getForm();
}

Но это не работает

Мой контроллер:

public function addFeatureTypeAction(Request $request, Product $product)
{
$form = $this->createForm(AddFeatureTypeToProductType::class, $product, [
'action' => $this->generateUrl('admin_products_add_featureTypes', [
'product' => $product->getId()
])
]);

$form->handleRequest($request);if($form->isSubmitted() && $form->isValid()) {
$featureType = $form->get('featureTypes');
$product->addFeatureTypes($featureType);
$em = $this->getDoctrine()->getManager();
$em->persist($product);
$em->flush();

return $this->redirectToRoute('admin_products_list_all');
}

return [
'form' => $form->createView()
];
}

Извините за мой английский: S

РЕДАКТИРОВАТЬ: Вот мой сумматор / съемник и установщик / получатель:

/**
* @return FeatureType
*/
public function getFeatureTypes()
{
return $this->featureTypes;
}

/**
* @param FeatureType $featureTypes
*/
public function setFeatureTypes($featureTypes)
{
$this->featureTypes = $featureTypes;
}/**
* Add new FeatureType
*
* @param FeatureType $featureType
*
* @return Product
*/
public function addFeatureTypes($featureType)
{
if (!$this->featureTypes->contains($featureType)) {
$this->featureTypes->add($featureType);
}

return $this;
}

/**
* @param FeatureType $featureType
*
* @return Product
*/
public function removeFeatureTypes($featureType)
{
if ($this->featureTypes->contains($featureType)) {
$this->featureTypes->remove($featureType);
}

return $this;
}

РЕДАКТИРОВАТЬ 2: я попробовал это снова с первым способом моей формы. Но я получаю новую ошибку сейчас. Я не знаю, почему мой объект «FeatureType» не знает метод содержит. Использует коллекцию Symfony Array.

Ошибка: Попытка вызвать неопределенный метод с именем «contains» класса «AppBundle \ Entity \ FeatureType».

Отладка останавливается в addFeatureTypes ($ featureType)

Я сейчас на шаг впереди. Теперь я использую collectionType.

 public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('featureTypes', CollectionType::class, [
'entry_type' => FeatureTypeType::class,
'allow_add' => true,
])
->add('submit', SubmitType::class)
->getForm();
}

Моя форма внешнего интерфейса показывает все типы функций, которые уже есть в моем продукте.
Но я не знаю, как тоже добавить новый …

1

Решение

Аннотации моих свойств были неверными.
Класс продукта:

/**
* @var FeatureType[]|ArrayCollection
*
* @ORM\ManyToMany(targetEntity="AppBundle\Entity\FeatureType", inversedBy="products", cascade={"persist"})
* @ORM\JoinTable(name="products_featureTypes")
*/
private $featureTypes;

Класс FeatureType:

/**
* @var Product[]|ArrayCollection
*
* @ORM\ManyToMany(targetEntity="AppBundle\Entity\Product", mappedBy="featureTypes", cascade={"persist"})
*
*/
private $products;

Моя форма:

public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('featureTypeToAdd', EntityType::class, [
'class'        => FeatureType::class,
'choice_label' => 'name',
'mapped'       => false,
])
->add('submit', SubmitType::class)
->getForm();
}

И мой контроллер:

 public function addFeatureTypeAction(Request $request, Product $product)
{
$form = $this->createForm(AddFeatureTypeToProductType::class, $product, [
'action' => $this->generateUrl('admin_products_add_featureTypes', [
'product' => $product->getId(),
]),
]);

$form->handleRequest($request);

if ($form->isSubmitted() && $form->isValid()) {
$featureType = $form->get('featureTypeToAdd')->getData();
$em = $this->getDoctrine()->getManager();
$product->addFeatureTypes($featureType);
$em->persist($product);
$em->flush();

return $this->redirectToRoute('admin_products_list_all');
}

return [
'form' => $form->createView(),
];
}
0

Другие решения

Других решений пока нет …