Completed
Push — master ( d714a0...062693 )
by
unknown
21:46
created

FileProvider::getFileFieldConstraints()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 7
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
CRAP Score 1

Importance

Changes 0
Metric Value
dl 0
loc 7
ccs 3
cts 3
cp 1
rs 9.4285
c 0
b 0
f 0
cc 1
eloc 4
nc 1
nop 1
crap 1
1
<?php
2
3
namespace MediaMonks\SonataMediaBundle\Provider;
4
5
use MediaMonks\SonataMediaBundle\Model\AbstractMedia;
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 13
    public function __construct(array $fileConstraintOptions = [])
22
    {
23 13
        $this->fileConstraintOptions = $fileConstraintOptions;
24 13
    }
25
26
    /**
27
     * @param FormMapper $formMapper
28
     */
29 4
    public function buildProviderCreateForm(FormMapper $formMapper)
30
    {
31 4
        $this->addRequiredFileField($formMapper, 'binaryContent', 'file');
32 4
    }
33
34
    /**
35
     * @param FormMapper $formMapper
36
     */
37 2
    public function buildProviderEditFormBefore(FormMapper $formMapper)
38
    {
39 2
        $this->addFileField($formMapper, 'binaryContent', 'file');
40 2
    }
41
42
    /**
43
     * @param AbstractMedia $media
44
     * @param bool $providerReferenceUpdated
45
     */
46 2
    public function update(AbstractMedia $media, $providerReferenceUpdated)
47
    {
48 2
        if (!is_null($media->getBinaryContent())) {
49 2
            if (empty($media->getImage())) {
50 2
                $this->setFileImage($media);
51
            }
52 2
            $filename = $this->handleFileUpload($media);
53 2
            if (!empty($filename)) {
54 2
                $media->setProviderReference($filename);
55
            }
56
        }
57
58 2
        parent::update($media, $providerReferenceUpdated);
59 2
    }
60
61
    /**
62
     * @return string
63
     */
64 11
    public function getIcon()
65
    {
66 11
        return 'fa fa-file';
67
    }
68
69
    /**
70
     * @return string
71
     */
72 12
    public function getName()
73
    {
74 12
        return 'file';
75
    }
76
77
    /**
78
     * @return string
79
     */
80 4
    public function getType()
81
    {
82 4
        return AbstractProvider::TYPE_FILE;
83
    }
84
85
    /**
86
     * @param AbstractMedia $media
87
     */
88 2
    protected function setFileImage(AbstractMedia $media)
89
    {
90
        /**
91
         * @var UploadedFile $file
92
         */
93 2
        $file = $media->getBinaryContent();
94 2
        if (empty($file)) {
95
            return;
96
        }
97
98 2
        $imageFilename = $this->getImageByExtension($file->getClientOriginalExtension());
99 2
        $media->setImageContent(
100 2
            new UploadedFile(
101 2
                $this->getImageLocation().$imageFilename,
102 2
                $imageFilename
103
            )
104
        );
105 2
    }
106
107
    /**
108
     * @param FormMapper $formMapper
109
     * @param string $name
110
     * @param string $label
111
     * @param array $options
112
     */
113 2
    public function addFileField(FormMapper $formMapper, $name, $label, $options = [])
114
    {
115 2
        $this->doAddFileField($formMapper, $name, $label,false, $this->getFileFieldConstraints($options));
116 2
    }
117
118
    /**
119
     * @param FormMapper $formMapper
120
     * @param string $name
121
     * @param string $label
122
     * @param array $options
123
     */
124 4
    public function addRequiredFileField(FormMapper $formMapper, $name, $label, $options = [])
125
    {
126 4
        $this->doAddFileField($formMapper, $name, $label, true, $this->getFileFieldConstraints($options));
127 4
    }
128
129
    /**
130
     * @param array $options
131
     * @return array
132
     */
133 4
    private function getFileFieldConstraints(array $options)
134
    {
135
        return [
136 4
            new Constraint\File($this->getFileConstraintOptions($options)),
137 4
            new Constraint\Callback([$this, 'validateExtension']),
138
        ];
139
    }
140
141
    /**
142
     * @param array $options
143
     * @return array
144
     */
145 4
    protected function getFileConstraintOptions(array $options = [])
146
    {
147 4
        $merged = array_merge($this->fileConstraintOptions, $options);
148 4
        unset($merged['extensions']);
149
150 4
        return $merged;
151
    }
152
153
    /**
154
     * @param $object
155
     * @param ExecutionContextInterface $context
156
     */
157 4
    public function validateExtension($object, ExecutionContextInterface $context)
158
    {
159 4
        if ($object instanceof UploadedFile && isset($this->fileConstraintOptions['extensions'])) {
160 3
            if (!in_array($object->getClientOriginalExtension(), $this->fileConstraintOptions['extensions'])) {
161 1
                $context->addViolation(
162 1
                    sprintf(
163 1
                        'It\'s not allowed to upload a file with extension "%s"',
164 1
                        $object->getClientOriginalExtension()
165
                    )
166
                );
167
            }
168
        }
169 4
    }
170
171
    /**
172
     * @param $extension
173
     * @return string
174
     */
175 3
    protected function getImageByExtension($extension)
176
    {
177 3
        if (in_array($extension, ['zip', 'rar', 'tar', 'gz'])) {
178 1
            return 'archive.png';
179
        }
180 3 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...
181 1
            return 'audio.png';
182
        }
183 3
        if (in_array($extension, ['php', 'html', 'css', 'js', 'vb', 'phar', 'py', 'jar', 'json', 'yml'])) {
184 1
            return 'code.png';
185
        }
186 3 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...
187 1
            return 'excel.png';
188
        }
189 3
        if (in_array($extension, ['png', 'jpg', 'jpeg', 'gif', 'bmp', 'tiff', 'ai', 'psd'])) {
190 1
            return 'image.png';
191
        }
192 3
        if (in_array($extension, ['mp4', 'avi', 'mkv', 'mpg', 'mpeg'])) {
193 1
            return 'movie.png';
194
        }
195 3
        if (in_array($extension, ['pdf'])) {
196 1
            return 'pdf.png';
197
        }
198 3
        if (in_array(
199
            $extension,
200 3
            ['ppt', 'pot', 'pos', 'pps', 'pptx', 'pptm', 'potx', 'potm', 'ppam', 'ppsx', 'ppsm', 'sldx', 'sldm']
201
        )) {
202 1
            return 'powerpoint.png';
203
        }
204 3
        if (in_array($extension, ['txt'])) {
205 3
            return 'text.png';
206
        }
207 1 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...
208 1
            return 'word.png';
209
        }
210
211
        return 'default.png';
212
    }
213
214
    /**
215
     * @return string
216
     */
217 2
    protected function getImageLocation()
218
    {
219 2
        return __DIR__.'/../Resources/image/file/';
220
    }
221
222
    /**
223
     * @return bool
224
     */
225 2
    public function supportsDownload()
226
    {
227 2
        return true;
228
    }
229
230
    /**
231
     * @return bool
232
     */
233 2
    public function supportsEmbed()
234
    {
235 2
        return false;
236
    }
237
238
    /**
239
     * @return bool
240
     */
241 2
    public function supportsImage()
242
    {
243 2
        return true;
244
    }
245
}
246