Completed
Push — master ( 2bbaee...d0c868 )
by Vincent
02:42
created

SonataAdminExtension::configureTwigTextExtension()   A

Complexity

Conditions 6
Paths 4

Size

Total Lines 17

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 17
rs 9.0777
c 0
b 0
f 0
cc 6
nc 4
nop 3
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 Sonata\AdminBundle\DependencyInjection\Compiler\ModelManagerCompilerPass;
17
use Sonata\AdminBundle\Model\ModelManagerInterface;
18
use Symfony\Component\Config\FileLocator;
19
use Symfony\Component\DependencyInjection\ContainerBuilder;
20
use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
21
use Symfony\Component\DependencyInjection\Reference;
22
use Symfony\Component\Form\Extension\Core\Type\ChoiceType as SymfonyChoiceType;
23
use Symfony\Component\Form\Extension\Core\Type\DateTimeType as SymfonyDateTimeType;
24
use Symfony\Component\Form\Extension\Core\Type\DateType as SymfonyDateType;
25
use Symfony\Component\Form\Extension\Core\Type\EmailType as SymfonyEmailType;
26
use Symfony\Component\Form\Extension\Core\Type\IntegerType as SymfonyIntegerType;
27
use Symfony\Component\Form\Extension\Core\Type\TextareaType as SymfonyTextareaType;
28
use Symfony\Component\Form\Extension\Core\Type\TextType as SymfonyTextType;
29
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
30
31
/**
32
 * @final since sonata-project/admin-bundle 3.52
33
 *
34
 * @author Thomas Rabaix <[email protected]>
35
 * @author Michael Williams <[email protected]>
36
 */
