Vichuploaderbundle: Флажок Удалить удаляет только имя файла из объекта

Созданный на 7 февр. 2016  ·  6Комментарии  ·  Источник: dustin10/VichUploaderBundle

Я только что установил VichUploader 1.0.0.-beta 7 для Symfony 2.8.2 и, чтобы избежать написания сценария удаления вручную, я хочу использовать флажок удаления для типа формы Vich.

Однако, когда я устанавливаю флажок «Удалить» и нажимаю «Обновить» (я обновляю сущность «Заметка» с помощью отношения OneToMany с вложением), сущность «Вложение» не удаляется полностью. Файл удален, свойство fileName пустое (не NULL), но поля id и поля updatedAt все еще там.

Поскольку объект «Вложение» не удаляется, ссылки все еще существуют (на несуществующие файлы).

Это то, как он должен работать, или я что-то неправильно сконфигурировал?

Это мой FormType для заметки:

$builder
            ->add('body', null, array(
                'label' => 'notes.body',
            ))
            ->add('attachments', CollectionType::class, array(
                'label' => 'notes.attachment',
                'entry_type' => NoteAttachmentType::class,
                'allow_add'    => true,
                'allow_delete' => true,
                'by_reference' => false,
            ))
        ;

и мой NoteAttachmentType:

 public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('file', VichFileType::class, array(
            'required'      => false,
            'allow_delete'  => true, // not mandatory, default is true
            'download_link' => true, // not mandatory, default is true
        ));
    }

Самый полезный комментарий

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

В вашем services.yml :

app_bundle.listener.removed_file_listener:
        class: AppBundle\EventListener\RemovedFileListener
        arguments: [@doctrine.orm.entity_manager]
        tags:
            - { name: kernel.event_listener, event: vich_uploader.post_remove, method: onPostRemove }

И слушатель:

namespace AppBundle\EventListener;

use Vich\UploaderBundle\Event\Event;

class RemovedFileListener
{
    /**
     *
     * <strong i="11">@param</strong> \Doctrine\ORM\EntityManager $em
     */
    public function __construct(\Doctrine\ORM\EntityManager $em)
    {
        $this->em = $em;
    }

    // make sure a file entity object is removed after the file is deleted
    public function onPostRemove(Event $event)
    {
        // get the file object
        $removedFile = $event->getObject();
        // remove the file object from the database
        $this->em->remove($removedFile);
        $this->em->flush();
    }
}

Все 6 Комментарий

У вас такая же проблема, вы ее решили?

VichUploaderBundle не удаляет сущности, вам нужно удалить их самостоятельно. Или у вас, вероятно, есть небольшая проблема с отношениями, которая не поддерживает удаление отношения.

Но тогда я не понимаю полезности этого кода:

    // Handler/UploadHandler.php
    public function remove($obj, $fieldName)
    {
        $mapping = $this->getMapping($obj, $fieldName);
        $oldFilename = $mapping->getFileName($obj);

        // nothing to remove, avoid dispatching useless events
        if (empty($oldFilename)) {
            return;
        }

        $this->dispatch(Events::PRE_REMOVE, new Event($obj, $mapping));

        $this->storage->remove($obj, $mapping);
        $mapping->setFileName($obj, null);

        $this->dispatch(Events::POST_REMOVE, new Event($obj, $mapping));
    }

Оба варианта allow_delete и download_link VichFileType типов $notes->removeAttachement($attachement) .

С другой стороны, опция allow_delete в CollectionType имеет дело с удалением элементов коллекции.

Просто имейте в виду, что этот пакет представляет собой пакет для загрузки файлов, не более того, он не работает и не должен иметь дело с вашими объектами.

Проще говоря, у вас может быть объект с атрибутом файла, который не является обязательным, например электронное письмо с вложением. Вы можете удалить вложение с помощью vichuploader, но сохранить электронное письмо, если вы хотите удалить электронное письмо, вам нужно, например, использовать доктрину.

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

В вашем services.yml :

app_bundle.listener.removed_file_listener:
        class: AppBundle\EventListener\RemovedFileListener
        arguments: [@doctrine.orm.entity_manager]
        tags:
            - { name: kernel.event_listener, event: vich_uploader.post_remove, method: onPostRemove }

И слушатель:

namespace AppBundle\EventListener;

use Vich\UploaderBundle\Event\Event;

class RemovedFileListener
{
    /**
     *
     * <strong i="11">@param</strong> \Doctrine\ORM\EntityManager $em
     */
    public function __construct(\Doctrine\ORM\EntityManager $em)
    {
        $this->em = $em;
    }

    // make sure a file entity object is removed after the file is deleted
    public function onPostRemove(Event $event)
    {
        // get the file object
        $removedFile = $event->getObject();
        // remove the file object from the database
        $this->em->remove($removedFile);
        $this->em->flush();
    }
}

Я считаю, что это решено с последним предложением.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги

Смежные вопросы

Chrysweel picture Chrysweel  ·  4Комментарии

benIT picture benIT  ·  3Комментарии

Marcelo-Petrucelli picture Marcelo-Petrucelli  ·  3Комментарии

Propscode picture Propscode  ·  4Комментарии

manguecreative picture manguecreative  ·  4Комментарии