Completed
Push — master ( 8cca00...50a95d )
by
unknown
06:53
created

FileProvider::__construct()   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 1
crap 2
1
<?php
2
3
namespace MediaMonks\SonataMediaBundle\Provider;
4
5
use MediaMonks\SonataMediaBundle\Entity\Media;
6
use Sonata\AdminBundle\Form\FormMapper;
7
use Symfony\Component\HttpFoundation\File\UploadedFile;
8
use Symfony\Component\Validator\Constraints as Constraint;
9
use Symfony\Component\Validator\Context\ExecutionContextInterface;
10
11
class FileProvider extends AbstractProvider
12
{
13
    /**
14
     * @var array
15
     */
16
    private $fileConstraintOptions = [];
17
18
    /**
19
     * @param array $fileConstraintOptions
20
     */
21
    public function __construct(array $fileConstraintOptions = [])
22
    {
23
        $this->fileConstraintOptions = $fileConstraintOptions;
24
    }
25
26
    /**
27
     * @param FormMapper $formMapper
28
     */
29
    public function buildProviderCreateForm(FormMapper $formMapper)
30
    {
31
        $this->addRequiredFileField($formMapper, 'binaryContent', 'File');
32
    }
33
34
    /**
35
     * @param FormMapper $formMapper
36
     */
37
    public function buildProviderEditForm(FormMapper $formMapper)
38
    {
39
        $this->addFileField($formMapper, 'binaryContent', 'File');
40
    }
41
42
    /**
43
     * @param Media $media
44
     * @param bool $providerReferenceUpdated
45
     */
46
    public function update(Media $media, $providerReferenceUpdated)
47
    {
48
        if (!is_null($media->getBinaryContent())) {
49
            if (empty($media->getImage())) {
50
                $this->setFileImage($media);
51
            }
52
            $filename = $this->handleFileUpload($media);
53
            if (!empty($filename)) {
54
                $media->setProviderReference($filename);
55
            }
56
        }
57
58
        parent::update($media, $providerReferenceUpdated);
59
    }
60
61
    /**
62
     * @return string
63
     */
64
    public function getIcon()
65
    {
66
        return 'fa fa-file';
67
    }
68
69
    /**
70
     * @return string
71
     */
72
    public function getTitle()
73
    {
74
        return 'File';
75
    }
76
77
    public function getType()
78
    {
79
        return 'file';
80
    }
81
82
    /**
83
     * @return string
84
     */
85
    public function getEmbedTemplate()
86
    {
87
        return 'MediaMonksSonataMediaBundle:Provider:file_embed.html.twig';
88
    }
89
90
    /**
91
     * @param Media $media
92
     */
93
    protected function setFileImage(Media $media)
94
    {
95
        /**
96
         * @var UploadedFile $file
97
         */
98
        $file = $media->getBinaryContent();
99
        if (empty($file)) {
100
            return;
101
        }
102
103
        $imageFilename = $this->getImageByExtension($file->getClientOriginalExtension());
104
        $media->setImageContent(
105
            new UploadedFile(
106
                $this->getImageLocation().$imageFilename,
107
                $imageFilename
108
            )
109
        );
110
    }
111
112
    /**
113
     * @param FormMapper $formMapper
114
     * @param string $name
115
     * @param string $label
116
     * @param array $options
117
     */
118 View Code Duplication
    public function addFileField(FormMapper $formMapper, $name, $label, $options = [])
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
119
    {
120
        $this->doAddFileField(
121
            $formMapper,
122
            $name,
123
            $label,
124
            false,
125
            [
126
                new Constraint\File($this->getFileConstraintOptions($options)),
127
                new Constraint\Callback([$this, 'validateExtension']),
128
            ]
129
        );
130
    }
131
132
    /**
133
     * @param FormMapper $formMapper
134
     * @param string $name
135
     * @param string $label
136
     * @param array $options
137
     */
138 View Code Duplication
    public function addRequiredFileField(FormMapper $formMapper, $name, $label, $options = [])
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
139
    {
140
        $this->doAddFileField(
141
            $formMapper,
142
            $name,
143
            $label,
144
            true,
145
            [
146
                new Constraint\File($this->getFileConstraintOptions($options)),
147
                new Constraint\Callback([$this, 'validateExtension']),
148
            ]
149
        );
150
    }
151
152
    /**
153
     * @param array $options
154
     * @return array
155
     */
156
    protected function getFileConstraintOptions(array $options = [])
157
    {
158
        $merged = array_merge($this->fileConstraintOptions, $options);
159
        unset($merged['extensions']);
160
161
        return $merged;
162
    }
163
164
    /**
165
     * @param $object
166
     * @param ExecutionContextInterface $context
167
     */
168
    public function validateExtension($object, ExecutionContextInterface $context)
169
    {
170
        if ($object instanceof UploadedFile && isset($this->fileConstraintOptions['extensions'])) {
171
            if (!in_array($object->getClientOriginalExtension(), $this->fileConstraintOptions['extensions'])) {
172
                $context->addViolation('It\'s not allowed to upload a file with extension "%s"');
173
            }
174
        }
175
    }
176
177
    /**
178
     * @param $extension
179
     * @return string
180
     */
181
    protected function getImageByExtension($extension)
182
    {
183
        if (in_array($extension, ['zip', 'rar', 'tar', 'gz'])) {
184
            return 'archive.png';
185
        }
186 View Code Duplication
        if (in_array($extension, ['wav', 'mp3', 'flac', 'aac', 'aiff', 'm4a', 'ogg', 'oga', 'wma'])) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
187
            return 'audio.png';
188
        }
189
        if (in_array($extension, ['php', 'html', 'css', 'js', 'vb', 'phar', 'py', 'jar', 'json', 'yml'])) {
190
            return 'code.png';
191
        }
192 View Code Duplication
        if (in_array($extension, ['xls', 'xlt', 'xlm', 'xlsx', 'xlsm', 'xltx', 'xltm'])) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
193
            return 'excel.png';
194
        }
195
        if (in_array($extension, ['png', 'jpg', 'jpeg', 'gif', 'bmp', 'tiff', 'ai', 'psd'])) {
196
            return 'image.png';
197
        }
198
        if (in_array($extension, ['mp4', 'avi', 'mkv', 'mpg', 'mpeg'])) {
199
            return 'movie.png';
200
        }
201
        if (in_array($extension, ['pdf'])) {
202
            return 'pdf.png';
203
        }
204
        if (in_array(
205
            $extension,
206
            ['ppt', 'pot', 'pos', 'pps', 'pptx', 'pptm', 'potx', 'potm', 'ppam', 'ppsx', 'ppsm', 'sldx', 'sldm']
207
        )) {
208
            return 'powerpoint.png';
209
        }
210
        if (in_array($extension, ['txt'])) {
211
            return 'txt.png';
212
        }
213 View Code Duplication
        if (in_array($extension, ['doc', 'dot', 'wbk', 'docx', 'docm', 'dotx', 'dotm', 'docb'])) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
214
            return 'word.png';
215
        }
216
217
        return 'default.png';
218
    }
219
220
    /**
221
     * @return string
222
     */
223
    protected function getImageLocation()
224
    {
225
        return __DIR__.'/../Resources/image/file/';
226
    }
227
228
    /**
229
     * @return bool
230
     */
231
    public function supportsDownload()
232
    {
233
        return true;
234
    }
235
236
    /**
237
     * @return bool
238
     */
239
    public function supportsEmbed()
240
    {
241
        return false;
242
    }
243
244
    /**
245
     * @return bool
246
     */
247
    public function supportsImage()
248
    {
249
        return true;
250
    }
251
}
252