Completed
Push — master ( cc6356...ca1999 )
by
unknown
04:54 queued 10s
created

Configuration::addBuzzSection()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 22
Code Lines 19

Duplication

Lines 0
Ratio 0 %

Importance

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