Intro
Я работаю над приложением Symfony 4, которое позволяет его пользователям создавать и редактировать сообщения, связанные с одним или несколькими изображениями.Данные хранятся в базе данных через Doctrine.Каждое сообщение имеет связанные объекты PostImage, которые содержат имена файлов фактических изображений.
Объект сообщения:
/**
* @ORM\Entity
*/
class Post
{
...
/**
* @ORM\OneToMany(targetEntity="PostImage", mappedBy="post", cascade={"persist", "remove"}, orphanRemoval=true)
*/
private $images;
...
Объект PostImage:
/**
* @ORM\Entity
*/
class PostImage
{
...
/**
* @ORM\ManyToOne(targetEntity="Post")
*/
private $post;
/**
* @ORM\Column(type="string", length=512)
*/
private $filename;
...
Кто япытается сделать
Хорошее описание базовой загрузки файла в БД: здесь .Однако я хотел бы сделать загрузку изображений и предварительный просмотр более динамичными.
Пользователь должен иметь возможность:
- Загружать одно / несколько изображений и просматривать их
- Загрузить ещеimages
- Удалить некоторые изображения
- Невозможно отправить форму, если все изображения удалены
- Редактировать сообщение (т. е. выполнить вышеуказанные шаги) позднее, используя ту же форму
Где я борюсь
JavaScript / DOM-манипуляция со стороны вышеизложенного мне вполне понятна.Я борюсь за то, чтобы создать форму или модифицировать типы на стороне Symfony.Поле «$ images» сущности Post является коллекцией, и способ использования форм с коллекциями в Symfony описан здесь .Но я изо всех сил пытаюсь понять, как изменить эту логику для работы с файлами.
Если я использую несопоставленный элемент управления FileType и загружаю файлы при изменении через AJAX, как мне хранить и отправлять ссылки, которые представляют текущий список изображений (некоторые могут быть новыми, некоторые - старыми, некоторые - удаленными)?Использовать элемент управления CollectionType с дочерними элементами HiddenType, которые содержат ссылки на файлы, загруженные на сервер?
class PostType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('images', CollectionType::class, array(
'allow_add' => true,
'allow_remove' => true,
'by_reference' => false,
'entry_type' => HiddenType::class
))
->add('add_images', FileType::class, array(
'label' => 'Add images',
'mapped' => false,
'multiple' => true
))
->add( //other fields..
...
}
}