我在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)
;
}
在哪里可以找到解决方案?
答案 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开始。