Oneup + Dropzone, как назначить значение Image Entity после отправки формы

У меня есть сущность, которая 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,

0

Решение

Задача ещё не решена.

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

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

По вопросам рекламы [email protected]