Мне нужно сделать поле формы с загрузкой файла, который также является частью сущности ManyToMany. Теперь моя конфигурация выглядит так, как показано ниже, и она работает ...
class ProductTypeNew extends AbstractType
{
/**
* {@inheritdoc}
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('name')
->add('price')
->add('description', TextareaType::class)
->add('quantity')
->add('file', FileType::class, array('label' => 'Zdjęcie'))
;
... но мне нужно вручную получить ввод формы в контроллере и установить форму объекта
if ($form->isSubmitted() && $form->isValid())
{
$image = new ShopProductImages();
$file = $product->getFile();
$fileName = $this->generateUniqueFileName().'.'.$file->guessExtension();
$file->move(
$this->getParameter('shop_images_directory'),
$fileName
);
$image->setFile($fileName);
$product->addShopProductImages($image);
$product->setFile($fileName);
$em = $this->getDoctrine()->getManager();
$em->persist($image);
$em->persist($product);
$em->flush();
Я хотел бы сделать что-то вроде этого (но это не работает):
->add('shopProductImages', EntityType::class, array(
'by_reference' => false,
'entry_type' => FileType::class,
)
Новая версия типов форм с вложенными формами, которые также вызывают проблемы:
Ожидаемое значение типа "Doctrine \ Common \ Collections \ Collection | array"
для поля ассоциации
"AppBundle \ Entity \ ShopProducts # $ shopProductImages", получил
Вместо этого "Symfony \ Component \ HttpFoundation \ File \ UploadedFile".
... с конфигурацией ниже:
ProductTypeNew:
class ProductTypeNew extends AbstractType
{
/**
* {@inheritdoc}
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('name', null, array('label' => 'Nazwa'))
->add('price', null, array('label' => 'Cena'))
->add('description', TextareaType::class, array('label' => 'Opis'))
->add('quantity', null, array('label' => 'Ilość'))
->add('shopProductImages', ShopProductsImagesType::class);
}
/**
* {@inheritdoc}
*/
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => ShopProducts::class,
]);
}
ShopProductsImagesType:
class ShopProductsImagesType extends AbstractType
{
/**
* {@inheritdoc}
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('file', FileType::class, array('label' => 'Zdjęcie'))
;
}
/**
* {@inheritdoc}
*/
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
// 'data_class' => ShopProductImages::class,
'data_class' => null,
]);
}
Entity ShopПродукты:
/**
* ShopProducts
*
* @ORM\Table(name="shop_products")
* @ORM\Entity
*/
class ShopProducts
{
....
/**
* INVERSE SIDE
*
* @var \Doctrine\Common\Collections\Collection
*
* @ORM\ManyToMany(
* targetEntity="AppBundle\Entity\ShopProductImages",
* mappedBy="shopProducts",
* cascade={"persist"}
* )
*/
private $shopProductImages;
Entity ShopProductImages:
* @ORM\Entity
*/
class ShopProductImages
{
/**
* @var string
*
* @ORM\Column(name="file", type="text", length=255, nullable=true)
*/
private $file;