|
1
|
|
|
<?php |
|
2
|
|
|
/* For licensing terms, see /license.txt */ |
|
3
|
|
|
|
|
4
|
|
|
namespace Chamilo\SettingsBundle\Manager; |
|
5
|
|
|
|
|
6
|
|
|
use Chamilo\CoreBundle\Entity\AccessUrl; |
|
7
|
|
|
use Chamilo\CoreBundle\Entity\Course; |
|
8
|
|
|
use Chamilo\CoreBundle\Settings\PlatformSettingsSchema; |
|
9
|
|
|
use Sylius\Bundle\ResourceBundle\Controller\EventDispatcherInterface; |
|
10
|
|
|
use Sylius\Bundle\SettingsBundle\Event\SettingsEvent; |
|
11
|
|
|
use Doctrine\Common\Cache\Cache; |
|
12
|
|
|
use Doctrine\Common\Persistence\ObjectManager; |
|
13
|
|
|
use Sylius\Bundle\SettingsBundle\Manager\SettingsManagerInterface; |
|
14
|
|
|
use Sylius\Bundle\SettingsBundle\Model\Settings; |
|
15
|
|
|
use Sylius\Bundle\SettingsBundle\Model\SettingsInterface; |
|
16
|
|
|
use Sylius\Bundle\SettingsBundle\Schema\SchemaInterface; |
|
17
|
|
|
use Sylius\Bundle\SettingsBundle\Schema\SchemaRegistryInterface; |
|
18
|
|
|
use Sylius\Bundle\SettingsBundle\Schema\SettingsBuilder; |
|
19
|
|
|
use Sylius\Component\Registry\ServiceRegistryInterface; |
|
20
|
|
|
use Sylius\Component\Resource\Factory\FactoryInterface; |
|
21
|
|
|
use Sylius\Component\Resource\Repository\RepositoryInterface; |
|
22
|
|
|
use Symfony\Component\Validator\ConstraintViolationListInterface; |
|
23
|
|
|
use Symfony\Component\Validator\Exception\ValidatorException; |
|
24
|
|
|
use Symfony\Component\Validator\ValidatorInterface; |
|
25
|
|
|
use Sylius\Bundle\SettingsBundle\Manager\SettingsManager as SyliusSettingsManager; |
|
26
|
|
|
use Chamilo\CoreBundle\Entity\SettingsCurrent; |
|
27
|
|
|
|
|
28
|
|
|
/** |
|
29
|
|
|
* Class SettingsManager |
|
30
|
|
|
* @package Chamilo\SettingsBundle\Manager |
|
31
|
|
|
*/ |
|
32
|
|
|
class SettingsManager implements SettingsManagerInterface |
|
33
|
|
|
{ |
|
34
|
|
|
private $url; |
|
35
|
|
|
|
|
36
|
|
|
/** |
|
37
|
|
|
* @var ServiceRegistryInterface |
|
38
|
|
|
*/ |
|
39
|
|
|
private $schemaRegistry; |
|
40
|
|
|
|
|
41
|
|
|
/** |
|
42
|
|
|
* @var ObjectManager |
|
43
|
|
|
*/ |
|
44
|
|
|
private $manager; |
|
45
|
|
|
|
|
46
|
|
|
/** |
|
47
|
|
|
* @var FactoryInterface |
|
48
|
|
|
*/ |
|
49
|
|
|
private $settingsFactory; |
|
50
|
|
|
|
|
51
|
|
|
/** |
|
52
|
|
|
* @var EventDispatcherInterface |
|
53
|
|
|
*/ |
|
54
|
|
|
private $eventDispatcher; |
|
55
|
|
|
|
|
56
|
|
|
/** |
|
57
|
|
|
* Runtime cache for resolved parameters |
|
58
|
|
|
* |
|
59
|
|
|
* @var Settings[] |
|
60
|
|
|
*/ |
|
61
|
|
|
protected $resolvedSettings = array(); |
|
62
|
|
|
|
|
63
|
|
|
public function __construct( |
|
64
|
|
|
ServiceRegistryInterface $schemaRegistry, |
|
65
|
|
|
ServiceRegistryInterface $parameterManager, |
|
66
|
|
|
ObjectManager $parameterRepository, |
|
67
|
|
|
FactoryInterface $cache, |
|
68
|
|
|
$eventDispatcher |
|
69
|
|
|
) { |
|
70
|
|
|
$this->schemaRegistry = $schemaRegistry; |
|
71
|
|
|
$this->parameterManager = $parameterManager; |
|
72
|
|
|
$this->parameterRepository = $parameterRepository; |
|
73
|
|
|
$this->eventDispatcher = $eventDispatcher; |
|
74
|
|
|
} |
|
75
|
|
|
|
|
76
|
|
|
/** |
|
77
|
|
|
* @return AccessUrl |
|
78
|
|
|
*/ |
|
79
|
|
|
public function getUrl() |
|
80
|
|
|
{ |
|
81
|
|
|
return $this->url; |
|
82
|
|
|
} |
|
83
|
|
|
|
|
84
|
|
|
/** |
|
85
|
|
|
* @param AccessUrl $url |
|
86
|
|
|
*/ |
|
87
|
|
|
public function setUrl(AccessUrl $url) |
|
88
|
|
|
{ |
|
89
|
|
|
$this->url = $url; |
|
90
|
|
|
} |
|
91
|
|
|
|
|
92
|
|
|
/** |
|
93
|
|
|
* @param AccessUrl $url |
|
94
|
|
|
*/ |
|
95
|
|
|
public function installSchemas(AccessUrl $url) |
|
96
|
|
|
{ |
|
97
|
|
|
$this->url = $url; |
|
98
|
|
|
$schemas = $this->getSchemas(); |
|
99
|
|
|
$schemas = array_keys($schemas); |
|
100
|
|
|
|
|
101
|
|
|
/** |
|
102
|
|
|
* @var string $key |
|
103
|
|
|
* @var \Sylius\Bundle\SettingsBundle\Schema\SchemaInterface $schema |
|
104
|
|
|
*/ |
|
105
|
|
|
foreach ($schemas as $schema) { |
|
106
|
|
|
|
|
107
|
|
|
$settings = $this->load($schema); |
|
108
|
|
|
$this->save($schema, $settings); |
|
109
|
|
|
} |
|
110
|
|
|
} |
|
111
|
|
|
|
|
112
|
|
|
/** |
|
113
|
|
|
* @return array |
|
114
|
|
|
*/ |
|
115
|
|
|
public function getSchemas() |
|
116
|
|
|
{ |
|
117
|
|
|
return $this->schemaRegistry->getSchemas(); |
|
118
|
|
|
} |
|
119
|
|
|
|
|
120
|
|
|
/** |
|
121
|
|
|
* @param $name |
|
122
|
|
|
* @return mixed |
|
123
|
|
|
* @throws \InvalidArgumentException |
|
124
|
|
|
*/ |
|
125
|
|
|
public function getSetting($name) |
|
126
|
|
|
{ |
|
127
|
|
|
if (false === strpos($name, '.')) { |
|
128
|
|
|
throw new \InvalidArgumentException(sprintf('Parameter must be in format "namespace.name", "%s" given.', $name)); |
|
129
|
|
|
} |
|
130
|
|
|
|
|
131
|
|
|
list($namespace, $name) = explode('.', $name); |
|
132
|
|
|
$settings = $this->load($this->convertNameSpaceToService($namespace)); |
|
133
|
|
|
|
|
134
|
|
|
return $settings->get($name); |
|
135
|
|
|
} |
|
136
|
|
|
|
|
137
|
|
|
public function convertNameSpaceToService($namespace) |
|
138
|
|
|
{ |
|
139
|
|
|
//return 'chamilo_core.settings.'.$namespace; |
|
140
|
|
|
return ''.$namespace; |
|
141
|
|
|
} |
|
142
|
|
|
|
|
143
|
|
|
/** |
|
144
|
|
|
* {@inheritdoc} |
|
145
|
|
|
*/ |
|
146
|
|
|
public function load($namespace, $namespace2 = null, $ignoreUnknown = true) |
|
147
|
|
|
{ |
|
148
|
|
|
/*$schema = $this->schemaRegistry->get($schemaAlias); |
|
149
|
|
|
$resolver = $this->resolverRegistry->get($schemaAlias); |
|
150
|
|
|
|
|
151
|
|
|
// try to resolve settings for schema alias and namespace |
|
152
|
|
|
$settings = $resolver->resolve($schemaAlias, $namespace); |
|
153
|
|
|
|
|
154
|
|
|
dump($settings); |
|
155
|
|
|
|
|
156
|
|
|
$parameters = $this->getParameters($namespace); |
|
157
|
|
|
|
|
158
|
|
|
$schema = $this->schemaRegistry->get($namespace); |
|
159
|
|
|
|
|
160
|
|
|
$settingsBuilder = new SettingsBuilder(); |
|
161
|
|
|
$schema->buildSettings($settingsBuilder); |
|
162
|
|
|
|
|
163
|
|
|
foreach ($settingsBuilder->getTransformers() as $parameter => $transformer) { |
|
164
|
|
|
if (array_key_exists($parameter, $parameters)) { |
|
165
|
|
|
$parameters[$parameter] = $transformer->reverseTransform($parameters[$parameter]); |
|
166
|
|
|
} |
|
167
|
|
|
} |
|
168
|
|
|
$parameters = $settingsBuilder->resolve($parameters); |
|
169
|
|
|
|
|
170
|
|
|
return $this->resolvedSettings[$namespace] = new Settings($parameters);*/ |
|
171
|
|
|
|
|
172
|
|
|
/*$schema = $this->schemaRegistry->get($schemaAlias); |
|
173
|
|
|
$resolver = $this->resolverRegistry->get($schemaAlias); |
|
174
|
|
|
|
|
175
|
|
|
// try to resolve settings for schema alias and namespace |
|
176
|
|
|
$settings = $resolver->resolve($schemaAlias, $namespace); |
|
177
|
|
|
|
|
178
|
|
|
if (!$settings) { |
|
179
|
|
|
$settings = $this->settingsFactory->createNew(); |
|
180
|
|
|
$settings->setSchemaAlias($schemaAlias); |
|
181
|
|
|
}*/ |
|
182
|
|
|
|
|
183
|
|
|
//$schemaAlias = 'chamilo_core.settings.'.$schemaAlias; |
|
184
|
|
|
|
|
185
|
|
|
|
|
186
|
|
|
if (isset($this->resolvedSettings[$namespace])) { |
|
187
|
|
|
return $this->resolvedSettings[$namespace]; |
|
188
|
|
|
} |
|
189
|
|
|
|
|
190
|
|
|
if ($this->cache->contains($namespace)) { |
|
191
|
|
|
$parameters = $this->cache->fetch($namespace); |
|
192
|
|
|
} else { |
|
193
|
|
|
$parameters = $this->getParameters($namespace); |
|
194
|
|
|
} |
|
195
|
|
|
|
|
196
|
|
|
$schema = $this->schemaRegistry->getSchema($namespace); |
|
197
|
|
|
|
|
198
|
|
|
$settingsBuilder = new SettingsBuilder(); |
|
199
|
|
|
$schema->buildSettings($settingsBuilder); |
|
200
|
|
|
|
|
201
|
|
|
$parameters = $this->transformParameters($settingsBuilder, $parameters); |
|
202
|
|
|
$parameters = $settingsBuilder->resolve($parameters); |
|
203
|
|
|
|
|
204
|
|
|
return $this->resolvedSettings[$namespace] = new Settings($parameters); |
|
205
|
|
|
|
|
206
|
|
|
|
|
207
|
|
|
|
|
208
|
|
|
$settings = $this->settingsFactory->createNew(); |
|
|
|
|
|
|
209
|
|
|
$settings->setSchemaAlias($schemaAlias); |
|
210
|
|
|
|
|
211
|
|
|
$parameters = $this->getParameters($schemaAlias); |
|
212
|
|
|
|
|
213
|
|
|
/** @var SchemaInterface $schema */ |
|
214
|
|
|
$schema = $this->schemaRegistry->get($schemaAlias); |
|
215
|
|
|
|
|
216
|
|
|
// We need to get a plain parameters array since we use the options resolver on it |
|
217
|
|
|
//$parameters = $settings->getParameters(); |
|
218
|
|
|
|
|
219
|
|
|
$settingsBuilder = new SettingsBuilder(); |
|
220
|
|
|
$schema->buildSettings($settingsBuilder); |
|
221
|
|
|
|
|
222
|
|
|
// Remove unknown settings' parameters (e.g. From a previous version of the settings schema) |
|
223
|
|
|
if (true === $ignoreUnknown) { |
|
224
|
|
|
foreach ($parameters as $name => $value) { |
|
225
|
|
|
if (!$settingsBuilder->isDefined($name)) { |
|
226
|
|
|
unset($parameters[$name]); |
|
227
|
|
|
} |
|
228
|
|
|
} |
|
229
|
|
|
} |
|
230
|
|
|
|
|
231
|
|
|
$parameters = $settingsBuilder->resolve($parameters); |
|
232
|
|
|
$settings->setParameters($parameters); |
|
233
|
|
|
|
|
234
|
|
|
return $settings; |
|
235
|
|
|
} |
|
236
|
|
|
|
|
237
|
|
|
/** |
|
238
|
|
|
* {@inheritdoc} |
|
239
|
|
|
* @throws ValidatorException |
|
240
|
|
|
*/ |
|
241
|
|
|
//public function save($namespace, $settings) |
|
242
|
|
|
public function save(SettingsInterface $settings) |
|
243
|
|
|
{ |
|
244
|
|
|
$schema = $this->schemaRegistry->getSchema($namespace); |
|
|
|
|
|
|
245
|
|
|
|
|
246
|
|
|
$settingsBuilder = new SettingsBuilder(); |
|
247
|
|
|
$schema->buildSettings($settingsBuilder); |
|
248
|
|
|
|
|
249
|
|
|
$parameters = $settingsBuilder->resolve($settings->getParameters()); |
|
250
|
|
|
|
|
251
|
|
View Code Duplication |
foreach ($settingsBuilder->getTransformers() as $parameter => $transformer) { |
|
252
|
|
|
if (array_key_exists($parameter, $parameters)) { |
|
253
|
|
|
$parameters[$parameter] = $transformer->transform($parameters[$parameter]); |
|
254
|
|
|
} |
|
255
|
|
|
} |
|
256
|
|
|
|
|
257
|
|
|
if (isset($this->resolvedSettings[$namespace])) { |
|
258
|
|
|
$transformedParameters = $this->transformParameters($settingsBuilder, $parameters); |
|
259
|
|
|
$this->resolvedSettings[$namespace]->setParameters($transformedParameters); |
|
260
|
|
|
} |
|
261
|
|
|
|
|
262
|
|
|
$persistedParameters = $this->parameterRepository->findBy(array('category' => $namespace)); |
|
263
|
|
|
$persistedParametersMap = array(); |
|
264
|
|
|
|
|
265
|
|
|
foreach ($persistedParameters as $parameter) { |
|
266
|
|
|
$persistedParametersMap[$parameter->getName()] = $parameter; |
|
267
|
|
|
} |
|
268
|
|
|
|
|
269
|
|
|
/** @var SettingsEvent $event */ |
|
270
|
|
|
$event = $this->eventDispatcher->dispatch( |
|
|
|
|
|
|
271
|
|
|
SettingsEvent::PRE_SAVE, |
|
272
|
|
|
new SettingsEvent($namespace, $settings, $parameters) |
|
273
|
|
|
); |
|
274
|
|
|
|
|
275
|
|
|
/** @var \Chamilo\CoreBundle\Entity\SettingsCurrent $url */ |
|
276
|
|
|
$url = $event->getArgument('url'); |
|
277
|
|
|
|
|
278
|
|
|
foreach ($parameters as $name => $value) { |
|
279
|
|
|
if (isset($persistedParametersMap[$name])) { |
|
280
|
|
|
$persistedParametersMap[$name]->setValue($value); |
|
281
|
|
|
} else { |
|
282
|
|
|
$parameter = $this->parameterRepository->createNew(); |
|
283
|
|
|
|
|
284
|
|
|
$parameter |
|
285
|
|
|
->setNamespace($namespace) |
|
286
|
|
|
->setName($name) |
|
287
|
|
|
->setValue($value) |
|
288
|
|
|
->setUrl($url) |
|
289
|
|
|
->setAccessUrlChangeable(1) |
|
290
|
|
|
->setAccessUrlLocked(1) |
|
291
|
|
|
; |
|
292
|
|
|
|
|
293
|
|
|
/* @var $errors ConstraintViolationListInterface */ |
|
294
|
|
|
$errors = $this->validator->validate($parameter); |
|
295
|
|
|
if (0 < $errors->count()) { |
|
296
|
|
|
throw new ValidatorException($errors->get(0)->getMessage()); |
|
297
|
|
|
} |
|
298
|
|
|
|
|
299
|
|
|
$this->parameterManager->persist($parameter); |
|
300
|
|
|
} |
|
301
|
|
|
} |
|
302
|
|
|
|
|
303
|
|
|
$this->parameterManager->flush(); |
|
304
|
|
|
|
|
305
|
|
|
$this->eventDispatcher->dispatch(SettingsEvent::POST_SAVE, new SettingsEvent($namespace, $settings, $parameters)); |
|
|
|
|
|
|
306
|
|
|
|
|
307
|
|
|
$this->cache->save($namespace, $parameters); |
|
308
|
|
|
|
|
309
|
|
|
|
|
310
|
|
|
|
|
311
|
|
|
return; |
|
312
|
|
|
|
|
313
|
|
|
|
|
314
|
|
|
|
|
315
|
|
|
|
|
316
|
|
|
|
|
317
|
|
|
|
|
318
|
|
|
|
|
319
|
|
|
//// |
|
320
|
|
|
$schemaAlias = $settings->getSchemaAlias(); |
|
|
|
|
|
|
321
|
|
|
$schemaAliasChamilo = str_replace('chamilo_core.settings.', '', $schemaAlias); |
|
322
|
|
|
|
|
323
|
|
|
$schema = $this->schemaRegistry->get($schemaAlias); |
|
324
|
|
|
|
|
325
|
|
|
$settingsBuilder = new SettingsBuilder(); |
|
326
|
|
|
$schema->buildSettings($settingsBuilder); |
|
327
|
|
|
|
|
328
|
|
|
$parameters = $settingsBuilder->resolve($settings->getParameters()); |
|
329
|
|
|
|
|
330
|
|
View Code Duplication |
foreach ($settingsBuilder->getTransformers() as $parameter => $transformer) { |
|
331
|
|
|
if (array_key_exists($parameter, $parameters)) { |
|
332
|
|
|
$parameters[$parameter] = $transformer->transform($parameters[$parameter]); |
|
333
|
|
|
} |
|
334
|
|
|
} |
|
335
|
|
|
|
|
336
|
|
|
/** @var \Sylius\Bundle\SettingsBundle\Event\SettingsEvent $event */ |
|
337
|
|
|
$event = $this->eventDispatcher->dispatch( |
|
|
|
|
|
|
338
|
|
|
SettingsEvent::PRE_SAVE, |
|
339
|
|
|
new SettingsEvent($settings) |
|
340
|
|
|
); |
|
341
|
|
|
|
|
342
|
|
|
/** @var \Chamilo\CoreBundle\Entity\SettingsCurrent $url */ |
|
343
|
|
|
$url = $event->getSettings()->getAccessUrl(); |
|
344
|
|
|
|
|
345
|
|
|
foreach ($parameters as $name => $value) { |
|
346
|
|
|
if (isset($persistedParametersMap[$name])) { |
|
347
|
|
|
if ($value instanceof Course) { |
|
348
|
|
|
$value = $value->getId(); |
|
349
|
|
|
} |
|
350
|
|
|
$persistedParametersMap[$name]->setValue($value); |
|
351
|
|
|
} else { |
|
352
|
|
|
/** @var SettingsCurrent $setting */ |
|
353
|
|
|
$setting = $this->settingsFactory->createNew(); |
|
354
|
|
|
$setting->setSchemaAlias($schemaAlias); |
|
355
|
|
|
|
|
356
|
|
|
$setting |
|
357
|
|
|
->setNamespace($schemaAliasChamilo) |
|
358
|
|
|
->setName($name) |
|
359
|
|
|
->setValue($value) |
|
360
|
|
|
->setUrl($url) |
|
361
|
|
|
->setAccessUrlLocked(0) |
|
362
|
|
|
->setAccessUrlChangeable(1) |
|
363
|
|
|
; |
|
364
|
|
|
|
|
365
|
|
|
|
|
366
|
|
|
/* @var $errors ConstraintViolationListInterface */ |
|
367
|
|
|
/*$errors = $this->->validate($parameter); |
|
368
|
|
|
if (0 < $errors->count()) { |
|
369
|
|
|
throw new ValidatorException($errors->get(0)->getMessage()); |
|
370
|
|
|
}*/ |
|
371
|
|
|
$this->manager->persist($setting); |
|
372
|
|
|
$this->manager->flush(); |
|
373
|
|
|
} |
|
374
|
|
|
} |
|
375
|
|
|
/*$parameters = $settingsBuilder->resolve($settings->getParameters()); |
|
376
|
|
|
$settings->setParameters($parameters); |
|
377
|
|
|
|
|
378
|
|
|
$this->eventDispatcher->dispatch(SettingsEvent::PRE_SAVE, new SettingsEvent($settings)); |
|
379
|
|
|
|
|
380
|
|
|
$this->manager->persist($settings); |
|
381
|
|
|
$this->manager->flush(); |
|
382
|
|
|
|
|
383
|
|
|
$this->eventDispatcher->dispatch(SettingsEvent::POST_SAVE, new SettingsEvent($settings));*/ |
|
384
|
|
|
} |
|
385
|
|
|
|
|
386
|
|
|
/** |
|
387
|
|
|
* Load parameter from database. |
|
388
|
|
|
* |
|
389
|
|
|
* @param string $namespace |
|
390
|
|
|
* |
|
391
|
|
|
* @return array |
|
392
|
|
|
*/ |
|
393
|
|
|
private function getParameters($namespace) |
|
394
|
|
|
{ |
|
395
|
|
|
$repo = $this->parameterRepository; |
|
396
|
|
|
//$repo = $this->manager->getRepository('ChamiloCoreBundle:SettingsCurrent'); |
|
397
|
|
|
$parameters = []; |
|
398
|
|
|
foreach ($repo->findBy(array('category' => $namespace)) as $parameter) { |
|
399
|
|
|
$parameters[$parameter->getName()] = $parameter->getValue(); |
|
400
|
|
|
} |
|
401
|
|
|
|
|
402
|
|
|
return $parameters; |
|
403
|
|
|
} |
|
404
|
|
|
|
|
405
|
|
|
public function getParametersFromKeyword($namespace, $keyword = '') |
|
406
|
|
|
{ |
|
407
|
|
|
$criteria = array('category' => $namespace); |
|
408
|
|
|
if (!empty($keyword)) { |
|
409
|
|
|
$criteria['variable'] = $keyword; |
|
410
|
|
|
} |
|
411
|
|
|
|
|
412
|
|
|
$parametersFromDb = $this->parameterRepository->findBy($criteria); |
|
413
|
|
|
|
|
414
|
|
|
$parameters = array(); |
|
415
|
|
|
/** @var \Chamilo\CoreBundle\Entity\SettingsCurrent $parameter */ |
|
416
|
|
|
foreach ($parametersFromDb as $parameter) { |
|
417
|
|
|
$parameters[$parameter->getName()] = $parameter->getValue(); |
|
418
|
|
|
} |
|
419
|
|
|
|
|
420
|
|
|
return $parameters; |
|
421
|
|
|
} |
|
422
|
|
|
|
|
423
|
|
|
private function transformParameters(SettingsBuilder $settingsBuilder, array $parameters) |
|
424
|
|
|
{ |
|
425
|
|
|
$transformedParameters = $parameters; |
|
426
|
|
|
|
|
427
|
|
View Code Duplication |
foreach ($settingsBuilder->getTransformers() as $parameter => $transformer) { |
|
428
|
|
|
if (array_key_exists($parameter, $parameters)) { |
|
429
|
|
|
$transformedParameters[$parameter] = $transformer->reverseTransform($parameters[$parameter]); |
|
430
|
|
|
} |
|
431
|
|
|
} |
|
432
|
|
|
|
|
433
|
|
|
return $transformedParameters; |
|
434
|
|
|
} |
|
435
|
|
|
} |
|
436
|
|
|
|
This check looks for unreachable code. It uses sophisticated control flow analysis techniques to find statements which will never be executed.
Unreachable code is most often the result of
return,dieorexitstatements that have been added for debug purposes.In the above example, the last
return falsewill never be executed, because a return statement has already been met in every possible execution path.