Completed
Pull Request — master (#154)
by Arnaud
03:49
created

ExtraConfigurationSubscriber   A

Complexity

Total Complexity 16

Size/Duplication

Total Lines 274
Duplicated Lines 0 %

Test Coverage

Coverage 1.82%

Importance

Changes 8
Bugs 1 Features 1
Metric Value
eloc 63
c 8
b 1
f 1
dl 0
loc 274
rs 10
ccs 2
cts 110
cp 0.0182
wmc 16

7 Methods

Rating   Name   Duplication   Size   Complexity  
A getOperatorFromFieldType() 0 12 2
A __construct() 0 14 1
A getSubscribedEvents() 0 4 1
A addDefaultActions() 0 14 4
A isExtraConfigurationEnabled() 0 3 1
A enrichAdminConfiguration() 0 32 2
A addDefaultFilters() 0 30 5
1
<?php
2
3
namespace LAG\AdminBundle\Event\Subscriber;
4
5
use Doctrine\ORM\EntityManagerInterface;
6
use LAG\AdminBundle\Bridge\Doctrine\ORM\Metadata\MetadataHelperInterface;
7
use LAG\AdminBundle\Configuration\ApplicationConfiguration;
8
use LAG\AdminBundle\Configuration\ApplicationConfigurationStorage;
9
use LAG\AdminBundle\Event\Events;
10
use LAG\AdminBundle\Event\Events\ConfigurationEvent;
11
use LAG\AdminBundle\Factory\ConfigurationFactory;
12
use LAG\AdminBundle\Field\Helper\FieldConfigurationHelper;
13
use LAG\AdminBundle\Resource\Registry\ResourceRegistryInterface;
14
use LAG\AdminBundle\Utils\TranslationUtils;
15
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
16
use Symfony\Contracts\Translation\TranslatorInterface;
17
18
/**
19
 * Add extra default configuration for actions and fields.
20
 */
21
class ExtraConfigurationSubscriber implements EventSubscriberInterface
22
{
23
    /**
24
     * @var ApplicationConfiguration
25
     */
26
    private $applicationConfiguration;
27
28
    /**
29
     * @var ResourceRegistryInterface
30
     */
31
    private $registry;
32
33
    /**
34
     * @var ConfigurationFactory
35
     */
36
    private $configurationFactory;
37
38
    /**
39
     * @var MetadataHelperInterface
40
     */
41
    private $metadataHelper;
42
43
    /**
44
     * @var EntityManagerInterface
45
     */
46
    private $entityManager;
47
48
    /**
49
     * @var TranslatorInterface
50
     */
51
    private $translator;
52
53
    /**
54
     * @return array
55
     */
56
    public static function getSubscribedEvents()
57 2
    {
58
        return [
59
            Events::CONFIGURATION_ADMIN => 'enrichAdminConfiguration',
60 2
            //Events::MENU_CONFIGURATION => 'enrichMenuConfiguration',
61
        ];
62
    }
63
64
    /**
65
     * ExtraConfigurationSubscriber constructor.
66
     */
67
    public function __construct(
68
        ApplicationConfigurationStorage $applicationConfigurationStorage,
69
        EntityManagerInterface $entityManager,
70
        ResourceRegistryInterface $registry,
71
        ConfigurationFactory $configurationFactory,
72
        MetadataHelperInterface $metadataHelper,
73
        TranslatorInterface $translator
74
    ) {
75
        $this->applicationConfiguration = $applicationConfigurationStorage->getConfiguration();
76
        $this->registry = $registry;
77
        $this->configurationFactory = $configurationFactory;
78
        $this->metadataHelper = $metadataHelper;
79
        $this->entityManager = $entityManager;
80
        $this->translator = $translator;
81
    }
82
83
    public function enrichAdminConfiguration(ConfigurationEvent $event)
84
    {
85
        if (!$this->isExtraConfigurationEnabled()) {
86
            return;
87
        }
88
        $configuration = $event->getConfiguration();
89
90
        // Actions
91
        $this->addDefaultActions($configuration);
92
93
        // Add default field configuration: it provides a type, a form type, and a view according to the found metadata
94
        $helper = new FieldConfigurationHelper(
95
            $this->entityManager,
96
            $this->translator,
97
            $this->applicationConfiguration,
98
            $this->metadataHelper
99
        );
100
        $helper->addDefaultFields($configuration, $event->getEntityClass(), $event->getAdminName());
101
        $helper->addDefaultStrategy($configuration);
102
        $helper->addDefaultRouteParameters($configuration);
103
        $helper->addDefaultFormUse($configuration);
104
        $helper->provideActionsFieldConfiguration($configuration, $event->getAdminName());
105
106
        // Menus
107
//        $this->addDefaultRightMenu($configuration);
108
//        $this->addDefaultLeftMenu($configuration);
109
//        $this->addDefaultTopMenu($configuration, $event->getAdminName());
110
111
        // Filters
112
        $this->addDefaultFilters($configuration);
113
114
        $event->setConfiguration($configuration);
115
    }
116
117
    /**
118
     * Defines the default CRUD actions if no action was configured.
119
     */
120
    private function addDefaultActions(array &$configuration)
121
    {
122
        if (!key_exists('actions', $configuration) || !is_array($configuration['actions'])) {
123
            $configuration['actions'] = [];
124
        }
125
126
        if (0 !== count($configuration['actions'])) {
127
            return;
128
        }
129
        $configuration['actions'] = [
130
            'create' => [],
131
            'list' => [],
132
            'edit' => [],
133
            'delete' => [],
134
        ];
135
    }
136
137
//    /**
138
//     * Add the default left menu configuration. One item for each Admin.
139
//     */
140
//    private function addDefaultLeftMenu(array &$configuration)
141
//    {
142
//        if (!$this->applicationConfiguration->getParameter('enable_menus')) {
143
//            return;
144
//        }
145
//        $menus = $this->configurationFactory->createResourceMenuConfiguration();
146
//
147
//        // Add the resources menu for each action of the admin
148
//        foreach ($configuration['actions'] as $name => $action) {
149
//            if (null === $action) {
150
//                $action = [];
151
//            }
152
//
153
//            if (key_exists('menus', $action) && key_exists('left', $action)) {
154
//                continue;
155
//            }
156
//
157
//            $configuration['actions'][$name]['menus']['left'] = $menus;
158
//        }
159
//    }
160
//
161
//    /**
162
//     * Add the default right menu.
163
//     */
164
//    private function addDefaultRightMenu(array &$configuration)
165
//    {
166
//        if (!$this->applicationConfiguration->getParameter('enable_menus')) {
167
//            return;
168
//        }
169
//
170
//        if (!key_exists('list', $configuration['actions']) || null === $configuration['actions']['list']) {
171
//            return;
172
//        }
173
//
174
//        if (
175
//            key_exists('menus', $configuration['actions']['list']) &&
176
//            is_array($configuration['actions']['list']['menus']) &&
177
//            key_exists('right', $configuration['actions']['list']['menus'])
178
//        ) {
179
//            return;
180
//        }
181
//
182
//        $configuration['actions']['list']['menus']['right'] = [];
183
//    }
184
//
185
//    private function addDefaultTopMenu(array &$configuration, string $adminName)
186
//    {
187
//        if (!$this->applicationConfiguration->getParameter('enable_menus')) {
188
//            return;
189
//        }
190
//
191
//        if (key_exists('list', $configuration['actions'])) {
192
//            // Add a "Create" link in the top bar if the create action is allowed
193
//            if (!key_exists('create', $configuration['actions'])) {
194
//                return;
195
//            }
196
//            $configuration['actions']['list']['menus']['top']['items'][] = [
197
//                'admin' => $adminName,
198
//                'action' => 'create',
199
//                'text' => $this->getText('create', $adminName),
200
//                'icon' => 'plus',
201
//            ];
202
//        }
203
//
204
//        if (key_exists('create', $configuration['actions'])) {
205
//            // Add a "Return" link in the top bar if the list action is allowed
206
//            if (!key_exists('list', $configuration['actions'])) {
207
//                return;
208
//            }
209
    ////            $configuration['actions']['create']['menus']['top']['items'][] = [
210
    ////                'admin' => $adminName,
211
    ////                'action' => 'list',
212
    ////                'text' => $this->getText('return', $adminName),
213
    ////                'icon' => 'arrow-left',
214
    ////            ];
215
//        }
216
//
217
//        if (key_exists('edit', $configuration['actions'])) {
218
//            // Add a "Return" link in the top bar if the list action is allowed
219
//            if (!key_exists('list', $configuration['actions'])) {
220
//                return;
221
//            }
222
//
223
//            if (!key_exists('menus', $configuration['actions']['edit'])) {
224
//                $configuration['actions']['edit']['menus'] = [];
225
//            }
226
//
227
//            if (!key_exists('top', $configuration['actions']['edit']['menus'])) {
228
//                $configuration['actions']['edit']['menus']['top'] = [];
229
//            }
230
//
231
//            if (!key_exists('items', $configuration['actions']['edit']['menus']['top'])) {
232
//                $configuration['actions']['edit']['menus']['top']['items'] = [];
233
//            }
234
    ////            array_unshift($configuration['actions']['edit']['menus']['top']['items'], [
235
    ////                'admin' => $adminName,
236
    ////                'action' => 'list',
237
    ////                'text' => $this->getText('return', $adminName),
238
    ////                'icon' => 'arrow-left',
239
    ////            ]);
240
//        }
241
//    }
242
243
    /**
244
     * Add default filters for the list actions, guessed using the entity metadata.
245
     */
246
    private function addDefaultFilters(array &$configuration): void
247
    {
248
        // Add the filters only for the "list" action
249
        if (!key_exists('list', $configuration['actions'])) {
250
            return;
251
        }
252
253
        // If some filters are already configured, we do not add the default filters
254
        if (key_exists('filter', $configuration['actions']['list'])) {
255
            return;
256
        }
257
        // TODO add a default unified filter
258
        $metadata = $this->metadataHelper->findMetadata($configuration['entity']);
259
260
        if (null === $metadata) {
261
            return;
262
        }
263
        $filters = [];
264
265
        foreach ($metadata->getFieldNames() as $fieldName) {
266
            $type = $metadata->getTypeOfField($fieldName);
267
            $operator = $this->getOperatorFromFieldType($type);
268
269
            $filters[$fieldName] = [
270
                'type' => $type,
271
                'options' => [],
272
                'comparator' => $operator,
273
            ];
274
        }
275
        $configuration['actions']['list']['filters'] = $filters;
276
    }
277
278
    private function getOperatorFromFieldType($type)
279
    {
280
        $mapping = [
281
            'string' => 'like',
282
            'text' => 'like',
283
        ];
284
285
        if (key_exists($type, $mapping)) {
286
            return $mapping[$type];
287
        }
288
289
        return '=';
290
    }
291
292
    private function isExtraConfigurationEnabled(): bool
293
    {
294
        return $this->applicationConfiguration->getParameter('enable_extra_configuration');
295
    }
296
}
297