Completed
Push — master ( 45360d...c662b4 )
by Grégoire
16s queued 11s
created

SonataAdminExtension::buildStylesheets()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 8

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 8
rs 10
c 0
b 0
f 0
cc 1
nc 1
nop 1
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\AdminBundle\DependencyInjection;
15
16
use Symfony\Component\Config\FileLocator;
17
use Symfony\Component\DependencyInjection\ContainerBuilder;
18
use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
19
use Symfony\Component\DependencyInjection\Reference;
20
use Symfony\Component\Form\Extension\Core\Type\ChoiceType as SymfonyChoiceType;
21
use Symfony\Component\Form\Extension\Core\Type\DateTimeType as SymfonyDateTimeType;
22
use Symfony\Component\Form\Extension\Core\Type\DateType as SymfonyDateType;
23
use Symfony\Component\Form\Extension\Core\Type\EmailType as SymfonyEmailType;
24
use Symfony\Component\Form\Extension\Core\Type\IntegerType as SymfonyIntegerType;
25
use Symfony\Component\Form\Extension\Core\Type\TextareaType as SymfonyTextareaType;
26
use Symfony\Component\Form\Extension\Core\Type\TextType as SymfonyTextType;
27
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
28
29
/**
30
 * @final since sonata-project/admin-bundle 3.52
31
 *
32
 * @author Thomas Rabaix <[email protected]>
33
 * @author Michael Williams <[email protected]>
34
 */
