Completed
Pull Request — master (#406)
by
unknown
03:31
created

Configuration::addExtraSection()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 16
Code Lines 13

Duplication

Lines 0
Ratio 0 %

Importance

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