VichUploaderBundle和表单到多图像上传

时间:2018-06-26 08:02:59

标签: symfony vichuploaderbundle multi-upload

我在Symfony 4中使用VichUploaderBundle,但我对使用表单发送一堆照片有疑问。为此,我必须使用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 :(得分:0)

如果$ productMultiImages为null,则该表单将没有任何内容可填充。将其设置为一个空数组集合,并向其中添加至少一个空的Image实体。

在产品实体的__constuct()

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

或将它们添加到实例化的产品中,然后再将其传递给表单构建器。

上次使用它时,VichUploader不支持使用单个表单文件元素进行多文件上传。 您需要在客户端上使用javascript,为要上传的每个图像在表单中添加其他文件上传元素。有关更多信息,请参见https://symfony.com/doc/current/form/form_collections.html

答案 1 :(得分:0)

您可能忘记了将必要的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都会将元素复制出data属性(当您使用dev-tools“检查”原始元素时可以看到),并在其中添加一个数字它,从第一个收集项目的0开始。