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

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

1 Ответ

0 голосов
/ 27 апреля 2018

Если вы используете класс поля 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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...