1

コレクション フィールド タイプを使用せずに複数ファイルのアップロードを作成するにはどうすればよいでしょうか。問題は、クラスがあり、このクラスで画像をリンクする必要があるということです。これらの画像には説明やその他の種類の情報は必要ないため、メイン エンティティに追加のフィールドを作成するだけです。それから私は追加します

->add('files', 'file', array(
        'label' => 'Images',
        'required' => false,
        'attr' => array(
            'accept' => 'image/*',
            'multiple' => true
        )

そのフォームクラスとこれ:

    /**
 * @ORM\PrePersist()
 * @ORM\PreUpdate()
 */
public function preUpload()
{
    if (!empty($this->files)) {
        if (!empty($this->images)) {
            $this->insertingKey = $this->images->count();
        }
        foreach ($this->files as $file) {
            $imageName = uniqid('entity_') . '_' . date('Y-m-d_H:i') .  '.' . $file->guessExtension();
            if ($this->images === null) {
                $this->images = new ArrayCollection();
            }
            $this->images->add($imageName);
        }
    }
}

/**
 * @ORM\PostPersist()
 * @ORM\PostUpdate()
 */
public function upload()
{
    if (empty($this->files)) {
        return;
    }

    if ($this->insertingKey) {
        foreach ($this->files as $file) {
            $file->move($this->getUploadRootDir(), $this->images[ $this->insertingKey++ ]);
        }
    } else {
        foreach ($this->files as $key => $file) {
            $file->move($this->getUploadRootDir(), $this->images[ $key ]);
        }
    }
}

私のエンティティクラスのドクトリンイベントとして、そしてもちろん、ファイルフィールドを配列のように機能させます。しかし、私の問題は、2 回目に画像を追加できないことです。たとえば、すでにいくつかの画像をアップロードしていて、さらにアップロードすることにした場合、それらは物理的にアップロードされますが (プロジェクト ディレクトリで見ることができます)、ページには何も変更がありません。

アドバイスをいただけますか?または、多くのファイルをアップロードし、同時にフォーム フィールドを 1 つだけにする方法が他にあるでしょうか。まことにありがとうございます。

4

1 に答える 1

1

私はこの方法でこの問題を解決しました:

これは私のエンティティからのコードです

 /**
 * @ORM\PrePersist()
 * @ORM\PreUpdate()
 */
public function preUpload()
{
    if ($this->files[0] != null || !$this->files) {
        if (!empty($this->images)) {
            $this->insertingKey = count($this->images);
        }
        foreach ($this->files as $file) {
            $imageName = uniqid('pref_') . '_' . date('Y-m-d_H:i') .  '.' . $file->guessExtension();
            if ($this->images === null) {
                $this->images = array();
            }
            $this->images[] = $imageName;
        }
    }
}

/**
 * @ORM\PostPersist()
 * @ORM\PostUpdate()
 */
public function upload()
{
    if ($this->files[0] == null || !$this->files) {
        return;
    }

    if ($this->insertingKey) {
        foreach ($this->files as $file) {
            $file->move($this->getUploadRootDir(), $this->images[ $this->insertingKey++ ]);
        }
    } else {
        foreach ($this->files as $key => $file) {
            $file->move($this->getUploadRootDir(), $this->images[ $key ]);
        }
    }
}

public function getImagesWithAbsolutePath()
{
    if (!empty($this->images)) {
        $images = array();
        foreach ($this->images as $image) {
            $images[$image] = $this->getUploadRootDir() . '/' . $image;
        }

        return $images;
    }

    return null;
}

public function getImagesWithRelativePath()
{
    if (!empty($this->images)) {
        $images = array();
        foreach ($this->images as $image) {
            $images[$image] = $this->getUploadDir() . '/' . $image;
        }

        return $images;
    }

    return null;
}

public function getUploadRootDir()
{
    return __DIR__ . '/../../../../web/' . $this->getUploadDir();
}

public function getUploadDir()
{
    return 'images/venue';
}

public function removeImage($imageName)
{
    if ($this->images && in_array($imageName, $this->images)) {
        $key = array_search($imageName, $this->images);
        unset($this->images[$key]);
        if (file_exists($this->getUploadRootDir() . '/' . $imageName)) {
            unlink($this->getUploadRootDir() . '/' . $imageName);
        }

        $this->images = array_values($this->images);
    }
}

これは、コントローラーからのコードの一部です。

if ($request->getMethod() === "POST") {
        $form->bind($request);
        if ($form->isValid()) {
            $deleteImages = $request->request->get('delete_thumb', array());
            if (!empty($deleteImages)) {
                foreach ($request->request->get('delete_thumb') as $image) {
                    $imageName = substr($image, strrpos($image, '/') + 1);
                    $venue->removeImage($imageName);
                }
            }
            $this->persist($venue, true);
            if ($request->request->get('submit-and-quit') !== null) {
                return $this->redirectToRoute('admin_list');
            }

            return array('form' => $form->createView());
        }
    }
于 2013-03-26T07:19:59.410 に答える