OneToMany в Doctrine ORM Mapping с изображениями Dropzone - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть форма в Symfony, где есть dropzone, использующий dropzone.js для загрузки изображений, когда изображения загружаются, путь к изображению вместе с идентификатором текущего экземпляра сущности, к которой относится форма, загружаютсяImage таблица как imageName и listing_id соответственно.listing_id - это id текущего списка, который заполняет пользователь.Так как у меня было бы несколько изображений на листинг, мне интересно, возможно ли сохранить отношение OneToMany между объектом listing и изображениями.

Когда пользователь нажимает «Добавить объявление», объект listing создается с нулевыми значениями в виде черновика (кроме идентификатора), а затем изображения сбрасываются, поэтому они добавляются в БД.впоследствии.

Listing.php

/**
 * @ORM\OneToMany(targetEntity="Image", mappedBy="listing", cascade={"persist"}, orphanRemoval=true)
 */
private $images;

Image.php

/**
 * @ORM\ManyToOne(targetEntity="Listing", inversedBy="images")
 * @ORM\JoinColumn(name="listing_id", referencedColumnName="id", onDelete="CASCADE")
 */
private $listing;

Это приводит к ошибке, когдасбросив изображение, но если я изменю $listing на

 /**
 * @ORM\Column(type="integer", nullable=true, name="listing_id")
 */
protected $listing;

, это работает, но я собираюсь получить изображения позже, используя объект listing, так что это не желаемый результат.Мой вопрос заключается в том, могу ли я сохранить такую ​​связь между этими двумя значениями, даже если объект изображения создается в другое время (позднее), чем в листинге.На самом деле, я получаю сообщение об ошибке, когда помещаю что-то в зону удаления, используя эти аннотации

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

1 Ответ

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

Вы на правильном пути.Я использую oneup / uploader-bundle для этой задачи.

Требуется правильный @ManyToOne.@ Колонна не будет работать.

Но в моем случае это было встроенное изображение с дополнительными данными.

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

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

Надеюсь, это поможет.Я могу поделиться своим кодом, но не на машине прямо сейчас.

РЕДАКТИРОВАТЬ: Это мой код:

var myDropzone = new Dropzone("#documentTypeUploadDropzone", {

            url : actionUrl,
            dictDefaultMessage: 'Bitte das neue Dokument hier ablegen!',

            // The configuration we've talked about above
            autoProcessQueue: false,

            maxFiles: 1,
            init: function () {
                this.on('success', function(e, serverResponse) {

                    myDropzone.removeAllFiles();

                });

                this.on('sending', function(file, xhr, formData) {
                    // Add additional data form original <form> which was already checked by html5 client side verification
                    formData.append('productId', 1);
                    formData.append('documentType[name]', value1;
                    formData.append('documentType[foreignUrl]',   $(#formInput).val());

                });

                var myDropzone = this;

                $('#documentTypeUploadForm').on('submit', function(e) {
                    // Make sure that the form isn't actually being sent.
                    e.preventDefault();
                    e.stopPropagation();


                    var files = myDropzone.getQueuedFiles();
                    if (!files.length) {
                        $.growl.error({ title:"Fehler", message: 'Bitte zuerst ein Dokument zum Hochladen auswählen.'});
                        return
                    }


                    myDropzone.processQueue();
                });


            }
        });
...