Получение текущего экземпляра объекта и передача его слушателю в Symfony - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть форма, которая используется для помещения значений в две разные сущности.Одна сущность - это таблица listing, а другая - таблица images.Таблица изображений обрабатывается слушателем, который прослушивает дропзону PostPersistEvent.Каждый раз, когда изображение перетаскивается в зону, оно добавляется в базу данных.Некоторое время у меня была проблема, что, если пользователь просто создавал форму в первый раз, список не существовал, и поэтому не было id, чтобы связать сущность image, с которой я решил.

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

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

<?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;
    }

    // If I could pass a current instance of the currently viewed Listing entity here, that would be ideal
    public function onUpload(PostPersistEvent $event)
    {
        $file = $event->getFile();
        // images entity
        $object = new MotorsAdsFile();
        $object->setImageName($file->getPathName());
        // I'd want to set the listing_id of MotorsAdsFile to the id of the currently viewed listing here
        // $object->setListing($listing->getId());

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

MotorsAdsFile (объект изображения)

/**
 * @param Listing $listing
 */
public function setListing($listing)
{
    $this->listing = $listing;
}

services.yml

directory_platform.upload_listener:
    class: DirectoryPlatform\AppBundle\EventListener\UploadListener
    arguments: ["@doctrine.orm.entity_manager"]
    tags:
        - { name: kernel.event_listener, event: oneup_uploader.post_persist, method: onUpload }

Мое намерение состоит в том, чтобы добавить идентификатор листинга к изображению после его загрузки в базу данных.listing_id в сущности image привязан к id объекта листинга, но у меня нет способа получить текущий экземпляр формы из слушателя Image are loaded into the db at a different time than the form values

Мой вопрос: как мне получить экземпляр объекта listing, который пользователь в данный момент просматривает в UploadListener, чтобы я мог использовать его id и установить для него listing_id иззагруженное изображение.

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

В вашей ветке вам необходим сценарий javascript для настройки dropzone для передачи некоторых дополнительных параметров вашему запросу:

<script>
    Dropzone.options.yourFormId = {
        params: {
            listing: "{{ listing.id }}" // if you pass listing as a variable to your template
            // or listing: "{{ form.vars.value.id }}" if listing is the underlying object of your form
        }
    };
</script>

Затем в вашем классе UploadListener получите идентификатор листинга объекта запроса, подобного этому:

class UploadListener
{
    protected $manager;

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

    // If I could pass a current instance of the currently viewed Listing entity here, that would be ideal
    public function onUpload(PostPersistEvent $event)
    {
        $file = $event->getFile();
        $object = new MotorsAdsFile();
        $object->setImageName($file->getPathName());

        // Get the listing parameter
        $request = $event->getRequest();
        $listingId = $request->get('listing');
        // //
        $object->setListing($listingId);

        $this->manager->persist($object);
        $this->manager->flush();
    }
}
0 голосов
/ 20 сентября 2018

Включите ID листинга в загрузку.

Если dropzone представляет собой отдельную форму, добавьте скрытый ввод с идентификатором.Вы можете отобразить значение в своем шаблоне, чтобы заполнить его при загрузке с помощью JS.

Если капельная зона инициализируется с помощью JS, добавьте идентификатор в параметр params .

СейчасУ UploadListener есть идентификатор листинга в запросе.


Что касается включения изображений при создании листинга, вы можете сгенерировать ID перед рендерингом формы создания, например, UUIDv4, установить ее для объекта итеперь он также отображается в форме, пригодной для загрузки.

...