Completed
Push — master ( 1d38e8...81c238 )
by
unknown
04:02
created

AbstractProvider::validate()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

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