Passed
Push — master ( ac8071...47eab6 )
by Dev
11:14
created

MediaListener::preUpdate()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 9
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 6

Importance

Changes 0
Metric Value
cc 2
eloc 5
nc 2
nop 2
dl 0
loc 9
ccs 0
cts 6
cp 0
crap 6
rs 10
c 0
b 0
f 0
1
<?php
2
3
namespace PiedWeb\CMSBundle\EventListener;
4
5
use Doctrine\ORM\EntityManager;
6
use League\ColorExtractor\Color;
7
use League\ColorExtractor\ColorExtractor;
8
use League\ColorExtractor\Palette;
9
use Liip\ImagineBundle\Imagine\Cache\CacheManager;
10
use Liip\ImagineBundle\Imagine\Data\DataManager;
11
use Liip\ImagineBundle\Imagine\Filter\FilterManager;
12
use PiedWeb\CMSBundle\Entity\MediaInterface;
13
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
14
use Symfony\Component\HttpKernel\KernelEvents;
15
use Vich\UploaderBundle\Event\Event;
16
use Doctrine\ORM\Event\PreUpdateEventArgs;
17
use Symfony\Component\Filesystem\Filesystem;
18
19
class MediaListener
20
{
21
    use MediaCacheGeneratorTrait;
22
23
    protected $projectDir;
24
    protected $iterate = 1;
25
    protected $em;
26
    protected $eventDispatcher;
27
    protected $filesystem;
28
    protected $rootDir;
29
    protected $cacheManager;
30
31
    public function __construct(
32
        string $projectDir,
33
        EntityManager $em,
34
        CacheManager $cacheManager,
35
        DataManager $dataManager,
36
        FilterManager $filterManager,
37
        EventDispatcherInterface $eventDispatcher,
38
        FileSystem $filesystem,
39
        string $rootDir
40
    ) {
41
        $this->projectDir = $projectDir;
42
        $this->em = $em;
43
        $this->cacheManager = $cacheManager;
44
        $this->dataManager = $dataManager;
45
        $this->filterManager = $filterManager;
46
        $this->eventDispatcher = $eventDispatcher;
47
        $this->filesystem = $filesystem;
48
        $this->rootDir = $rootDir;
49
    }
50
51
    /**
52
     * Check if name exist.
53
     */
54
    public function onVichUploaderPreUpload(Event $event)
55
    {
56
        $media = $event->getObject();
57
58
        $this->checkIfThereIsAName($media);
59
        $this->checkIfNameEverExistInDatabase($media);
60
    }
61
62
    /**
63
     * renameMediaOnMediaNameUpdate
64
     *
65
     * @param PreUpdateEventArgs $event
66
     */
67
    public function preUpdate(MediaInterface $media, PreUpdateEventArgs $event)
68
    {
69
        if ($event->hasChangedField('media')) {
70
            //var_dump($media->getRelativeDir().'/'.$media->getMediaBeforeUpdate()); exit;
71
            $this->filesystem->rename(
72
                $this->rootDir.'/../'.$media->getRelativeDir().'/'.$media->getMediaBeforeUpdate(),
73
                $this->rootDir.'/../'.$media->getRelativeDir().'/'.$media->getMedia()
74
                );
75
                $this->cacheManager->remove('/'.$media->getRelativeDir().'/'.$media->getMediaBeforeUpdate());
76
77
        }
78
    }
79
80
    public function preRemove(MediaInterface $media)
81
    {
82
        $this->filesystem->remove( $this->rootDir.'/../'.$media->getRelativeDir().'/'.$media->getMedia() );
83
        $this->cacheManager->remove('/'.$media->getRelativeDir().'/'.$media->getMediaBeforeUpdate());
84
    }
85
    /**
86
     * Si l'utilisateur ne propose pas de nom pour l'image,
87
     * on récupère celui d'origine duquel on enlève son extension.
88
     */
89
    protected function checkIfThereIsAName($media)
90
    {
91
        if (null === $media->getName() || empty($media->getName())) {
92
            $media->setName(preg_replace('/\\.[^.\\s]{3,4}$/', '', $media->getMediaFile()->getClientOriginalName()));
93
        }
94
    }
95
96
    protected function checkIfNameEverExistInDatabase($media)
97
    {
98
        $same = $this->em->getRepository(get_class($media))->findOneBy(['name' => $media->getName()]);
99
        if ($same && (null == $media->getId() || $media->getId() != $same->getId())) {
100
            $media->setName(preg_replace('/\([0-9]+\)$/', '', $media->getName()).' ('.$this->iterate.')');
101
            ++$this->iterate;
102
            $this->checkIfNameEverExistInDatabase($media);
103
        }
104
    }
105
106
    /**
107
     * Update RelativeDir.
108
     */
109
    public function onVichUploaderPostUpload(Event $event)
110
    {
111
        $media = $event->getObject();
112
        $mapping = $event->getMapping();
113
114
        $absoluteDir = $mapping->getUploadDestination().'/'.$mapping->getUploadDir($media);
115
        $relativeDir = substr_replace($absoluteDir, '', 0, strlen($this->projectDir) + 1);
116
117
        $media->setRelativeDir($relativeDir);
118
119
        if (false !== strpos($media->getMimeType(), 'image/')) {
120
            $this->updatePaletteColor($media);
121
122
            $this->cacheManager->remove($media->getFullPath());
123
124
            // Quick hack to have correct URI in image previewer
125
            // A better way would be to
126
            // implement https://github.com/liip/LiipImagineBundle/issues/242#issuecomment-71647135
127
            $path = '/'.$media->getRelativeDir().'/'.$media->getMedia();
128
            $this->storeImageInCache($path, $this->getBinary($path), 'default');
129
130
            $this->eventDispatcher->addListener(
131
                KernelEvents::TERMINATE,
132
                function () use ($media) {
133
                    $this->generateCache($media);
134
                }
135
            );
136
        }
137
    }
138
139
    protected function updatePaletteColor(MediaInterface $media)
140
    {
141
        $img = $this->projectDir.$media->getPath();
142
        $palette = Palette::fromFilename($img, Color::fromHexToInt('#FFFFFF'));
143
        $extractor = new ColorExtractor($palette);
144
        $colors = $extractor->extract();
145
        $media->setMainColor(Color::fromIntToHex($colors[0]));
146
    }
147
}
148