37
final class SonataAdminExtension extends Extension
38
{
39
    public function load(array $configs, ContainerBuilder $container): void
40
    {
41
        $bundles = $container->getParameter('kernel.bundles');
42
43
        if (isset($bundles['SonataUserBundle'])) {
44
            // integrate the SonataUserBundle / FOSUserBundle if the bundle exists
45
            array_unshift($configs, [
46
                'templates' => [
47
                    'user_block' => '@SonataUser/Admin/Core/user_block.html.twig',
48
                ],
49
            ]);
50
        }
51
52
        if (isset($bundles['SonataIntlBundle'])) {
53
            // integrate the SonataUserBundle if the bundle exists
54
            array_unshift($configs, [
55
                'templates' => [
56
                    'history_revision_timestamp' => '@SonataIntl/CRUD/history_revision_timestamp.html.twig',
57
                ],
58
            ]);
59
        }
60
61
        $loader = new XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
62
        $loader->load('actions.xml');
63
        $loader->load('block.xml');
64
        $loader->load('commands.xml');
65
        $loader->load('core.xml');
66
        $loader->load('event_listener.xml');
67
        $loader->load('form_types.xml');
68
        $loader->load('menu.xml');
69
        $loader->load('route.xml');
70
        $loader->load('twig.xml');
71
        $loader->load('twig_string.xml');
72
        $loader->load('validator.xml');
73
74
        if (isset($bundles['MakerBundle'])) {
75
            $loader->load('makers.xml');
76
        }
77
78
        if (isset($bundles['SonataExporterBundle'])) {
79
            $loader->load('exporter.xml');
80
        }
81
82
        $configuration = $this->getConfiguration($configs, $container);
83
        $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...
84
85
        $config['options']['javascripts'] = $this->buildJavascripts($config);
86
        $config['options']['stylesheets'] = $this->buildStylesheets($config);
87
        $config['options']['role_admin'] = $config['security']['role_admin'];
88
        $config['options']['role_super_admin'] = $config['security']['role_super_admin'];
89
        $config['options']['search'] = $config['search'];
90
91
        $pool = $container->getDefinition('sonata.admin.pool');
92
        $pool->replaceArgument(1, $config['title']);
93
        $pool->replaceArgument(2, $config['title_logo']);
94
        $pool->replaceArgument(3, $config['options']);
95
96
        if (false === $config['options']['lock_protection']) {
97
            $container->removeDefinition('sonata.admin.lock.extension');
98
        }
99
100
        $container->setParameter('sonata.admin.configuration.global_search.empty_boxes', $config['global_search']['empty_boxes']);
101
        $container->setParameter('sonata.admin.configuration.global_search.case_sensitive', $config['global_search']['case_sensitive']);
102
        $container->setParameter('sonata.admin.configuration.templates', $config['templates']);
103
        $container->setParameter('sonata.admin.configuration.admin_services', $config['admin_services']);
104
        $container->setParameter('sonata.admin.configuration.dashboard_groups', $config['dashboard']['groups']);
105
        $container->setParameter('sonata.admin.configuration.dashboard_blocks', $config['dashboard']['blocks']);
106
        $container->setParameter('sonata.admin.configuration.sort_admins', $config['options']['sort_admins']);
107
        $container->setParameter(
108
            'sonata.admin.configuration.mosaic_background',
109
            $config['options']['mosaic_background']
110
        );
111
        $container->setParameter('sonata.admin.configuration.default_group', $config['options']['default_group']);
112
        $container->setParameter('sonata.admin.configuration.default_label_catalogue', $config['options']['default_label_catalogue']);
113
        $container->setParameter('sonata.admin.configuration.default_icon', $config['options']['default_icon']);
114
        $container->setParameter('sonata.admin.configuration.breadcrumbs', $config['breadcrumbs']);
115
116
        if (null === $config['security']['acl_user_manager'] && isset($bundles['FOSUserBundle'])) {
117
            $container->setParameter('sonata.admin.security.acl_user_manager', 'fos_user.user_manager');
118
        } else {
119
            $container->setParameter('sonata.admin.security.acl_user_manager', $config['security']['acl_user_manager']);
120
        }
121
122
        $container->setAlias('sonata.admin.security.handler', $config['security']['handler']);
123
124
        switch ($config['security']['handler']) {
125
            case 'sonata.admin.security.handler.role':
126
                if (0 === \count($config['security']['information'])) {
127
                    $config['security']['information'] = [
128
                        'EDIT' => ['EDIT'],
129
                        'LIST' => ['LIST'],
130
                        'CREATE' => ['CREATE'],
131
                        'VIEW' => ['VIEW'],
132
                        'DELETE' => ['DELETE'],
133
                        'EXPORT' => ['EXPORT'],
134
                        'ALL' => ['ALL'],
135
                    ];
136
                }
137
138
                break;
139
            case 'sonata.admin.security.handler.acl':
140
                if (0 === \count($config['security']['information'])) {
141
                    $config['security']['information'] = [
142
                        'GUEST' => ['VIEW', 'LIST'],
143
                        'STAFF' => ['EDIT', 'LIST', 'CREATE'],
144
                        'EDITOR' => ['OPERATOR', 'EXPORT'],
145
                        'ADMIN' => ['MASTER'],
146
                    ];
147
                }
148
149
                break;
150
        }
151
152
        $container->setParameter('sonata.admin.configuration.security.role_admin', $config['security']['role_admin']);
153
        $container->setParameter('sonata.admin.configuration.security.role_super_admin', $config['security']['role_super_admin']);
154
        $container->setParameter('sonata.admin.configuration.security.information', $config['security']['information']);
155
        $container->setParameter('sonata.admin.configuration.security.admin_permissions', $config['security']['admin_permissions']);
156
        $container->setParameter('sonata.admin.configuration.security.object_permissions', $config['security']['object_permissions']);
157
158
        $loader->load('security.xml');
159
160
        $container->setParameter('sonata.admin.extension.map', $config['extensions']);
161
162
        /*
163
         * This is a work in progress, so for now it is hardcoded
164
         */
165
        $classes = [
166
            SymfonyChoiceType::class => '',
167
            SymfonyDateType::class => 'sonata-medium-date',
168
            SymfonyDateTimeType::class => 'sonata-medium-date',
169
            SymfonyEmailType::class => '',
170
            SymfonyIntegerType::class => '',
171
            SymfonyTextareaType::class => '',
172
            SymfonyTextType::class => '',
173
        ];
174
175
        $container->getDefinition('sonata.admin.form.extension.field')
176
            ->replaceArgument(0, $classes)
177
            ->replaceArgument(1, $config['options']);
178
179
        // remove non used service
180
        if (!isset($bundles['JMSTranslationBundle'])) {
181
            $container->removeDefinition('sonata.admin.translator.extractor.jms_translator_bundle');
182
        }
183
184
        // remove non-Mopa compatibility layer
185
        if (isset($bundles['MopaBootstrapBundle'])) {
186
            $container->removeDefinition('sonata.admin.form.extension.field.mopa');
187
        }
188
189
        // set filter persistence
190
        $container->setParameter('sonata.admin.configuration.filters.persist', $config['persist_filters']);
191
        $container->setParameter('sonata.admin.configuration.filters.persister', $config['filter_persister']);
192
193
        $container->setParameter('sonata.admin.configuration.show.mosaic.button', $config['show_mosaic_button']);
194
195
        $container->setParameter('sonata.admin.configuration.translate_group_label', $config['translate_group_label']);
196
197
        $this->replacePropertyAccessor($container);
198
199
        $container
200
            ->registerForAutoconfiguration(ModelManagerInterface::class)
201
            ->addTag(ModelManagerCompilerPass::MANAGER_TAG);
202
    }
203
204
    public function getNamespace()
205
    {
206
        return 'https://sonata-project.org/schema/dic/admin';
207
    }
208
209
    private function buildStylesheets(array $config): array
210
    {
211
        return $this->mergeArray(
212
            $config['assets']['stylesheets'],
213
            $config['assets']['extra_stylesheets'],
214
            $config['assets']['remove_stylesheets']
215
        );
216
    }
217
218
    private function buildJavascripts(array $config): array
219
    {
220
        return $this->mergeArray(
221
            $config['assets']['javascripts'],
222
            $config['assets']['extra_javascripts'],
223
            $config['assets']['remove_javascripts']
224
        );
225
    }
226
227
    private function mergeArray(array $array, array $addArray, array $removeArray = []): array
228
    {
229
        foreach ($addArray as $toAdd) {
230
            array_push($array, $toAdd);
231
        }
232
        foreach ($removeArray as $toRemove) {
233
            if (\in_array($toRemove, $array, true)) {
234
                array_splice($array, array_search($toRemove, $array, true), 1);
235
            }
236
        }
237
238
        return $array;
239
    }
240
241
    private function replacePropertyAccessor(ContainerBuilder $container): void
242
    {
243
        if (!$container->has('form.property_accessor')) {
244
            return;
245
        }
246
247
        $pool = $container->getDefinition('sonata.admin.pool');
248
        $pool->replaceArgument(4, new Reference('form.property_accessor'));
249
250
        $modelChoice = $container->getDefinition('sonata.admin.form.type.model_choice');
251
        $modelChoice->replaceArgument(0, new Reference('form.property_accessor'));
252
    }
253
}
254