1

我在 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,
        ]);
    }
}

图像类型:

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

我在哪里可以找到任何解决方案?

4

2 回答 2

0

如果 $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

于 2018-06-26T10:38:22.350 回答
0

您可能忘记将必要的 JQuery 代码添加到 twig 中,这是使集合正常工作所必需的。另外,对于按钮,您必须自己创建一个具有正确类的按钮。它本身不会神奇地出现;)

<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 都会将元素从数据属性中复制出来(当您使用开发工具“检查”原始元素时可以看到该元素),并在其中添加一个数字,开始第一个集合项为 0。

于 2018-06-26T12:09:17.577 回答