Обновить форму vich загрузчика, невозможно удалить или отредактировать файл

Я не могу удалить или отредактировать загруженное изображение с помощью VichUploaderBundle. У меня есть сущности Annonce и Photo с OneToMany (двунаправленное отношение). Я пытаюсь с атрибутом setUpdatedAt вызвать vich prePersist, но он не работает.

Вот Аннонс:

class Annonce
{
// ...
/**
 * @ORM\OneToMany(targetEntity="Immo\AnnonceBundle\Entity\Photo", mappedBy="annonce", cascade={"persist", "remove"})
 */
private $photos;

Фото-объект с установщиком / getterImage ():

use Symfony\Component\HttpFoundation\File\File;
use Symfony\Component\HttpFoundation\File\UploadedFile;
use Vich\UploaderBundle\Mapping\Annotation as Vich;
use Symfony\Component\Validator\Constraints as Assert;

/**
 * Photo
 * @Vich\Uploadable
 * @ORM\Table()
 */
class Photo
{   // id, etc. 
    /**
     * @Assert\File(
     *     maxSize="1M",
     *     mimeTypes={"image/png", "image/jpeg", "image/pjpeg"}
     * )
     * @Vich\UploadableField(mapping="uploads_image", fileNameProperty="url")
     *
     * @var File $image
     */
    protected $image;

    /**
     * @ORM\Column(type="string", length=255, name="url")
     *
     * @var string $url
     */
    protected $url;

    /**
     * @ORM\ManyToOne(targetEntity="Immo\AnnonceBundle\Entity\Annonce", inversedBy="photos")
     */
    private $annonce;

    /**
     * @ORM\Column(type="datetime", nullable=true)
     *
     * @var \DateTime $updatedAt
     */
    protected $updatedAt;

/**
 * Set image
 *
 * @param string $image
 * @return Photo
 */
public function setImage($image)
{
    $this->image = $image;

    if ($this->image instanceof UploadedFile) {
        $this->updatedAt = new \DateTime('now');
    }

    return $this;
}

Вот мой config.yml:

knp_gaufrette:
stream_wrapper: ~
adapters:
    uploads_adapter:
        local:
            directory: %kernel.root_dir%/../web/img/uploads
filesystems:
    uploads_image_fs:
        adapter:    uploads_adapter

vich_uploader:
    db_driver: orm
    twig: true
    gaufrette: true
    storage:   vich_uploader.storage.gaufrette
    mappings:
        uploads_image:
            delete_on_remove: true
            delete_on_update: true
            inject_on_load: true
            uri_prefix:         img/uploads
            upload_destination: uploads_image_fs
            namer: vich_uploader.namer_uniqid

Мой AnnonceType:

$builder->add('photos', 'collection', array('type' => new PhotoType(),
                                                'allow_add' => true,
                                                'allow_delete' => true,
                                                'by_reference' => false,
                                                )
                  )

PhotoType:

$builder->add('image', 'file')

Контроллер:

public function updateAnnonceAction($id)
    {
        $em = $this->getDoctrine()->getManager();

        $annonce = $em->getRepository('ImmoAnnonceBundle:Annonce')
                      ->findCompleteAnnonceById($id);

        $form = $this->createForm(new AnnonceType, $annonce);

        $request = $this->get('request');

        if ($request->getMethod() == 'POST') {
            $form->bind($request);

            if ($form->isValid()) {

                $em = $this->getDoctrine()->getManager();

                $em->persist($annonce);
                $em->flush();

                $this->get('session')->getFlashBag()->add('success', 'ok');

                return $this->redirect($this->generateUrl('immo_admin_annonce_homepage'));

            }
        }

        return $this->render('ImmoAnnonceBundle:Admin/Annonce:update.html.twig', array('annonce' => $annonce,
                                                                       'form' => $form->createView()
                                                                                      )
                            );
    }

И мой шаблон помещает входной файл для каждой фотографии в Annonce в html:

{{ form_widget(form.photos) }} // With JS to manage add/delete on each input.
// Return this :
<input type="file" required="required" name="immo_annoncebundle_annonce[photos][2][image]" id="immo_annoncebundle_annonce_photos_2_image">

person Kev    schedule 18.03.2014    source источник


Ответы (2)


Добавьте атрибут updateAt в свою сущность См. http://mossco.co.uk/symfony-2/vichuploaderbundle-how-to-fix-cannot-overwrite-update-uploaded-file/ для получения дополнительной информации.

person David    schedule 13.05.2014
comment
Спасибо!!! . Я работаю над этим решением. Я написал решение на испанском языке: hackeruna.com/2017/12/19/ - person juanitourquiza; 20.12.2017

Я знаю, что это старый поток, но ответ Дэвида в этом случае не работал, поскольку OP пытается удалить объект Photo в объекте Annonce после его обновления.

У меня был аналогичный случай, когда мне просто нужно было проверить, был ли путь (имя файла) объекта Photo нулевым после обработки запроса (после выполнения операции удаления из формуляра), а затем, если это так, я вручную удаляю фотографию объект, вызывающий entitymanager для выполнения операции.

Изучение кода VichUploaderBundle (см. Метод удаления класса UploadHandler) показывает, что событие отправляется после запроса на удаление, и вы также можете привязать к этому событию Events :: POST_REMOVE (vich_uploader.post_remove) где-нибудь для обработки удаления. Это решение звучит чище, хотя первое также работает хорошо.

person jav974    schedule 04.02.2016