1

Symfony 4 で VichUploaderBundle を使用していますが、フォームを使用して大量の写真を送信する方法について質問があります。これを行うには、CollectionType と 1 対多の関係を使用する必要があります (1 つの製品に複数の写真があります)。以下に、フォームの空のフレームのみを表示するコードを示します。このアップローダーには、写真を追加するためのボタンがありません。なぜこれが起こっているのかわかりません。

製品エンティティ (1 対多):

/**
* @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;

イメージ エンティティ (多対 1):

/**
* 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 の場合、フォームには入力するものがありません。これを空の配列コレクションに設定し、少なくとも 1 つの空の 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 に答える