У меня есть форма в 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
объект, так что это не желаемый результат. Мой вопрос заключается в том, могу ли я сохранять такую связь между этими двумя значениями, даже если объект изображения создается в другое время (позднее), чем в листинге. На самом деле, я получаю сообщение об ошибке, когда помещаю что-то в зону удаления с помощью этих аннотаций.
Поскольку строки изображений вставляются в таблицу в режиме реального времени, а не при отправке формы, это может вызвать ошибку при использовании такого рода связей, но я не уверен.
Вы на правильном пути. Я использую 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();
});
}
});
Других решений пока нет …