Completed
Push — master ( 61e1ff...22d949 )
by
unknown
03:51
created

AbstractProvider::writeToFilesystem()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 15
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 6

Importance

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