Completed
Push — master ( 972ef8...f0e675 )
by
unknown
03:54
created

Configuration::addResizerSection()   B

Complexity

Conditions 1
Paths 1

Size

Total Lines 24
Code Lines 21

Duplication

Lines 0
Ratio 0 %
Metric Value
dl 0
loc 24
rs 8.9713
cc 1
eloc 21
nc 1
nop 1
1
<?php
2
3
/*
4
 * This file is part of the Sonata Project package.
5
 *
6
 * (c) Thomas Rabaix <[email protected]>
7
 *
8
 * For the full copyright and license information, please view the LICENSE
9
 * file that was distributed with this source code.
10
 */
11
12
namespace Sonata\MediaBundle\DependencyInjection;
13
14
use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
15
use Symfony\Component\Config\Definition\Builder\TreeBuilder;
16
use Symfony\Component\Config\Definition\ConfigurationInterface;
17
18
/**
19
 * This is the class that validates and merges configuration from your app/config files.
20
 *
21
 * To learn more see {@link http://symfony.com/doc/current/cookbook/bundles/extension.html#cookbook-bundles-extension-config-class}
22
 */
23
class Configuration implements ConfigurationInterface
24
{
25
    /**
26
     * {@inheritdoc}
27
     */
28
    public function getConfigTreeBuilder()
29
    {
30
        $treeBuilder = new TreeBuilder();
31
        $node = $treeBuilder->root('sonata_media');
32
33
        $node
34
            ->children()
35
                ->scalarNode('db_driver')->isRequired()->end()
36
                ->scalarNode('default_context')->isRequired()->end()
37
                ->arrayNode('admin_format')
38
                    ->info('Configures the thumbnail preview for the admin')
39
                    ->addDefaultsIfNotSet()
40
                    ->children()
41
                        ->scalarNode('width')->defaultValue(200)->end()
42
                        ->scalarNode('height')->defaultValue(false)->end()
43
                        ->scalarNode('quality')->defaultValue(90)->end()
44
                        ->scalarNode('format')->defaultValue('jpg')->end()
45
                        ->scalarNode('constraint')->defaultValue(true)->end()
46
                    ->end()
47
                ->end()
48
            ->end()
49
        ;
50
51
        $this->addContextsSection($node);
52
        $this->addCdnSection($node);
53
        $this->addFilesystemSection($node);
54
        $this->addProvidersSection($node);
55
        $this->addExtraSection($node);
56
        $this->addModelSection($node);
57
        $this->addBuzzSection($node);
58
        $this->addResizerSection($node);
59
60
        return $treeBuilder;
61
    }
62
63
    /**
64
     * @param ArrayNodeDefinition $node
65
     */
66
    private function addContextsSection(ArrayNodeDefinition $node)
67
    {
68
        $node
69
            ->children()
70
                ->arrayNode('contexts')
71
                    ->useAttributeAsKey('id')
72
                    ->prototype('array')
73
                        ->children()
74
                            ->arrayNode('download')
75
                                ->addDefaultsIfNotSet()
76
                                ->children()
77
                                    ->scalarNode('strategy')->defaultValue('sonata.media.security.superadmin_strategy')->end()
78
                                    ->scalarNode('mode')->defaultValue('http')->end()
79
                                ->end()
80
                            ->end()
81
                            ->arrayNode('providers')
82
                                ->prototype('scalar')
83
                                    ->defaultValue(array())
84
                                ->end()
85
                            ->end()
86
                            ->arrayNode('formats')
87
                                ->isRequired()
88
                                ->useAttributeAsKey('id')
89
                                ->prototype('array')
90
                                    ->children()
91
                                        ->scalarNode('width')->defaultValue(false)->end()
92
                                        ->scalarNode('height')->defaultValue(false)->end()
93
                                        ->scalarNode('quality')->defaultValue(80)->end()
94
                                        ->scalarNode('format')->defaultValue('jpg')->end()
95
                                        ->scalarNode('constraint')->defaultValue(true)->end()
96
                                    ->end()
97
                                ->end()
98
                            ->end()
99
                        ->end()
100
                    ->end()
101
                ->end()
102
            ->end()
103
        ;
104
    }
105
106
    /**
107
     * @param ArrayNodeDefinition $node
108
     */
109
    private function addCdnSection(ArrayNodeDefinition $node)
110
    {
111
        $node
112
            ->children()
113
                ->arrayNode('cdn')
114
                    ->children()
115
                        ->arrayNode('server')
116
                            ->addDefaultsIfNotSet()
117
                            ->children()
118
                                ->scalarNode('path')->defaultValue('/uploads/media')->end()
119
                            ->end()
120
                        ->end()
121
122
                        ->arrayNode('panther')
123
                            ->children()
124
                                ->scalarNode('path')
125
                                    ->info('e.g. http://domain.pantherportal.com/uploads/media')
126
                                    ->isRequired()
127
                                ->end()
128
                                ->scalarNode('site_id')->isRequired()->end()
129
                                ->scalarNode('password')->isRequired()->end()
130
                                ->scalarNode('username')->isRequired()->end()
131
                            ->end()
132
                        ->end()
133
134
                        ->arrayNode('cloudfront')
135
                            ->children()
136
                                ->scalarNode('path')
137
                                    ->info('e.g. http://xxxxxxxxxxxxxx.cloudfront.net/uploads/media')
138
                                    ->isRequired()
139
                                ->end()
140
                                ->scalarNode('distribution_id')->isRequired()->end()
141
                                ->scalarNode('key')->isRequired()->end()
142
                                ->scalarNode('secret')->isRequired()->end()
143
                            ->end()
144
                        ->end()
145
146
                        ->arrayNode('fallback')
147
                            ->children()
148
                                ->scalarNode('master')->isRequired()->end()
149
                                ->scalarNode('fallback')->isRequired()->end()
150
                            ->end()
151
                        ->end()
152
                    ->end()
153
                ->end()
154
            ->end()
155
        ;
156
    }
157
158
    /**
159
     * @param ArrayNodeDefinition $node
160
     */
161
    private function addFilesystemSection(ArrayNodeDefinition $node)
162
    {
163
        $node
164
            ->children()
165
                ->arrayNode('filesystem')
166
                    ->children()
167
                        ->arrayNode('local')
168
                            ->addDefaultsIfNotSet()
169
                            ->children()
170
                                ->scalarNode('directory')->defaultValue('%kernel.root_dir%/../web/uploads/media')->end()
171
                                ->scalarNode('create')->defaultValue(false)->end()
172
                            ->end()
173
                        ->end()
174
175
                        ->arrayNode('ftp')
176
                            ->children()
177
                                ->scalarNode('directory')->isRequired()->end()
178
                                ->scalarNode('host')->isRequired()->end()
179
                                ->scalarNode('username')->isRequired()->end()
180
                                ->scalarNode('password')->isRequired()->end()
181
                                ->scalarNode('port')->defaultValue(21)->end()
182
                                ->scalarNode('passive')->defaultValue(false)->end()
183
                                ->scalarNode('create')->defaultValue(false)->end()
184
                                ->scalarNode('mode')->defaultValue(defined('FTP_BINARY') ? FTP_BINARY : false)->end()
185
                            ->end()
186
                        ->end()
187
188
                        ->arrayNode('s3')
189
                            ->children()
190
                                ->scalarNode('directory')->defaultValue('')->end()
191
                                ->scalarNode('bucket')->isRequired()->end()
192
                                ->scalarNode('accessKey')->isRequired()->end()
193
                                ->scalarNode('secretKey')->isRequired()->end()
194
                                ->scalarNode('create')->defaultValue(false)->end()
195
                                ->scalarNode('storage')
196
                                    ->defaultValue('standard')
197
                                    ->validate()
198
                                    ->ifNotInArray(array('standard', 'reduced'))
199
                                        ->thenInvalid('Invalid storage type - "%s"')
200
                                    ->end()
201
                                ->end()
202
                                ->scalarNode('cache_control')->defaultValue('')->end()
203
                                ->scalarNode('acl')
204
                                    ->defaultValue('public')
205
                                    ->validate()
206
                                    ->ifNotInArray(array('private', 'public', 'open', 'auth_read', 'owner_read', 'owner_full_control'))
207
                                        ->thenInvalid('Invalid acl permission - "%s"')
208
                                    ->end()
209
                                ->end()
210
                                ->scalarNode('encryption')
211
                                    ->defaultValue('')
212
                                    ->validate()
213
                                    ->ifNotInArray(array('aes256'))
214
                                        ->thenInvalid('Invalid encryption type - "%s"')
215
                                    ->end()
216
                                ->end()
217
                                ->scalarNode('region')->defaultValue('s3.amazonaws.com')->end()
218
                                ->arrayNode('meta')
219
                                    ->useAttributeAsKey('name')
220
                                    ->prototype('scalar')
221
                                    ->end()
222
                                ->end()
223
                            ->end()
224
                        ->end()
225
226
                        ->arrayNode('mogilefs')
227
                            ->children()
228
                                ->scalarNode('domain')->isRequired()->end()
229
                                ->arrayNode('hosts')
230
                                    ->prototype('scalar')->end()
231
                                    ->isRequired()
232
                                ->end()
233
                            ->end()
234
                        ->end()
235
236
                        ->arrayNode('replicate')
237
                            ->children()
238
                                ->scalarNode('master')->isRequired()->end()
239
                                ->scalarNode('slave')->isRequired()->end()
240
                            ->end()
241
                        ->end()
242
                        ->arrayNode('openstack')
243
                            ->children()
244
                                ->scalarNode('url')->isRequired()->end()
245
                                ->arrayNode('secret')
246
                                    ->children()
247
                                        ->scalarNode('username')->isRequired()->end()
248
                                        ->scalarNode('password')->isRequired()->end()
249
                                    ->end()
250
                                ->end()
251
                                ->scalarNode('region')->end()
252
                                ->scalarNode('containerName')->defaultValue('media')->end()
253
                                ->scalarNode('create_container')->defaultValue(false)->end()
254
                            ->end()
255
                        ->end()
256
                        ->arrayNode('rackspace')
257
                            ->children()
258
                                ->scalarNode('url')->isRequired()->end()
259
                                    ->arrayNode('secret')
260
                                        ->children()
261
                                            ->scalarNode('username')->isRequired()->end()
262
                                            ->scalarNode('apiKey')->isRequired()->end()
263
                                        ->end()
264
                                    ->end()
265
                                    ->scalarNode('region')->isRequired()->end()
266
                                    ->scalarNode('containerName')->defaultValue('media')->end()
267
                                    ->scalarNode('create_container')->defaultValue(false)->end()
268
                                ->end()
269
                            ->end()
270
                        ->end()
271
                    ->end()
272
                ->end()
273
            ->end()
274
        ;
275
    }
276
277
    /**
278
     * @param ArrayNodeDefinition $node
279
     */
280
    private function addProvidersSection(ArrayNodeDefinition $node)
281
    {
282
        $node
283
            ->children()
284
                ->arrayNode('providers')
285
                    ->addDefaultsIfNotSet()
286
                    ->children()
287
                        ->arrayNode('file')
288
                            ->addDefaultsIfNotSet()
289
                            ->children()
290
                                ->scalarNode('service')->defaultValue('sonata.media.provider.file')->end()
291
                                ->scalarNode('resizer')->defaultValue(false)->end()
292
                                ->scalarNode('filesystem')->defaultValue('sonata.media.filesystem.local')->end()
293
                                ->scalarNode('cdn')->defaultValue('sonata.media.cdn.server')->end()
294
                                ->scalarNode('generator')->defaultValue('sonata.media.generator.default')->end()
295
                                ->scalarNode('thumbnail')->defaultValue('sonata.media.thumbnail.format')->end()
296
                                ->arrayNode('allowed_extensions')
297
                                    ->prototype('scalar')->end()
298
                                    ->defaultValue(array(
299
                                        'pdf', 'txt', 'rtf',
300
                                        'doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx',
301
                                        'odt', 'odg', 'odp', 'ods', 'odc', 'odf', 'odb',
302
                                        'csv',
303
                                        'xml',
304
                                    ))
305
                                ->end()
306
                                ->arrayNode('allowed_mime_types')
307
                                    ->prototype('scalar')->end()
308
                                    ->defaultValue(array(
309
                                        'application/pdf', 'application/x-pdf', 'application/rtf', 'text/html', 'text/rtf', 'text/plain',
310
                                        'application/excel', 'application/msword', 'application/vnd.ms-excel', 'application/vnd.ms-powerpoint',
311
                                        'application/vnd.ms-powerpoint', 'application/vnd.oasis.opendocument.text', 'application/vnd.oasis.opendocument.graphics', 'application/vnd.oasis.opendocument.presentation', 'application/vnd.oasis.opendocument.spreadsheet', 'application/vnd.oasis.opendocument.chart', 'application/vnd.oasis.opendocument.formula', 'application/vnd.oasis.opendocument.database', 'application/vnd.oasis.opendocument.image',
312
                                        'text/comma-separated-values',
313
                                        'text/xml', 'application/xml',
314
                                        'application/zip', // seems to be used for xlsx document ...
315
                                    ))
316
                                ->end()
317
                            ->end()
318
                        ->end()
319
320
                        ->arrayNode('image')
321
                            ->addDefaultsIfNotSet()
322
                            ->children()
323
                                ->scalarNode('service')->defaultValue('sonata.media.provider.image')->end()
324
                                ->scalarNode('resizer')->defaultValue('sonata.media.resizer.simple')->end()
325
                                ->scalarNode('filesystem')->defaultValue('sonata.media.filesystem.local')->end()
326
                                ->scalarNode('cdn')->defaultValue('sonata.media.cdn.server')->end()
327
                                ->scalarNode('generator')->defaultValue('sonata.media.generator.default')->end()
328
                                ->scalarNode('thumbnail')->defaultValue('sonata.media.thumbnail.format')->end()
329
                                ->scalarNode('adapter')->defaultValue('sonata.media.adapter.image.gd')->end()
330
                                ->arrayNode('allowed_extensions')
331
                                    ->prototype('scalar')->end()
332
                                    ->defaultValue(array('jpg', 'png', 'jpeg'))
333
                                ->end()
334
                                ->arrayNode('allowed_mime_types')
335
                                    ->prototype('scalar')->end()
336
                                    ->defaultValue(array(
337
                                        'image/pjpeg',
338
                                        'image/jpeg',
339
                                        'image/png',
340
                                        'image/x-png',
341
                                    ))
342
                                ->end()
343
                            ->end()
344
                        ->end()
345
346
                        ->arrayNode('youtube')
347
                            ->addDefaultsIfNotSet()
348
                            ->children()
349
                                ->scalarNode('service')->defaultValue('sonata.media.provider.youtube')->end()
350
                                ->scalarNode('resizer')->defaultValue('sonata.media.resizer.simple')->end()
351
                                ->scalarNode('filesystem')->defaultValue('sonata.media.filesystem.local')->end()
352
                                ->scalarNode('cdn')->defaultValue('sonata.media.cdn.server')->end()
353
                                ->scalarNode('generator')->defaultValue('sonata.media.generator.default')->end()
354
                                ->scalarNode('thumbnail')->defaultValue('sonata.media.thumbnail.format')->end()
355
                                ->scalarNode('html5')->defaultValue(false)->end()
356
                            ->end()
357
                        ->end()
358
359
                        ->arrayNode('dailymotion')
360
                            ->addDefaultsIfNotSet()
361
                            ->children()
362
                                ->scalarNode('service')->defaultValue('sonata.media.provider.dailymotion')->end()
363
                                ->scalarNode('resizer')->defaultValue('sonata.media.resizer.simple')->end()
364
                                ->scalarNode('filesystem')->defaultValue('sonata.media.filesystem.local')->end()
365
                                ->scalarNode('cdn')->defaultValue('sonata.media.cdn.server')->end()
366
                                ->scalarNode('generator')->defaultValue('sonata.media.generator.default')->end()
367
                                ->scalarNode('thumbnail')->defaultValue('sonata.media.thumbnail.format')->end()
368
                            ->end()
369
                        ->end()
370
371
                        ->arrayNode('vimeo')
372
                            ->addDefaultsIfNotSet()
373
                            ->children()
374
                                ->scalarNode('service')->defaultValue('sonata.media.provider.vimeo')->end()
375
                                ->scalarNode('resizer')->defaultValue('sonata.media.resizer.simple')->end()
376
                                ->scalarNode('filesystem')->defaultValue('sonata.media.filesystem.local')->end()
377
                                ->scalarNode('cdn')->defaultValue('sonata.media.cdn.server')->end()
378
                                ->scalarNode('generator')->defaultValue('sonata.media.generator.default')->end()
379
                                ->scalarNode('thumbnail')->defaultValue('sonata.media.thumbnail.format')->end()
380
                            ->end()
381
                        ->end()
382
                    ->end()
383
                ->end()
384
            ->end()
385
        ;
386
    }
387
388
    /**
389
     * @param ArrayNodeDefinition $node
390
     */
391
    private function addExtraSection(ArrayNodeDefinition $node)
392
    {
393
        $node
394
            ->children()
395
                ->arrayNode('pixlr')
396
                    ->info('More info at https://pixlr.com/')
397
                    ->addDefaultsIfNotSet()
398
                    ->children()
399
                        ->scalarNode('enabled')->defaultValue(false)->end()
400
                        ->scalarNode('secret')->defaultValue(sha1(uniqid(rand(1, 9999), true)))->end()
401
                        ->scalarNode('referrer')->defaultValue('Sonata Media')->end()
402
                    ->end()
403
                ->end()
404
            ->end()
405
        ;
406
    }
407
408
    /**
409
     * @param ArrayNodeDefinition $node
410
     */
411
    private function addModelSection(ArrayNodeDefinition $node)
412
    {
413
        $node
414
            ->children()
415
                ->arrayNode('class')
416
                    ->addDefaultsIfNotSet()
417
                    ->children()
418
                        ->scalarNode('media')->defaultValue('Application\\Sonata\\MediaBundle\\Entity\\Media')->end()
419
                        ->scalarNode('gallery')->defaultValue('Application\\Sonata\\MediaBundle\\Entity\\Gallery')->end()
420
                        ->scalarNode('gallery_has_media')->defaultValue('Application\\Sonata\\MediaBundle\\Entity\\GalleryHasMedia')->end()
421
                        ->scalarNode('category')->defaultValue('Application\\Sonata\\ClassificationBundle\\Entity\\Category')->end()
422
                    ->end()
423
                ->end()
424
            ->end()
425
        ;
426
    }
427
428
    /**
429
     * @param ArrayNodeDefinition $node
430
     */
431
    private function addBuzzSection(ArrayNodeDefinition $node)
432
    {
433
        $node
434
            ->children()
435
                ->arrayNode('buzz')
436
                    ->addDefaultsIfNotSet()
437
                    ->children()
438
                        ->scalarNode('connector')->defaultValue('sonata.media.buzz.connector.curl')->end()
439
                        ->arrayNode('client')
440
                        ->addDefaultsIfNotSet()
441
                        ->children()
442
                            ->booleanNode('ignore_errors')->defaultValue(true)->end()
443
                            ->scalarNode('max_redirects')->defaultValue(5)->end()
444
                            ->scalarNode('timeout')->defaultValue(5)->end()
445
                            ->booleanNode('verify_peer')->defaultValue(true)->end()
446
                            ->scalarNode('proxy')->defaultNull()->end()
447
                        ->end()
448
                    ->end()
449
                ->end()
450
            ->end()
451
        ;
452
    }
453
454
    /**
455
     * @param ArrayNodeDefinition $node
456
     */
457
    private function addResizerSection(ArrayNodeDefinition $node)
458
    {
459
        $node
460
            ->children()
461
                ->arrayNode('resizer')
462
                    ->addDefaultsIfNotSet()
463
                    ->children()
464
                        ->arrayNode('simple')
465
                            ->addDefaultsIfNotSet()
466
                            ->children()
467
                                ->scalarNode('mode')->defaultValue('inset')->end()
468
                            ->end()
469
                        ->end()
470
                        ->arrayNode('square')
471
                            ->addDefaultsIfNotSet()
472
                            ->children()
473
                                ->scalarNode('mode')->defaultValue('inset')->end()
474
                            ->end()
475
                        ->end()
476
                    ->end()
477
                ->end()
478
            ->end()
479
        ;
480
    }
481
}
482