简体   繁体   中英

Update form vich uploader, cannot delete or edit file

I can't delete or edit my uploaded image with VichUploaderBundle. I have an Annonce and Photo entities with OneToMany (bidirectionnal relation). I try with an attribute setUpdatedAt to call vich prePersist but he doesn't work.

Here is Annonce :

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

Photo entity with setter/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;
}

Here is my 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

My AnnonceType:

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

PhotoType:

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

The Controller :

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()
                                                                                      )
                            );
    }

And my template put input file for each Photo in Annonce in 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">

在您的实体中添加“ updateAt”属性有关更多信息,请参见http://mossco.co.uk/symfony-2/vichuploaderbundle-how-to-fix-cannot-overwrite-update-uploaded-file/

I know it is an old thread, but David's answer was not working in this case since OP tries to delete the Photo object within the Annonce object once it gets updated.

I had a similar case where i just had to check if the path (fileName) of the Photo object was null after the request handling (after performing a delete operation from the formular) and then if it is the case, i remove manually the Photo object calling entitymanager to perform the operation.

Looking into the code of VichUploaderBundle (see the remove method of UploadHandler class) shows that an event is being dispatched after requesting the deletion, and you could also bind to this event Events::POST_REMOVE (vich_uploader.post_remove) somewhere to handle the deletion. This solution sounds cleaner although the first one is also working well.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM