Completed
Push — master ( 3b23f0...80edcc )
by
unknown
13:12
created

AbstractProvider::getTranslationDomain()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 0
Metric Value
dl 0
loc 4
ccs 0
cts 4
cp 0
rs 10
c 0
b 0
f 0
cc 1
eloc 2
nc 1
nop 0
crap 2
1
<?php
2
3
namespace MediaMonks\SonataMediaBundle\Provider;
4
5
use League\Flysystem\Filesystem;
6
use MediaMonks\SonataMediaBundle\Entity\Media;
7
use MediaMonks\SonataMediaBundle\Model\MediaInterface;
8
use Sonata\AdminBundle\Form\FormMapper;
9
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
10
use Symfony\Component\Form\Extension\Core\Type\FileType;
11
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
12
use Symfony\Component\HttpFoundation\File\UploadedFile;
13
use Symfony\Component\Validator\Constraints as Constraint;
14
15
abstract class AbstractProvider implements ProviderInterface
16
{
17
    const TYPE_EMBED = 'embed';
18
    const TYPE_IMAGE = 'image';
19
    const TYPE_DOWNLOAD = 'download';
20
21
    /**
22
     * @var Filesystem
23
     */
24
    protected $filesystem;
25
26
    /**
27
     * @var array
28
     */
29
    protected $templates = [];
30
31
    /**
32
     * @param Filesystem $filesystem
33
     */
34
    public function __construct(Filesystem $filesystem)
35
    {
36
        $this->filesystem = $filesystem;
37
    }
38
39
    /**
40
     * @return Filesystem
41
     */
42
    public function getFilesystem()
43
    {
44
        return $this->filesystem;
45
    }
46
47
    /**
48
     * @param Media $media
49
     */
50
    public function prePersist(Media $media)
51
    {
52
        $this->update($media);
53
    }
54
55
    /**
56
     * @param Media $media
57
     */
58
    public function preUpdate(Media $media)
59
    {
60
        $this->update($media);
61
    }
62
63
    /**
64
     * @param Media $media
65
     */
66
    public function update(Media $media)
67
    {
68
        $this->updateImage($media);
69
    }
70
71
    /**
72
     * @return string
73
     */
74
    public function getTranslationDomain()
75
    {
76
        return 'MediaMonksSonataMediaBundle';
77
    }
78
79
    /**
80
     * @param MediaInterface $media
81
     * @param array $options
82
     * @return array
83
     */
84
    public function toArray(MediaInterface $media, array $options = [])
85
    {
86
        return [
87
            'type'        => $this->getType(),
88
            'title'       => $media->getTitle(),
89
            'description' => $media->getDescription(),
90
            'authorName'  => $media->getAuthorName(),
91
            'copyright'   => $media->getCopyright(),
92
        ];
93
    }
94
95
    /**
96
     * @return array
97
     */
98
    protected function getPointOfInterestChoices()
99
    {
100
        return array_flip(
101
            [
102
                'top-left'     => 'Top Left',
103
                'top'          => 'Top',
104
                'top-right'    => 'Top Right',
105
                'left'         => 'Left',
106
                'center'       => 'Center',
107
                'right'        => 'Right',
108
                'bottom-left'  => 'Bottom Left',
109
                'bottom'       => 'Bottom',
110
                'bottom-right' => 'Bottom Right',
111
            ]
112
        );
113
    }
114
115
    /**
116
     * @param FormMapper $formMapper
117
     */
118
    public function buildCreateForm(FormMapper $formMapper)
119
    {
120
        $formMapper
121
            ->add('provider', 'hidden');
122
123
        $this->buildProviderCreateForm($formMapper);
124
    }
125
126
    /**
127
     * @param FormMapper $formMapper
128
     */
129
    public function buildEditForm(FormMapper $formMapper)
130
    {
131
        $formMapper
132
            ->with('General')
133
            ->add('provider', HiddenType::class);
134
135
        $this->buildProviderEditForm($formMapper);
136
137
        $formMapper->add(
138
            'imageContent',
139
            'file',
140
            [
141
                'required'    => false,
142
                'constraints' => [
143
                    new Constraint\File(),
144
                ],
145
                'label'       => 'Replacement Image',
146
            ]
147
        )
148
            ->add('title')
149
            ->add('description')
150
            ->add('authorName')
151
            ->add('copyright')
152
            ->add(
153
                'pointOfInterest',
154
                ChoiceType::class,
155
                [
156
                    'required' => false,
157
                    'label'    => 'Image Point Of Interest',
158
                    'choices'  => $this->getPointOfInterestChoices(),
159
                ]
160
            )
161
            ->end();
162
    }
163
164
    /**
165
     * @param FormMapper $formMapper
166
     */
167
    public function buildProviderEditForm(FormMapper $formMapper)
168
    {
169
    }
170
171
    /**
172
     * @param Media $media
173
     * @param bool $useAsImage
174
     * @return string|void
175
     */
176
    protected function handleFileUpload(Media $media, $useAsImage = false)
177
    {
178
        /**
179
         * @var UploadedFile $file
180
         */
181
        $file = $media->getBinaryContent();
182
183
        if (empty($file)) {
184
            return;
185
        }
186
187
        $filename = $this->getFilenameByFile($file);
188
        $this->writeToFilesystem($file, $filename);
189
190
        $media->setProviderMetadata(array_merge($media->getProviderMetaData(), $this->getFileMetaData($file)));
191
192
        if (empty($media->getImage()) && $useAsImage) {
193
            $media->setImage($filename);
194
            $media->setImageMetaData($media->getProviderMetaData());
195
        }
196
197
        if (empty($media->getTitle())) {
198
            $media->setTitle(str_replace('_', ' ', pathinfo($file->getClientOriginalName(), PATHINFO_FILENAME)));
199
        }
200
201
        return $filename;
202
    }
203
204
    /**
205
     * @param UploadedFile $file
206
     * @return array
207
     */
208
    protected function getFileMetaData(UploadedFile $file)
209
    {
210
        return [
211
            'originalName'      => $file->getClientOriginalName(),
212
            'originalExtension' => $file->getClientOriginalExtension(),
213
            'mimeType'          => $file->getClientMimeType(),
214
            'size'              => $file->getSize(),
215
        ];
216
    }
217
218
    /**
219
     * @param Media $media
220
     */
221
    public function updateImage(Media $media)
222
    {
223
        /**
224
         * @var UploadedFile $file
225
         */
226
        $file = $media->getImageContent();
227
        if (empty($file)) {
228
            return;
229
        }
230
231
        $filename = $this->getFilenameByFile($file);
232
        $this->writeToFilesystem($file, $filename);
233
234
        $media->setImage($filename);
235
        $media->setImageMetaData($this->getFileMetaData($file));
236
    }
237
238
    /**
239
     * @param FormMapper $formMapper
240
     * @param $name
241
     * @param $label
242
     * @param $required
243
     */
244
    public function addFileUploadField(FormMapper $formMapper, $name, $label, $required = false)
245
    {
246
        $constraints = [];
247
        if ($required) {
248
            $constraints = [
249
                new Constraint\NotBlank(),
250
                new Constraint\NotNull(),
251
            ];
252
        }
253
        $constraints[] = new Constraint\File();
254
255
        $formMapper
256
            ->add(
257
                $name,
258
                FileType::class,
259
                [
260
                    'multiple'    => false,
261
                    'data_class'  => null,
262
                    'constraints' => $constraints,
263
                    'label'       => $label,
264
                    'required'    => $required,
265
                ]
266
            );
267
    }
268
269
    /**
270
     * @param FormMapper $formMapper
271
     * @param $name
272
     * @param $label
273
     */
274
    public function addRequiredFileUploadField(FormMapper $formMapper, $name, $label)
275
    {
276
        $this->addFileUploadField($formMapper, $name, $label, true);
277
    }
278
279
    /**
280
     * @param UploadedFile $file
281
     * @return string
282
     */
283
    protected function getFilenameByFile(UploadedFile $file)
284
    {
285
        return sprintf(
286
            '%s_%d.%s',
287
            sha1($file->getClientOriginalName()),
288
            time(),
289
            $file->getClientOriginalExtension()
290
        );
291
    }
292
293
    /**
294
     * @param UploadedFile $file
295
     * @param $filename
296
     * @throws \Exception
297
     */
298
    protected function writeToFilesystem(UploadedFile $file, $filename)
299
    {
300
        set_error_handler(
301
            function () {
302
            }
303
        );
304
        $stream = fopen($file->getRealPath(), 'r+');
305
        $written = $this->getFilesystem()->writeStream($filename, $stream);
306
        fclose($stream); // this sometime messes up
307
        restore_error_handler();
308
309
        if (!$written) {
310
            throw new \Exception('Could not write to file system');
311
        }
312
    }
313
314
    /**
315
     * @param $type
316
     * @return boolean
317
     */
318
    public function supports($type)
319
    {
320
        if ($type === self::TYPE_EMBED) {
321
            return $this->supportsEmbed();
322
        }
323
        if ($type === self::TYPE_IMAGE) {
324
            return $this->supportsImage();
325
        }
326
        if ($type === self::TYPE_DOWNLOAD) {
327
            return $this->supportsDownload();
328
        }
329
330
        return false;
331
    }
332
333
    /**
334
     *
335
     */
336
    protected function disableErrorHandler()
337
    {
338
        set_error_handler(
339
            function () {
340
            }
341
        );
342
    }
343
344
    /**
345
     *
346
     */
347
    protected function restoreErrorHandler()
348
    {
349
        restore_error_handler();
350
    }
351
}
352