35
final class SonataAdminExtension extends Extension
36
{
37
    public function load(array $configs, ContainerBuilder $container): void
38
    {
39
        $bundles = $container->getParameter('kernel.bundles');
40
41
        if (isset($bundles['SonataUserBundle'])) {
42
            // integrate the SonataUserBundle / FOSUserBundle if the bundle exists
43
            array_unshift($configs, [
44
                'templates' => [
45
                    'user_block' => '@SonataUser/Admin/Core/user_block.html.twig',
46
                ],
47
            ]);
48
        }
49
50
        if (isset($bundles['SonataIntlBundle'])) {
51
            // integrate the SonataUserBundle if the bundle exists
52
            array_unshift($configs, [
53
                'templates' => [
54
                    'history_revision_timestamp' => '@SonataIntl/CRUD/history_revision_timestamp.html.twig',
55
                ],
56
            ]);
57
        }
58
59
        $loader = new XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
60
        $loader->load('twig.xml');
61
        $loader->load('core.xml');
62
        $loader->load('form_types.xml');
63
        $loader->load('validator.xml');
64
        $loader->load('route.xml');
65
        $loader->load('block.xml');
66
        $loader->load('menu.xml');
67
        $loader->load('commands.xml');
68
        $loader->load('actions.xml');
69
70
        if (isset($bundles['MakerBundle'])) {
71
            $loader->load('makers.xml');
72
        }
73
74
        if (isset($bundles['SonataExporterBundle'])) {
75
            $loader->load('exporter.xml');
76
        }
77
78
        $configuration = $this->getConfiguration($configs, $container);
79
        $config = $this->processConfiguration($configuration, $configs);
0 ignored issues
show
Documentation introduced by
$configuration is of type null|object, but the function expects a object<Symfony\Component...ConfigurationInterface>.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
80
81
        $config['options']['javascripts'] = $this->buildJavascripts($config);
82
        $config['options']['stylesheets'] = $this->buildStylesheets($config);
83
        $config['options']['role_admin'] = $config['security']['role_admin'];
84
        $config['options']['role_super_admin'] = $config['security']['role_super_admin'];
85
        $config['options']['search'] = $config['search'];
86
87
        $pool = $container->getDefinition('sonata.admin.pool');
88
        $pool->replaceArgument(1, $config['title']);
89
        $pool->replaceArgument(2, $config['title_logo']);
90
        $pool->replaceArgument(3, $config['options']);
91
92
        if (false === $config['options']['lock_protection']) {
93
            $container->removeDefinition('sonata.admin.lock.extension');
94
        }
95
96
        $container->setParameter('sonata.admin.configuration.global_search.empty_boxes', $config['global_search']['empty_boxes']);
97
        $container->setParameter('sonata.admin.configuration.global_search.case_sensitive', $config['global_search']['case_sensitive']);
98
        $container->setParameter('sonata.admin.configuration.templates', $config['templates'] + [
99
            'user_block' => '@SonataAdmin/Core/user_block.html.twig',
100
            'add_block' => '@SonataAdmin/Core/add_block.html.twig',
101
            'layout' => '@SonataAdmin/standard_layout.html.twig',
102
            'ajax' => '@SonataAdmin/ajax_layout.html.twig',
103
            'dashboard' => '@SonataAdmin/Core/dashboard.html.twig',
104
            'list' => '@SonataAdmin/CRUD/list.html.twig',
105
            'filter' => '@SonataAdmin/Form/filter_admin_fields.html.twig',
106
            'show' => '@SonataAdmin/CRUD/show.html.twig',
107
            'show_compare' => '@SonataAdmin/CRUD/show_compare.html.twig',
108
            'edit' => '@SonataAdmin/CRUD/edit.html.twig',
109
            'history' => '@SonataAdmin/CRUD/history.html.twig',
110
            'history_revision_timestamp' => '@SonataAdmin/CRUD/history_revision_timestamp.html.twig',
111
            'acl' => '@SonataAdmin/CRUD/acl.html.twig',
112
            'action' => '@SonataAdmin/CRUD/action.html.twig',
113
            'short_object_description' => '@SonataAdmin/Helper/short-object-description.html.twig',
114
            'preview' => '@SonataAdmin/CRUD/preview.html.twig',
115
            'list_block' => '@SonataAdmin/Block/block_admin_list.html.twig',
116
            'delete' => '@SonataAdmin/CRUD/delete.html.twig',
117
            'batch' => '@SonataAdmin/CRUD/list__batch.html.twig',
118
            'select' => '@SonataAdmin/CRUD/list__select.html.twig',
119
            'batch_confirmation' => '@SonataAdmin/CRUD/batch_confirmation.html.twig',
120
            'inner_list_row' => '@SonataAdmin/CRUD/list_inner_row.html.twig',
121
            'base_list_field' => '@SonataAdmin/CRUD/base_list_field.html.twig',
122
            'pager_links' => '@SonataAdmin/Pager/links.html.twig',
123
            'pager_results' => '@SonataAdmin/Pager/results.html.twig',
124
            'tab_menu_template' => '@SonataAdmin/Core/tab_menu_template.html.twig',
125
            'knp_menu_template' => '@SonataAdmin/Menu/sonata_menu.html.twig',
126
            'outer_list_rows_mosaic' => '@SonataAdmin/CRUD/list_outer_rows_mosaic.html.twig',
127
            'outer_list_rows_list' => '@SonataAdmin/CRUD/list_outer_rows_list.html.twig',
128
            'outer_list_rows_tree' => '@SonataAdmin/CRUD/list_outer_rows_tree.html.twig',
129
        ]);
130
        $container->setParameter('sonata.admin.configuration.admin_services', $config['admin_services']);
131
        $container->setParameter('sonata.admin.configuration.dashboard_groups', $config['dashboard']['groups']);
132
        $container->setParameter('sonata.admin.configuration.dashboard_blocks', $config['dashboard']['blocks']);
133
        $container->setParameter('sonata.admin.configuration.sort_admins', $config['options']['sort_admins']);
134
        $container->setParameter(
135
            'sonata.admin.configuration.mosaic_background',
136
            $config['options']['mosaic_background']
137
        );
138
        $container->setParameter('sonata.admin.configuration.default_group', $config['options']['default_group']);
139
        $container->setParameter('sonata.admin.configuration.default_label_catalogue', $config['options']['default_label_catalogue']);
140
        $container->setParameter('sonata.admin.configuration.default_icon', $config['options']['default_icon']);
141
        $container->setParameter('sonata.admin.configuration.breadcrumbs', $config['breadcrumbs']);
142
143
        if (null === $config['security']['acl_user_manager'] && isset($bundles['FOSUserBundle'])) {
144
            $container->setParameter('sonata.admin.security.acl_user_manager', 'fos_user.user_manager');
145
        } else {
146
            $container->setParameter('sonata.admin.security.acl_user_manager', $config['security']['acl_user_manager']);
147
        }
148
149
        $container->setAlias('sonata.admin.security.handler', $config['security']['handler']);
150
151
        switch ($config['security']['handler']) {
152
            case 'sonata.admin.security.handler.role':
153
                if (0 === \count($config['security']['information'])) {
154
                    $config['security']['information'] = [
155
                        'EDIT' => ['EDIT'],
156
                        'LIST' => ['LIST'],
157
                        'CREATE' => ['CREATE'],
158
                        'VIEW' => ['VIEW'],
159
                        'DELETE' => ['DELETE'],
160
                        'EXPORT' => ['EXPORT'],
161
                        'ALL' => ['ALL'],
162
                    ];
163
                }
164
165
                break;
166
            case 'sonata.admin.security.handler.acl':
167
                if (0 === \count($config['security']['information'])) {
168
                    $config['security']['information'] = [
169
                        'GUEST' => ['VIEW', 'LIST'],
170
                        'STAFF' => ['EDIT', 'LIST', 'CREATE'],
171
                        'EDITOR' => ['OPERATOR', 'EXPORT'],
172
                        'ADMIN' => ['MASTER'],
173
                    ];
174
                }
175
176
                break;
177
        }
178
179
        $container->setParameter('sonata.admin.configuration.security.role_admin', $config['security']['role_admin']);
180
        $container->setParameter('sonata.admin.configuration.security.role_super_admin', $config['security']['role_super_admin']);
181
        $container->setParameter('sonata.admin.configuration.security.information', $config['security']['information']);
182
        $container->setParameter('sonata.admin.configuration.security.admin_permissions', $config['security']['admin_permissions']);
183
        $container->setParameter('sonata.admin.configuration.security.object_permissions', $config['security']['object_permissions']);
184
185
        $loader->load('security.xml');
186
187
        $container->setParameter('sonata.admin.extension.map', $config['extensions']);
188
189
        /*
190
         * This is a work in progress, so for now it is hardcoded
191
         */
192
        $classes = [
193
            SymfonyChoiceType::class => '',
194
            SymfonyDateType::class => 'sonata-medium-date',
195
            SymfonyDateTimeType::class => 'sonata-medium-date',
196
            SymfonyEmailType::class => '',
197
            SymfonyIntegerType::class => '',
198
            SymfonyTextareaType::class => '',
199
            SymfonyTextType::class => '',
200
        ];
201
202
        $container->getDefinition('sonata.admin.form.extension.field')
203
            ->replaceArgument(0, $classes)
204
            ->replaceArgument(1, $config['options']);
205
206
        // remove non used service
207
        if (!isset($bundles['JMSTranslationBundle'])) {
208
            $container->removeDefinition('sonata.admin.translator.extractor.jms_translator_bundle');
209
        }
210
211
        //remove non-Mopa compatibility layer
212
        if (isset($bundles['MopaBootstrapBundle'])) {
213
            $container->removeDefinition('sonata.admin.form.extension.field.mopa');
214
        }
215
216
        // set filter persistence
217
        $container->setParameter('sonata.admin.configuration.filters.persist', $config['persist_filters']);
218
        $container->setParameter('sonata.admin.configuration.filters.persister', $config['filter_persister']);
219
220
        $container->setParameter('sonata.admin.configuration.show.mosaic.button', $config['show_mosaic_button']);
221
222
        $container->setParameter('sonata.admin.configuration.translate_group_label', $config['translate_group_label']);
223
224
        $this->replacePropertyAccessor($container);
225
    }
226
227
    /**
228
     * NEXT_MAJOR: remove this property.
229
     *
230
     * @deprecated since sonata-project/admin-bundle 3.56
231
     */
232
    public function configureClassesToCompile(): void
233
    {
234
    }
235
236
    public function getNamespace()
237
    {
238
        return 'https://sonata-project.org/schema/dic/admin';
239
    }
240
241
    private function buildStylesheets(array $config): array
242
    {
243
        return $this->mergeArray(
244
            $config['assets']['stylesheets'],
245
            $config['assets']['extra_stylesheets'],
246
            $config['assets']['remove_stylesheets']
247
        );
248
    }
249
250
    private function buildJavascripts(array $config): array
251
    {
252
        return $this->mergeArray(
253
            $config['assets']['javascripts'],
254
            $config['assets']['extra_javascripts'],
255
            $config['assets']['remove_javascripts']
256
        );
257
    }
258
259
    private function mergeArray(array $array, array $addArray, array $removeArray = []): array
260
    {
261
        foreach ($addArray as $toAdd) {
262
            array_push($array, $toAdd);
263
        }
264
        foreach ($removeArray as $toRemove) {
265
            if (\in_array($toRemove, $array, true)) {
266
                array_splice($array, array_search($toRemove, $array, true), 1);
267
            }
268
        }
269
270
        return $array;
271
    }
272
273
    private function replacePropertyAccessor(ContainerBuilder $container): void
274
    {
275
        if (!$container->has('form.property_accessor')) {
276
            return;
277
        }
278
279
        $pool = $container->getDefinition('sonata.admin.pool');
280
        $pool->replaceArgument(4, new Reference('form.property_accessor'));
281
282
        $modelChoice = $container->getDefinition('sonata.admin.form.type.model_choice');
283
        $modelChoice->replaceArgument(0, new Reference('form.property_accessor'));
284
    }
285
}
286