у меня есть продукт 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();
}
Моя форма внешнего интерфейса показывает все типы функций, которые уже есть в моем продукте.
Но я не знаю, как тоже добавить новый …
Аннотации моих свойств были неверными.
Класс продукта:
/**
* @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(),
];
}
Других решений пока нет …