Oneup + Dropzone, как назначить значение Image Entity после отправки формы - PullRequest
0 голосов
/ 18 сентября 2018

У меня есть объект, который MotorsAdsFile, я использую прослушиватель событий, чтобы добавить изображение в таблицу после его перетаскивания

Загрузить прослушиватель

<?php
namespace DirectoryPlatform\AppBundle\EventListener;

use Doctrine\Common\Persistence\ObjectManager;
use Oneup\UploaderBundle\Event\PostPersistEvent;
use DirectoryPlatform\AppBundle\Entity\MotorsAdsFile;

use Symfony\Bundle\FrameworkBundle\Routing\Router;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

use FOS\UserBundle\Event\FilterUserResponseEvent;
use FOS\UserBundle\FOSUserEvents;

class UploadListener
{
    protected $manager;

    public function __construct(ObjectManager $manager)
    {
        $this->manager = $manager;
    }

    public function onUpload(PostPersistEvent $event)
    {
        $file = $event->getFile();

        $object = new MotorsAdsFile();
        // $object = new Image();
        $object->setImageName($file->getPathName());

        $this->manager->persist($object);
        $this->manager->flush();
    }
}

Изображение перетаскивается, отображается эскиз предварительного просмотра, в это время путь к файлу изображения добавляется в таблицу motorsadsfile, а изображение также перемещается в папку gallery.Это прекрасно работает, за исключением того, что мне нужно присвоить изображение listing_id, которое генерируется только после того, как форма была заполнена и отправлена.

Тип списка

<?php

namespace DirectoryPlatform\FrontBundle\Form\Type;

use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\FileType;
use Symfony\Component\Form\Extension\Core\Type\FormType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\CollectionType;
use Symfony\Component\Form\Extension\Core\Type\IntegerType;
use Symfony\Component\Form\Extension\Core\Type\MoneyType;
use Symfony\Component\Form\Extension\Core\Type\NumberType;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use DirectoryPlatform\FrontBundle\Form\Type\DropZoneType;

use AdamQuaile\Bundle\FieldsetBundle\Form\FieldsetType;

use DirectoryPlatform\AppBundle\Entity\Listing;

class ListingType extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array                $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('name', TextType::class)
            ->add('images', FormType::class, [
                'label' => 'Drop files here',
                'attr' => [
                  'class' => 'dropzone',
                  'action' => '/_uploader/gallery/upload',
                ]
            ])
            ->add('header', ChoiceType::class, [
                'expanded' => true,
                'choices' => [
                    'None' => Listing::HEADER_NONE,
                    'Single Image' => Listing::HEADER_SINGLE_IMAGE,
                    'Gallery' => Listing::HEADER_GALLERY,
                    'Map' => Listing::HEADER_MAP,
                ]
            ])
            ->add('isAuction', ChoiceType::class, [
                    'label' => 'Is this an auction?',
                    'required' => true,
                'choices' => [
                    'Yes' => true,
                    'No' => false,
                ]
            ])
            ->add('website', TextType::class, [
              'required' => false,
              'label' => 'If the auction is online, please provide a website.'
            ])
            ->add('slug', TextType::class)
            ->add('description', TextareaType::class, [
                'required' => false,
                'attr' => ['class' => 'wysiwyg', 'rows' => 5],
            ])
            ->add('address', TextareaType::class, [
                'required' => false,
                'attr' => ['rows' => 3]
            ])
            ->add('price', MoneyType::class, [
                'currency' => $options['currency'],
                'required' => false,
            ])
            ->add('acres', IntegerType::class, [
                'label' => 'Acres',
                'required' => true,
            ])
            ->add('videoYoutube', TextType::class, [
                'required' => false,
            ])
            ->add('openingHours', TextareaType::class, [
                'required' => false,
                'attr' => [
                    'rows' => 7,
                ]
            ])
            ->add('geolocation', FieldsetType::class, [
                'label' => false,
                'legend' => 'Geolocation',
                'fields' => function (FormBuilderInterface $builder) use ($options) {
                    $builder->add('search', TextType::class, [
                        'mapped' => true,
                        'required' => false,
                    ])
                    ->add('latitude', NumberType::class, [
                        'required' => false,
                    ])
                    ->add('longitude', NumberType::class, [
                        'required' => false,
                    ]);
                }
            ])
            ->add('taxonomies', FieldsetType::class, [
                'label' => false,
                'legend' => 'Taxonomies',
                'fields' => function (FormBuilderInterface $builder) use ($options) {
                    $builder->add('category', EntityType::class, [
                        'class' => 'AppBundle:Category',
                        'required' => false,
                        'choices' => $options['hierarchy_categories']->tree(),
                        'choice_label' => function ($category) use ($options) {
                            return $options['hierarchy_categories']->getName($category);
                        },
                    ])
                    ->add('location', EntityType::class, [
                        'class' => 'AppBundle:Location',
                        'required' => false,
                        'choice_label' => function ($location) use ($options) {
                            return $options['hierarchy_locations']->getName($location);
                        },
                    ])
                    ->add('amenities', EntityType::class, [
                        'class' => 'AppBundle:Amenity',
                        'multiple' => true,
                        'expanded' => true,
                        'required' => false,
                    ]);
                }
            ])
            ->add('save', SubmitType::class, [
                'attr' => ['class' => 'btn-primary'],
            ]);
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'currency' => 'USD',
            'hierarchy_categories' => null,
            'hierarchy_locations' => null,
            'data_class' => 'DirectoryPlatform\AppBundle\Entity\Listing',
        ]);
    }
}

Может быть, есть событие, которое я мог бы прослушать, совпадающее с успешной отправкой формы, чтобы я мог просто добавить listing_id к motorsadsfile таблица после того, как список был создан и на самом деле имеет идентификатор?

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

Изображение и список - это отдельные объекты, которые объединяются listing_id с Image и id с Listing.

...