Completed
Pull Request — develop (#211)
by Wachter
15:13
created

SuluArticleExtension::load()   B

Complexity

Conditions 3
Paths 4

Size

Total Lines 41
Code Lines 27

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 17
CRAP Score 3.0015

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 0
loc 41
rs 8.8571
ccs 17
cts 18
cp 0.9444
cc 3
eloc 27
nc 4
nop 2
crap 3.0015
1
<?php
2
3
/*
4
 * This file is part of Sulu.
5
 *
6
 * (c) MASSIVE ART WebServices GmbH
7
 *
8
 * This source file is subject to the MIT license that is bundled
9
 * with this source code in the file LICENSE.
10
 */
11
12
namespace Sulu\Bundle\ArticleBundle\DependencyInjection;
13
14
use Sulu\Bundle\ArticleBundle\Document\ArticleDocument;
15
use Sulu\Bundle\ArticleBundle\Document\ArticlePageDocument;
16
use Sulu\Bundle\ArticleBundle\Document\Structure\ArticleBridge;
17
use Sulu\Bundle\ArticleBundle\Document\Structure\ArticlePageBridge;
18
use Sulu\Bundle\ArticleBundle\Exception\ArticlePageNotFoundException;
19
use Sulu\Bundle\ArticleBundle\Exception\ParameterNotAllowedException;
20
use Symfony\Component\Config\FileLocator;
21
use Symfony\Component\DependencyInjection\ContainerBuilder;
22
use Symfony\Component\DependencyInjection\Extension\PrependExtensionInterface;
23
use Symfony\Component\DependencyInjection\Loader;
24
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
25
26
/**
27
 * This is the class that loads and manages article bundle configuration.
28
 */
29
class SuluArticleExtension extends Extension implements PrependExtensionInterface
30
{
31
    /**
32
     * {@inheritdoc}
33
     */
34 1
    public function prepend(ContainerBuilder $container)
35
    {
36 1
        if ($container->hasExtension('sulu_core')) {
37 1
            $container->prependExtensionConfig(
38 1
                'sulu_core',
39
                [
40 1
                    'content' => [
41
                        'structure' => [
42
                            'type_map' => [
43
                                'article' => ArticleBridge::class,
44
                                'article_page' => ArticlePageBridge::class,
45
                            ],
46
                        ],
47
                    ],
48
                ]
49
            );
50
        }
51
52 1
        if ($container->hasExtension('jms_serializer')) {
53 1
            $container->prependExtensionConfig(
54 1
                'jms_serializer',
55
                [
56 1
                    'metadata' => [
57
                        'directories' => [
58
                            [
59
                                'path' => __DIR__ . '/../Resources/config/serializer',
60
                                'namespace_prefix' => 'Sulu\Bundle\ArticleBundle',
61
                            ],
62
                        ],
63
                    ],
64
                ]
65
            );
66
        }
67
68 1
        if ($container->hasExtension('sulu_search')) {
69 1
            $container->prependExtensionConfig(
70 1
                'sulu_content',
71
                [
72 1
                    'search' => [
73
                        'mapping' => [
74
                            ArticleDocument::class => ['index' => 'article'],
75
                            ArticlePageDocument::class => ['index' => 'article_page'],
76
                        ],
77
                    ],
78
                ]
79
            );
80
        }
81
82 1
        if ($container->hasExtension('sulu_document_manager')) {
83 1
            $container->prependExtensionConfig(
84 1
                'sulu_document_manager',
85
                [
86 1
                    'mapping' => [
87
                        'article' => ['class' => ArticleDocument::class, 'phpcr_type' => 'sulu:article'],
88
                        'article_page' => ['class' => ArticlePageDocument::class, 'phpcr_type' => 'sulu:articlepage'],
89
                    ],
90
                    'path_segments' => [
91
                        'articles' => 'articles',
92
                    ],
93
                ]
94
            );
95
        }
96
97 1
        if ($container->hasExtension('sulu_route')) {
98 1
            $container->prependExtensionConfig(
99 1
                'sulu_route',
100
                [
101 1
                    'mappings' => [
102
                        ArticlePageDocument::class => [
103
                            'generator' => 'article_page',
104
                            'options' => [
105
                                'route_schema' => '/{translator.trans("page")}-{object.getPageNumber()}',
106
                                'parent' => '{object.getParent().getRoutePath()}',
107
                            ],
108
                        ],
109
                    ],
110
                ]
111
            );
112
        }
113
114 1
        if ($container->hasExtension('fos_rest')) {
115 1
            $container->prependExtensionConfig(
116 1
                'fos_rest',
117
                [
118 1
                    'exception' => [
119
                        'codes' => [
120
                            ParameterNotAllowedException::class => 400,
121
                            ArticlePageNotFoundException::class => 404,
122
                        ],
123
                    ],
124
                ]
125
            );
126
        }
127 1
128
        if ($container->hasExtension('massive_build')) {
129
            $container->prependExtensionConfig(
130
                'massive_build',
131
                [
132 1
                    'targets' => [
133
                        'prod' => [
134 1
                            'dependencies' => [
135 1
                                'article_index' => [],
136 1
                            ],
137 1
                        ],
138 1
                        'dev' => [
139 1
                            'dependencies' => [
140 1
                                'article_index' => [],
141 1
                            ],
142
                        ],
143 1
                        'maintain' => [
144 1
                            'dependencies' => [
145 1
                                'article_index' => [],
146
                            ],
147
                        ],
148 1
                    ],
149 1
                ]
150 1
            );
151
        }
152
    }
153 1
154 1
    /**
155
     * {@inheritdoc}
156 1
     */
157 1
    public function load(array $configs, ContainerBuilder $container)
158
    {
159
        $configuration = new Configuration();
160
        $config = $this->processConfiguration($configuration, $configs);
161 1
        $container->setParameter('sulu_article.types', $config['types']);
162 1
        $container->setParameter('sulu_article.documents', $config['documents']);
163 1
        $container->setParameter('sulu_article.view_document.article.class', $config['documents']['article']['view']);
164
        $container->setParameter('sulu_article.display_tab_all', $config['display_tab_all']);
165
        $container->setParameter('sulu_article.smart_content.default_limit', $config['smart_content']['default_limit']);
166 1
        $container->setParameter('sulu_article.search_fields', $config['search_fields']);
167 1
168
        $container->setParameter(
169
            'sulu_article.content-type.article.template',
170 1
            $config['content_types']['article']['template']
171 1
        );
172 1
173
        $container->setParameter(
174
            'sulu_article.content-type.page_tree_route.template',
175
            $config['content_types']['page_tree_route']['template']
176
        );
177
178
        $loader = new Loader\XmlFileLoader($container, new FileLocator(__DIR__ . '/../Resources/config'));
179
        $loader->load('services.xml');
180 1
181
        $bundles = $container->getParameter('kernel.bundles');
182 1
        if (array_key_exists('SuluAutomationBundle', $bundles)) {
183 1
            $loader->load('automation.xml');
184 1
        }
185 1
186
        $container->setAlias(
187
            'sulu_article.page_tree_route.updater',
188
            'sulu_article.page_tree_route.updater.' . $config['content_types']['page_tree_route']['page_route_cascade']
189 1
        );
190 1
191 1
        if ($config['content_types']['page_tree_route']['page_route_cascade'] !== 'off') {
192
            $loader->load('page_tree_update.xml');
193
        }
194
195
        $this->appendDefaultAuthor($config, $container);
196
        $this->appendArticlePageConfig($container);
197
    }
198 1
199
    /**
200 1
     * Append configuration for article "set_default_author".
201 1
     *
202 1
     * @param array $config
203
     * @param ContainerBuilder $container
204 1
     */
205 1
    private function appendDefaultAuthor(array $config, ContainerBuilder $container)
206 1
    {
207 1
        $mapping = $container->getParameter('sulu_document_manager.mapping');
208
        foreach ($mapping as $key => $item) {
209
            if ($item['alias'] === 'article') {
210
                $mapping[$key]['set_default_author'] = $config['default_author'];
211
            }
212
        }
213
214
        $container->setParameter('sulu_document_manager.mapping', $mapping);
215
        $container->setParameter('sulu_article.default_author', $config['default_author']);
216
    }
217 1
218
    /**
219 1
     * Append configuration for article-page (cloned from article).
220 1
     *
221 1
     * @param ContainerBuilder $container
222
     */
223
    private function appendArticlePageConfig(ContainerBuilder $container)
224 1
    {
225
        $paths = $container->getParameter('sulu.content.structure.paths');
226
        $paths['article_page'] = $this->cloneArticleConfig($paths['article'], 'article_page');
227
        $container->setParameter('sulu.content.structure.paths', $paths);
228
229
        $defaultTypes = $container->getParameter('sulu.content.structure.default_types');
230
        $defaultTypes['article_page'] = $defaultTypes['article'];
231
        $container->setParameter('sulu.content.structure.default_types', $defaultTypes);
232
    }
233
234
    /**
235
     * Clone given path configuration and use given type.
236
     *
237
     * @param array $config
238
     * @param string $type
239
     *
240
     * @return array
241
     */
242
    private function cloneArticleConfig(array $config, $type)
243
    {
244
        $result = [];
245
        foreach ($config as $item) {
246
            $result[] = ['path' => $item['path'], 'type' => $type];
247
        }
248
249
        return $result;
250
    }
251
}
252