|
1
|
|
|
<?php |
|
2
|
|
|
/* For licensing terms, see /license.txt */ |
|
3
|
|
|
|
|
4
|
|
|
namespace Chamilo\CourseBundle\Manager; |
|
5
|
|
|
|
|
6
|
|
|
use Doctrine\Common\Cache\Cache; |
|
7
|
|
|
use Doctrine\Common\Persistence\ObjectManager; |
|
8
|
|
|
use Sylius\Bundle\SettingsBundle\Model\Settings; |
|
9
|
|
|
use Sylius\Bundle\SettingsBundle\Model\SettingsInterface; |
|
10
|
|
|
use Sylius\Bundle\SettingsBundle\Schema\SchemaRegistryInterface; |
|
11
|
|
|
use Sylius\Bundle\SettingsBundle\Schema\SettingsBuilder; |
|
12
|
|
|
use Sylius\Component\Resource\Repository\RepositoryInterface; |
|
13
|
|
|
use Symfony\Component\Validator\ConstraintViolationListInterface; |
|
14
|
|
|
use Symfony\Component\Validator\Exception\ValidatorException; |
|
15
|
|
|
use Symfony\Component\Validator\ValidatorInterface; |
|
16
|
|
|
use Chamilo\SettingsBundle\Manager\SettingsManager as ChamiloSettingsManager; |
|
17
|
|
|
use Chamilo\CourseBundle\Entity\CCourseSetting; |
|
18
|
|
|
use Chamilo\CoreBundle\Entity\Course; |
|
19
|
|
|
use Sylius\Bundle\SettingsBundle\Manager\SettingsManagerInterface; |
|
20
|
|
|
use Symfony\Component\EventDispatcher\EventDispatcherInterface; |
|
21
|
|
|
|
|
22
|
|
|
/** |
|
23
|
|
|
* Class SettingsManager |
|
24
|
|
|
* Course settings manager. |
|
25
|
|
|
* @package Chamilo\CourseBundle\Manager |
|
26
|
|
|
*/ |
|
27
|
|
|
class SettingsManager extends ChamiloSettingsManager |
|
28
|
|
|
{ |
|
29
|
|
|
protected $course; |
|
30
|
|
|
|
|
31
|
|
|
/** |
|
32
|
|
|
* @return Course |
|
33
|
|
|
*/ |
|
34
|
|
|
public function getCourse() |
|
35
|
|
|
{ |
|
36
|
|
|
return $this->course; |
|
37
|
|
|
} |
|
38
|
|
|
|
|
39
|
|
|
/** |
|
40
|
|
|
* @param Course $course |
|
41
|
|
|
*/ |
|
42
|
|
|
public function setCourse(Course $course) |
|
43
|
|
|
{ |
|
44
|
|
|
$this->course = $course; |
|
45
|
|
|
} |
|
46
|
|
|
|
|
47
|
|
|
/** |
|
48
|
|
|
* {@inheritdoc} |
|
49
|
|
|
*/ |
|
50
|
|
View Code Duplication |
public function load($schemaAlias, $namespace = null, $ignoreUnknown = true) |
|
51
|
|
|
{ |
|
52
|
|
|
/*blog_management |
|
53
|
|
|
blog |
|
54
|
|
|
course_maintenance //maintenance |
|
55
|
|
|
course_setting settings*/ |
|
56
|
|
|
|
|
57
|
|
|
|
|
58
|
|
|
$schemaAlias = 'chamilo_course.settings.'.$schemaAlias; |
|
59
|
|
|
|
|
60
|
|
|
/** @var SchemaInterface $schema */ |
|
61
|
|
|
$schema = $this->schemaRegistry->get($schemaAlias); |
|
62
|
|
|
|
|
63
|
|
|
/** @var SettingsResolverInterface $resolver */ |
|
64
|
|
|
$resolver = $this->resolverRegistry->get($schemaAlias); |
|
65
|
|
|
|
|
66
|
|
|
// try to resolve settings for schema alias and namespace |
|
67
|
|
|
$settings = $resolver->resolve($schemaAlias, $namespace); |
|
68
|
|
|
|
|
69
|
|
|
if (!$settings) { |
|
70
|
|
|
$settings = $this->settingsFactory->createNew(); |
|
71
|
|
|
$settings->setSchemaAlias($schemaAlias); |
|
72
|
|
|
} |
|
73
|
|
|
|
|
74
|
|
|
// We need to get a plain parameters array since we use the options resolver on it |
|
75
|
|
|
$parameters = $settings->getParameters(); |
|
76
|
|
|
|
|
77
|
|
|
$settingsBuilder = new SettingsBuilder(); |
|
78
|
|
|
$schema->buildSettings($settingsBuilder); |
|
79
|
|
|
|
|
80
|
|
|
// Remove unknown settings' parameters (e.g. From a previous version of the settings schema) |
|
81
|
|
|
if (true === $ignoreUnknown) { |
|
82
|
|
|
foreach ($parameters as $name => $value) { |
|
83
|
|
|
if (!$settingsBuilder->isDefined($name)) { |
|
84
|
|
|
unset($parameters[$name]); |
|
85
|
|
|
} |
|
86
|
|
|
} |
|
87
|
|
|
} |
|
88
|
|
|
|
|
89
|
|
|
$parameters = $settingsBuilder->resolve($parameters); |
|
90
|
|
|
$settings->setParameters($parameters); |
|
91
|
|
|
|
|
92
|
|
|
return $settings; |
|
93
|
|
|
} |
|
94
|
|
|
|
|
95
|
|
|
/** |
|
96
|
|
|
* {@inheritdoc} |
|
97
|
|
|
*/ |
|
98
|
|
|
public function save(SettingsInterface $settings) |
|
99
|
|
|
{ |
|
100
|
|
|
$namespace = $settings->getSchemaAlias(); |
|
101
|
|
|
|
|
102
|
|
|
/** @var SchemaInterface $schema */ |
|
103
|
|
|
$schema = $this->schemaRegistry->get($settings->getSchemaAlias()); |
|
104
|
|
|
|
|
105
|
|
|
$settingsBuilder = new SettingsBuilder(); |
|
106
|
|
|
$schema->buildSettings($settingsBuilder); |
|
107
|
|
|
|
|
108
|
|
|
$parameters = $settingsBuilder->resolve($settings->getParameters()); |
|
109
|
|
|
$settings->setParameters($parameters); |
|
110
|
|
|
|
|
111
|
|
|
/*foreach ($settingsBuilder->getTransformers() as $parameter => $transformer) { |
|
112
|
|
|
if (array_key_exists($parameter, $parameters)) { |
|
113
|
|
|
$parameters[$parameter] = $transformer->transform($parameters[$parameter]); |
|
114
|
|
|
} |
|
115
|
|
|
}*/ |
|
116
|
|
|
|
|
117
|
|
|
/*if (isset($this->resolvedSettings[$namespace])) { |
|
118
|
|
|
$transformedParameters = $this->transformParameters($settingsBuilder, $parameters); |
|
119
|
|
|
$this->resolvedSettings[$namespace]->setParameters($transformedParameters); |
|
120
|
|
|
}*/ |
|
121
|
|
|
|
|
122
|
|
|
$repo = $this->manager->getRepository('ChamiloCoreBundle:SettingsCurrent'); |
|
123
|
|
|
$persistedParameters = $repo->findBy(array('category' => $settings->getSchemaAlias())); |
|
124
|
|
|
$persistedParametersMap = array(); |
|
125
|
|
|
|
|
126
|
|
|
foreach ($persistedParameters as $parameter) { |
|
127
|
|
|
$persistedParametersMap[$parameter->getTitle()] = $parameter; |
|
128
|
|
|
} |
|
129
|
|
|
|
|
130
|
|
|
/** @var SettingsEvent $event */ |
|
131
|
|
|
/*$event = $this->eventDispatcher->dispatch( |
|
132
|
|
|
SettingsEvent::PRE_SAVE, |
|
133
|
|
|
new SettingsEvent($settings, $parameters) |
|
134
|
|
|
);*/ |
|
135
|
|
|
|
|
136
|
|
|
/** @var \Chamilo\CoreBundle\Entity\SettingsCurrent $url */ |
|
137
|
|
|
//$url = $event->getArgument('url'); |
|
138
|
|
|
$url = $this->getUrl(); |
|
139
|
|
|
|
|
140
|
|
|
$simpleCategoryName = str_replace('chamilo_course.settings.', '', $namespace); |
|
141
|
|
|
|
|
142
|
|
View Code Duplication |
foreach ($parameters as $name => $value) { |
|
143
|
|
|
if (isset($persistedParametersMap[$name])) { |
|
144
|
|
|
$persistedParametersMap[$name]->setValue($value); |
|
145
|
|
|
} else { |
|
146
|
|
|
$parameter = new CCourseSetting(); |
|
147
|
|
|
$parameter |
|
148
|
|
|
->setTitle($name) |
|
149
|
|
|
->setVariable($name) |
|
150
|
|
|
->setCategory($namespace) |
|
151
|
|
|
->setValue($value) |
|
152
|
|
|
->setCId($this->getCourse()->getId()) |
|
153
|
|
|
; |
|
154
|
|
|
|
|
155
|
|
|
$this->manager->persist($parameter); |
|
156
|
|
|
} |
|
157
|
|
|
} |
|
158
|
|
|
|
|
159
|
|
|
$this->manager->flush(); |
|
160
|
|
|
|
|
161
|
|
|
return; |
|
162
|
|
|
|
|
163
|
|
|
$schema = $this->schemaRegistry->getSchema($namespace); |
|
|
|
|
|
|
164
|
|
|
|
|
165
|
|
|
$settingsBuilder = new SettingsBuilder(); |
|
166
|
|
|
$schema->buildSettings($settingsBuilder); |
|
167
|
|
|
|
|
168
|
|
|
$parameters = $settingsBuilder->resolve($settings->getParameters()); |
|
169
|
|
|
|
|
170
|
|
View Code Duplication |
foreach ($settingsBuilder->getTransformers() as $parameter => $transformer) { |
|
171
|
|
|
if (array_key_exists($parameter, $parameters)) { |
|
172
|
|
|
$parameters[$parameter] = $transformer->transform($parameters[$parameter]); |
|
173
|
|
|
} |
|
174
|
|
|
} |
|
175
|
|
|
|
|
176
|
|
|
if (isset($this->resolvedSettings[$namespace])) { |
|
177
|
|
|
$this->resolvedSettings[$namespace]->setParameters($parameters); |
|
178
|
|
|
} |
|
179
|
|
|
|
|
180
|
|
|
$persistedParameters = $this->parameterRepository->findBy( |
|
181
|
|
|
array('category' => $namespace, 'cId' => $this->getCourse()->getId()) |
|
182
|
|
|
); |
|
183
|
|
|
|
|
184
|
|
|
$persistedParametersMap = array(); |
|
185
|
|
|
|
|
186
|
|
|
foreach ($persistedParameters as $parameter) { |
|
187
|
|
|
$persistedParametersMap[$parameter->getName()] = $parameter; |
|
188
|
|
|
} |
|
189
|
|
|
|
|
190
|
|
|
foreach ($parameters as $name => $value) { |
|
191
|
|
|
if (isset($persistedParametersMap[$name])) { |
|
192
|
|
|
$persistedParametersMap[$name]->setValue($value); |
|
193
|
|
|
} else { |
|
194
|
|
|
/** @var CCourseSetting $parameter */ |
|
195
|
|
|
//$parameter = $this->parameterFactory->createNew(); |
|
196
|
|
|
$parameter = new CCourseSetting(); |
|
197
|
|
|
$parameter |
|
198
|
|
|
->setNamespace($namespace) |
|
199
|
|
|
->setName($name) |
|
200
|
|
|
->setValue($value) |
|
201
|
|
|
->setCId($this->getCourse()->getId()) |
|
202
|
|
|
; |
|
203
|
|
|
|
|
204
|
|
|
/* @var $errors ConstraintViolationListInterface */ |
|
205
|
|
|
$errors = $this->validator->validate($parameter); |
|
206
|
|
|
if (0 < $errors->count()) { |
|
207
|
|
|
throw new ValidatorException($errors->get(0)->getMessage()); |
|
208
|
|
|
} |
|
209
|
|
|
|
|
210
|
|
|
$this->parameterManager->persist($parameter); |
|
211
|
|
|
} |
|
212
|
|
|
} |
|
213
|
|
|
|
|
214
|
|
|
$this->parameterManager->flush(); |
|
215
|
|
|
|
|
216
|
|
|
$this->cache->save($namespace, $parameters); |
|
217
|
|
|
} |
|
218
|
|
|
|
|
219
|
|
|
/** |
|
220
|
|
|
* Load parameter from database. |
|
221
|
|
|
* |
|
222
|
|
|
* @param string $namespace |
|
223
|
|
|
* |
|
224
|
|
|
* @return array |
|
225
|
|
|
*/ |
|
226
|
|
View Code Duplication |
private function getParameters($namespace) |
|
|
|
|
|
|
227
|
|
|
{ |
|
228
|
|
|
$repo = $this->manager->getRepository('ChamiloCourseBundle:CCourseSetting'); |
|
229
|
|
|
$parameters = []; |
|
230
|
|
|
foreach ($repo->findBy(array('category' => $namespace)) as $parameter) { |
|
231
|
|
|
$parameters[$parameter->getName()] = $parameter->getValue(); |
|
232
|
|
|
} |
|
233
|
|
|
} |
|
234
|
|
|
} |
|
235
|
|
|
|
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.