Symfony Forms и ManyToMany. Как настроить форму с полем загрузки файла, которое также является полем EntityType?

Мне нужно сделать поле формы с загрузкой файла, который также является частью сущности 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,
)

Новая версия типов форм с Embeded Forms, которые также вызывают проблемы:

Ожидаемое значение типа «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;

-1

Решение

Если вы используете класс поля EntityType, entry_type не ожидаемый тип. Ожидается использование сущности, связанной с вашей базой данных через Doctrine, от yourbundleapp/Entity, EntityType действует как ChoiceType, но он напрямую взаимодействует с сущностью Doctrine, объявленной в классе параметров. Вы можете найти, как это работает здесь: https://symfony.com/doc/current/reference/forms/types/entity.html

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

Вы должны сначала определить свою новую сущность (из yourbundleapp / Entity), а затем передать ее в качестве аргумента вашей форме (из yourbundleapp / Form), например так:

$image = new ShopProductImages();
$form = $this->get('form.factory')->create(ProductTypeNew::class, $image);

Если вы хотите, вы также можете добавить форму в свою первую форму, вставив ее: https://symfony.com/doc/current/form/embedded.html

Если я поняла плохо, пожалуйста, не могли бы вы быть более подробным о том, что вы хотите сделать и что вы сделали?

0

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

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

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector