VichUploaderBundle и форма для загрузки нескольких изображений - PullRequest
0 голосов
/ 26 июня 2018

Я использую VichUploaderBundle в Symfony 4, и у меня есть вопрос об использовании формы для отправки множества фотографий. Для этого мне нужно использовать CollectionType и отношение «один ко многим» (один продукт имеет несколько фотографий). Ниже я представляю код, который показывает только пустую рамку формы, и в нем отсутствуют кнопки для добавления фотографий, как они есть в этом загрузчике. Я не понимаю, почему это происходит.

Сущность продукта (один ко многим):

/**
* @var ProductMultiImage[]
* One Product has Many Images.
* @ORM\OneToMany(targetEntity="App\Entity\Image\ProductMultiImage", mappedBy="product", cascade={"persist"})
* @ORM\JoinColumn(nullable=true)
*/
private $productMultiImages = null;

Сущность изображения (многие-к-одному):

/**
* Many Images have One Product.
* @ORM\ManyToOne(targetEntity="App\Entity\Admin\Product", inversedBy="productMultiImages", cascade={"persist"})
* @ORM\JoinColumn(name="product_id", referencedColumnName="id", nullable=true)
*/
private $product = null;

Форма для добавления фотографий:

class ProductImageType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('productMultiImages', CollectionType::class, array(
                'data_class'    => ImageType::class,
                'allow_add'     => true,
                'allow_delete'  => true,
                'by_reference'  => false,
            ))
        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => null,
        ]);
    }
}

ImageType:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('imageFile', VichImageType::class)
    ;
}

Где я могу найти какое-либо решение?

Ответы [ 2 ]

0 голосов
/ 26 июня 2018

Вы, вероятно, забыли добавить в веточку необходимый JQuery-код, необходимый для работы коллекции. Плюс для кнопки вы должны создать ее самостоятельно с правильным классом. Он не приходит волшебным образом сам по себе;)

<button type="button" class="add-another-collection-widget" data-list="#your-fields-list">Add another email</button>

Код JQuery можно найти по адресу:

http://symfony.com/doc/current/reference/forms/types/collection.html

Этот код JQuery гарантирует, что каждый раз, когда вы нажимаете на кнопку, JQuery копирует элемент из атрибута данных (который вы можете увидеть, когда вы «проверяете» исходный элемент с помощью dev-tools), и добавляет число к это, начиная с 0 для первого элемента коллекции.

0 голосов
/ 26 июня 2018

Если $ productMultiImages имеет значение null, то в форме не будет ничего для заполнения. Установите для него пустую коллекцию массивов и добавьте в нее хотя бы одну пустую сущность Image.

В объекте Product __constuct ()

$this->productMultiImages = new ArrayCollection();
$this->productMultiImages->add(new Image();

Или добавьте их в экземпляр продукта, прежде чем передавать его в конструктор форм.

В прошлый раз, когда я использовал его, VichUploader не поддерживал многофайловую загрузку с одним элементом файла формы. Вам нужно будет использовать javascript на клиенте, чтобы добавить дополнительный элемент загрузки файла в форму для каждого изображения, которое вы хотите загрузить. Подробнее см. https://symfony.com/doc/current/form/form_collections.html.

...