Passed
Push — master ( ef4281...937b2f )
by Julito
12:13
created

SettingsManager::getAllParametersByCategory()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 10
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 5
c 0
b 0
f 0
nc 2
nop 0
dl 0
loc 10
rs 10
1
<?php
2
3
/* For licensing terms, see /license.txt */
4
5
namespace Chamilo\SettingsBundle\Manager;
6
7
use Chamilo\CoreBundle\Entity\AccessUrl;
8
use Chamilo\CoreBundle\Entity\Course;
9
use Chamilo\CoreBundle\Entity\SettingsCurrent;
10
use Doctrine\ORM\EntityManager;
11
use Doctrine\ORM\EntityRepository;
12
use Sylius\Bundle\SettingsBundle\Event\SettingsEvent;
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\SettingsBuilder;
18
use Sylius\Component\Registry\ServiceRegistryInterface;
19
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
20
use Symfony\Component\Validator\ConstraintViolationListInterface;
21
use Symfony\Component\Validator\Exception\ValidatorException;
22
23
/**
24
 * Class SettingsManager.
25
 */
26
class SettingsManager implements SettingsManagerInterface
27
{
28
    protected $url;
29
30
    /**
31
     * @var ServiceRegistryInterface
32
     */
33
    protected $schemaRegistry;
34
35
    /**
36
     * @var ServiceRegistryInterface
37
     */
38
    protected $resolverRegistry;
39
40
    /**
41
     * @var EntityManager
42
     */
43
    protected $manager;
44
45
    /**
46
     * @var EntityRepository
47
     */
48
    protected $repository;
49
50
    /**
51
     * @var EventDispatcherInterface
52
     */
53
    protected $eventDispatcher;
54
55
    /**
56
     * Runtime cache for resolved parameters.
57
     *
58
     * @var Settings[]
59
     */
60
    protected $resolvedSettings = [];
61
62
    protected $settings;
63
    protected $schemaList;
64
65
    /**
66
     * SettingsManager constructor.
67
     *
68
     * @param $eventDispatcher
69
     */
70
    public function __construct(
71
        ServiceRegistryInterface $schemaRegistry,
72
        EntityManager $manager,
73
        EntityRepository $repository,
74
        $eventDispatcher
75
    ) {
76
        $this->schemaRegistry = $schemaRegistry;
77
        $this->manager = $manager;
78
        $this->repository = $repository;
79
        $this->eventDispatcher = $eventDispatcher;
80
    }
81
82
    /**
83
     * @return AccessUrl
84
     */
85
    public function getUrl()
86
    {
87
        return $this->url;
88
    }
89
90
    public function setUrl(AccessUrl $url)
91
    {
92
        $this->url = $url;
93
    }
94
95
    public function updateSchemas(AccessUrl $url)
96
    {
97
        $this->url = $url;
98
        $schemas = array_keys($this->getSchemas());
99
100
        /**
101
         * @var string
102
         * @var SchemaInterface $schema
103
         */
104
        foreach ($schemas as $schema) {
105
            $settings = $this->load($this->convertServiceToNameSpace($schema));
106
            $this->update($settings);
0 ignored issues
show
Bug introduced by
It seems like $settings can also be of type array; however, parameter $settings of Chamilo\SettingsBundle\M...ttingsManager::update() does only seem to accept Sylius\Bundle\SettingsBu...Model\SettingsInterface, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

106
            $this->update(/** @scrutinizer ignore-type */ $settings);
Loading history...
107
        }
108
    }
109
110
    public function installSchemas(AccessUrl $url)
111
    {
112
        $this->url = $url;
113
        $schemas = array_keys($this->getSchemas());
114
115
        /**
116
         * @var string
117
         * @var SchemaInterface $schema
118
         */
119
        foreach ($schemas as $schema) {
120
            $settings = $this->load($this->convertServiceToNameSpace($schema));
121
            $this->save($settings);
0 ignored issues
show
Bug introduced by
It seems like $settings can also be of type array; however, parameter $settings of Chamilo\SettingsBundle\M...SettingsManager::save() does only seem to accept Sylius\Bundle\SettingsBu...Model\SettingsInterface, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

121
            $this->save(/** @scrutinizer ignore-type */ $settings);
Loading history...
122
        }
123
    }
124
125
    /**
126
     * @return array
127
     */
128
    public function getSchemas()
129
    {
130
        return $this->schemaRegistry->all();
131
    }
132
133
    /**
134
     * @param string $category
135
     *
136
     * @return string
137
     */
138
    public function convertNameSpaceToService($category)
139
    {
140
        return 'chamilo_core.settings.'.$category;
141
    }
142
143
    /**
144
     * @param string $category
145
     *
146
     * @return string
147
     */
148
    public function convertServiceToNameSpace($category)
149
    {
150
        return str_replace('chamilo_core.settings.', '', $category);
151
    }
152
153
    /**
154
     * @param string $name
155
     *
156
     * @throws \InvalidArgumentException
157
     */
158
    public function getSetting($name)
159
    {
160
        if (false === strpos($name, '.')) {
161
            //throw new \InvalidArgumentException(sprintf('Parameter must be in format "namespace.name", "%s" given.', $name));
162
163
            // This code allows the possibility of calling
164
            // api_get_setting('allow_skills_tool') instead of
165
            // the "correct" way api_get_setting('platform.allow_skills_tool')
166
            $items = $this->getVariablesAndCategories();
167
168
            if (isset($items[$name])) {
169
                $originalName = $name;
170
                $name = $this->renameVariable($name);
171
                $category = $this->fixCategory(
172
                    strtolower($name),
173
                    strtolower($items[$originalName])
174
                );
175
                $name = $category.'.'.$name;
176
            } else {
177
                throw new \InvalidArgumentException(sprintf('Parameter must be in format "category.name", "%s" given.', $name));
178
            }
179
        }
180
181
        list($category, $name) = explode('.', $name);
182
        $this->loadAll();
183
184
        if (!empty($this->schemaList)) {
185
            $settings = $this->schemaList[$category];
186
187
            return $settings->get($name);
188
        }
189
190
        exit;
0 ignored issues
show
Best Practice introduced by
Using exit here is not recommended.

In general, usage of exit should be done with care and only when running in a scripting context like a CLI script.

Loading history...
191
192
        $settings = $this->load($category, $name);
0 ignored issues
show
Unused Code introduced by
$settings = $this->load($category, $name) is not reachable.

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, die or exit statements that have been added for debug purposes.

function fx() {
    try {
        doSomething();
        return true;
    }
    catch (\Exception $e) {
        return false;
    }

    return false;
}

In the above example, the last return false will never be executed, because a return statement has already been met in every possible execution path.

Loading history...
193
194
        if (!$settings) {
195
            throw new \InvalidArgumentException(sprintf("Parameter '$name' not found in category '$category'"));
196
        }
197
198
        $this->settings = $settings;
199
200
        return $settings->get($name);
201
    }
202
203
    public function loadAll()
204
    {
205
        if (empty($this->schemaList)){
206
            $schemas = array_keys($this->getSchemas());
207
208
            /**
209
             * @var string
210
             * @var SchemaInterface $schema
211
             */
212
            $schemaList = [];
213
            $settingsBuilder = new SettingsBuilder();
214
215
            $all = $this->getAllParametersByCategory();
216
217
            foreach ($schemas as $schema) {
218
                $schemaRegister = $this->schemaRegistry->get($schema);
219
                $schemaRegister->buildSettings($settingsBuilder);
220
                $name = $this->convertServiceToNameSpace($schema);
221
                $settings = new Settings();
222
                //$settings = $this->load($name);
223
                $parameters = $all[$name];
224
                foreach ($settingsBuilder->getTransformers() as $parameter => $transformer) {
225
                    if (array_key_exists($parameter, $parameters)) {
226
                        if ('course_creation_use_template' === $parameter) {
227
                            if (empty($parameters[$parameter])) {
228
                                $parameters[$parameter] = null;
229
                            }
230
                        } else {
231
                            $parameters[$parameter] = $transformer->reverseTransform($parameters[$parameter]);
232
                        }
233
                    }
234
                }
235
236
                $parameters = $settingsBuilder->resolve($parameters);
237
                $settings->setParameters($parameters);
238
239
                $schemaList[$name] = $settings;
240
            }
241
            $this->schemaList = $schemaList;
242
        }
243
    }
244
245
    public function load($schemaAlias, $namespace = null, $ignoreUnknown = true)
246
    {
247
        $schemaAliasNoPrefix = $schemaAlias;
248
        $schemaAlias = 'chamilo_core.settings.'.$schemaAlias;
249
        if ($this->schemaRegistry->has($schemaAlias)) {
250
            /** @var SchemaInterface $schema */
251
            $schema = $this->schemaRegistry->get($schemaAlias);
252
        } else {
253
            return [];
254
        }
255
256
        $settings = new Settings();
257
        $settings->setSchemaAlias($schemaAlias);
258
259
        // We need to get a plain parameters array since we use the options resolver on it
260
        $parameters = $this->getParameters($schemaAliasNoPrefix);
261
        $settingsBuilder = new SettingsBuilder();
262
        $schema->buildSettings($settingsBuilder);
263
264
        // Remove unknown settings' parameters (e.g. From a previous version of the settings schema)
265
        if (true === $ignoreUnknown) {
266
            foreach ($parameters as $name => $value) {
267
                if (!$settingsBuilder->isDefined($name)) {
268
                    unset($parameters[$name]);
269
                }
270
            }
271
        }
272
273
        foreach ($settingsBuilder->getTransformers() as $parameter => $transformer) {
274
            if (array_key_exists($parameter, $parameters)) {
275
                if ('course_creation_use_template' === $parameter) {
276
                    if (empty($parameters[$parameter])) {
277
                        $parameters[$parameter] = null;
278
                    }
279
                } else {
280
                    $parameters[$parameter] = $transformer->reverseTransform($parameters[$parameter]);
281
                }
282
            }
283
        }
284
285
        $parameters = $settingsBuilder->resolve($parameters);
286
        $settings->setParameters($parameters);
287
288
        return $settings;
289
    }
290
291
    /**
292
     * @throws \Doctrine\ORM\ORMException
293
     * @throws \Doctrine\ORM\OptimisticLockException
294
     */
295
    public function update(SettingsInterface $settings)
296
    {
297
        $namespace = $settings->getSchemaAlias();
298
299
        /** @var SchemaInterface $schema */
300
        $schema = $this->schemaRegistry->get($settings->getSchemaAlias());
301
302
        $settingsBuilder = new SettingsBuilder();
303
        $schema->buildSettings($settingsBuilder);
304
        $parameters = $settingsBuilder->resolve($settings->getParameters());
305
        // Transform value. Example array to string using transformer. Example:
306
        // 1. Setting "tool_visible_by_default_at_creation" it's a multiple select
307
        // 2. Is defined as an array in class DocumentSettingsSchema
308
        // 3. Add transformer for that variable "ArrayToIdentifierTransformer"
309
        // 4. Here we recover the transformer and convert the array to string
310
        foreach ($settingsBuilder->getTransformers() as $parameter => $transformer) {
311
            if (array_key_exists($parameter, $parameters)) {
312
                $parameters[$parameter] = $transformer->transform($parameters[$parameter]);
313
            }
314
        }
315
        $settings->setParameters($parameters);
316
        $persistedParameters = $this->repository->findBy(
317
            ['category' => $this->convertServiceToNameSpace($settings->getSchemaAlias())]
318
        );
319
320
        $persistedParametersMap = [];
321
        /** @var SettingsCurrent $parameter */
322
        foreach ($persistedParameters as $parameter) {
323
            $persistedParametersMap[$parameter->getVariable()] = $parameter;
324
        }
325
326
        /** @var SettingsCurrent $url */
327
        $url = $this->getUrl();
328
        $simpleCategoryName = str_replace('chamilo_core.settings.', '', $namespace);
329
330
        foreach ($parameters as $name => $value) {
331
            if (isset($persistedParametersMap[$name])) {
332
                $parameter = $persistedParametersMap[$name];
333
                $parameter->setSelectedValue($value);
334
                $parameter->setCategory($simpleCategoryName);
335
                $this->manager->persist($parameter);
336
            } else {
337
                $parameter = new SettingsCurrent();
338
                $parameter
339
                    ->setVariable($name)
340
                    ->setCategory($simpleCategoryName)
341
                    ->setTitle($name)
342
                    ->setSelectedValue($value)
343
                    ->setUrl($url)
344
                    ->setAccessUrlChangeable(1)
345
                    ->setAccessUrlLocked(1)
346
                ;
347
348
                /** @var ConstraintViolationListInterface $errors */
349
                /*$errors = $this->validator->validate($parameter);
350
                if (0 < $errors->count()) {
351
                    throw new ValidatorException($errors->get(0)->getMessage());
352
                }*/
353
                $this->manager->persist($parameter);
354
            }
355
        }
356
357
        $this->manager->flush();
358
    }
359
360
    /**
361
     * @throws ValidatorException
362
     */
363
    public function save(SettingsInterface $settings)
364
    {
365
        $namespace = $settings->getSchemaAlias();
366
367
        /** @var SchemaInterface $schema */
368
        $schema = $this->schemaRegistry->get($settings->getSchemaAlias());
369
370
        $settingsBuilder = new SettingsBuilder();
371
        $schema->buildSettings($settingsBuilder);
372
        $parameters = $settingsBuilder->resolve($settings->getParameters());
373
        // Transform value. Example array to string using transformer. Example:
374
        // 1. Setting "tool_visible_by_default_at_creation" it's a multiple select
375
        // 2. Is defined as an array in class DocumentSettingsSchema
376
        // 3. Add transformer for that variable "ArrayToIdentifierTransformer"
377
        // 4. Here we recover the transformer and convert the array to string
378
        foreach ($settingsBuilder->getTransformers() as $parameter => $transformer) {
379
            if (array_key_exists($parameter, $parameters)) {
380
                $parameters[$parameter] = $transformer->transform($parameters[$parameter]);
381
            }
382
        }
383
        $settings->setParameters($parameters);
384
        $persistedParameters = $this->repository->findBy(
385
            ['category' => $this->convertServiceToNameSpace($settings->getSchemaAlias())]
386
        );
387
        $persistedParametersMap = [];
388
389
        foreach ($persistedParameters as $parameter) {
390
            $persistedParametersMap[$parameter->getTitle()] = $parameter;
391
        }
392
393
        /** @var SettingsEvent $event */
394
        /*$event = $this->eventDispatcher->dispatch(
395
            SettingsEvent::PRE_SAVE,
396
            new SettingsEvent($settings, $parameters)
397
        );*/
398
399
        /** @var SettingsCurrent $url */
400
        $url = $this->getUrl();
401
        $simpleCategoryName = str_replace('chamilo_core.settings.', '', $namespace);
402
403
        foreach ($parameters as $name => $value) {
404
            if (isset($persistedParametersMap[$name])) {
405
                $parameter = $persistedParametersMap[$name];
406
                $parameter->setSelectedValue($value);
407
            } else {
408
                $parameter = new SettingsCurrent();
409
                $parameter
410
                    ->setVariable($name)
411
                    ->setCategory($simpleCategoryName)
412
                    ->setTitle($name)
413
                    ->setSelectedValue($value)
414
                    ->setUrl($url)
415
                    ->setAccessUrlChangeable(1)
416
                    ->setAccessUrlLocked(1)
417
                ;
418
419
                /** @var ConstraintViolationListInterface $errors */
420
                /*$errors = $this->validator->validate($parameter);
421
                if (0 < $errors->count()) {
422
                    throw new ValidatorException($errors->get(0)->getMessage());
423
                }*/
424
                $this->manager->persist($parameter);
425
            }
426
            $this->manager->persist($parameter);
427
        }
428
429
        $this->manager->flush();
430
431
        return;
432
433
        ////
434
        $schemaAlias = $settings->getSchemaAlias();
0 ignored issues
show
Unused Code introduced by
$schemaAlias = $settings->getSchemaAlias() is not reachable.

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, die or exit statements that have been added for debug purposes.

function fx() {
    try {
        doSomething();
        return true;
    }
    catch (\Exception $e) {
        return false;
    }

    return false;
}

In the above example, the last return false will never be executed, because a return statement has already been met in every possible execution path.

Loading history...
435
        $schemaAliasChamilo = str_replace('chamilo_core.settings.', '', $schemaAlias);
436
437
        $schema = $this->schemaRegistry->get($schemaAlias);
438
439
        $settingsBuilder = new SettingsBuilder();
440
        $schema->buildSettings($settingsBuilder);
441
442
        $parameters = $settingsBuilder->resolve($settings->getParameters());
443
444
        foreach ($settingsBuilder->getTransformers() as $parameter => $transformer) {
445
            if (array_key_exists($parameter, $parameters)) {
446
                $parameters[$parameter] = $transformer->transform($parameters[$parameter]);
447
            }
448
        }
449
450
        /** @var \Sylius\Bundle\SettingsBundle\Event\SettingsEvent $event */
451
        $event = $this->eventDispatcher->dispatch(
452
            SettingsEvent::PRE_SAVE,
453
            new SettingsEvent($settings)
454
        );
455
456
        /** @var SettingsCurrent $url */
457
        $url = $event->getSettings()->getAccessUrl();
458
459
        foreach ($parameters as $name => $value) {
460
            if (isset($persistedParametersMap[$name])) {
461
                if ($value instanceof Course) {
462
                    $value = $value->getId();
463
                }
464
                $persistedParametersMap[$name]->setValue($value);
465
            } else {
466
                $setting = new Settings();
467
                $setting->setSchemaAlias($schemaAlias);
468
469
                $setting
470
                    ->setNamespace($schemaAliasChamilo)
471
                    ->setName($name)
472
                    ->setValue($value)
473
                    ->setUrl($url)
474
                    ->setAccessUrlLocked(0)
475
                    ->setAccessUrlChangeable(1)
476
                ;
477
478
                /** @var ConstraintViolationListInterface $errors */
479
                /*$errors = $this->->validate($parameter);
480
                if (0 < $errors->count()) {
481
                    throw new ValidatorException($errors->get(0)->getMessage());
482
                }*/
483
                $this->manager->persist($setting);
484
                $this->manager->flush();
485
            }
486
        }
487
        /*$parameters = $settingsBuilder->resolve($settings->getParameters());
488
        $settings->setParameters($parameters);
489
490
        $this->eventDispatcher->dispatch(SettingsEvent::PRE_SAVE, new SettingsEvent($settings));
491
492
        $this->manager->persist($settings);
493
        $this->manager->flush();
494
495
        $this->eventDispatcher->dispatch(SettingsEvent::POST_SAVE, new SettingsEvent($settings));*/
496
    }
497
498
    /**
499
     * @param string $keyword
500
     *
501
     * @return array
502
     */
503
    public function getParametersFromKeywordOrderedByCategory($keyword)
504
    {
505
        $query = $this->repository->createQueryBuilder('s')
506
            ->where('s.variable LIKE :keyword')
507
            ->setParameter('keyword', "%$keyword%")
508
        ;
509
        $parametersFromDb = $query->getQuery()->getResult();
510
        $parameters = [];
511
        /** @var SettingsCurrent $parameter */
512
        foreach ($parametersFromDb as $parameter) {
513
            $parameters[$parameter->getCategory()][] = $parameter;
514
        }
515
516
        return $parameters;
517
    }
518
519
    /**
520
     * @param string $namespace
521
     * @param string $keyword
522
     * @param bool   $returnObjects
523
     *
524
     * @return array
525
     */
526
    public function getParametersFromKeyword($namespace, $keyword = '', $returnObjects = false)
527
    {
528
        if (empty($keyword)) {
529
            $criteria = ['category' => $namespace];
530
            $parametersFromDb = $this->repository->findBy($criteria);
531
        } else {
532
            $query = $this->repository->createQueryBuilder('s')
533
                ->where('s.variable LIKE :keyword')
534
                ->setParameter('keyword', "%$keyword%")
535
            ;
536
            $parametersFromDb = $query->getQuery()->getResult();
537
        }
538
539
        if ($returnObjects) {
540
            return $parametersFromDb;
541
        }
542
        $parameters = [];
543
        /** @var SettingsCurrent $parameter */
544
        foreach ($parametersFromDb as $parameter) {
545
            $parameters[$parameter->getVariable()] = $parameter->getSelectedValue();
546
        }
547
548
        return $parameters;
549
    }
550
551
    /**
552
     * Load parameter from database.
553
     *
554
     * @param string $namespace
555
     *
556
     * @return array
557
     */
558
    private function getParameters($namespace)
559
    {
560
        $parameters = [];
561
        /** @var SettingsCurrent $parameter */
562
        foreach ($this->repository->findBy(['category' => $namespace]) as $parameter) {
563
            $parameters[$parameter->getVariable()] = $parameter->getSelectedValue();
564
        }
565
566
        return $parameters;
567
    }
568
569
    private function getAllParametersByCategory()
570
    {
571
        $parameters = [];
572
        $all = $this->repository->findAll();
573
        /** @var SettingsCurrent $parameter */
574
        foreach ($all as $parameter) {
575
            $parameters[$parameter->getCategory()][$parameter->getVariable()] = $parameter->getSelectedValue();
576
        }
577
578
        return $parameters;
579
    }
580
581
582
    /*private function transformParameters(SettingsBuilder $settingsBuilder, array $parameters)
583
    {
584
        $transformedParameters = $parameters;
585
586
        foreach ($settingsBuilder->getTransformers() as $parameter => $transformer) {
587
            if (array_key_exists($parameter, $parameters)) {
588
                $transformedParameters[$parameter] = $transformer->reverseTransform($parameters[$parameter]);
589
            }
590
        }
591
592
        return $transformedParameters;
593
    }*/
594
595
    /**
596
     * Get variables and categories as in 1.11.x.
597
     *
598
     * @return array
599
     */
600
    private function getVariablesAndCategories()
601
    {
602
        return [
603
            'Institution' => 'Platform',
604
            'InstitutionUrl' => 'Platform',
605
            'siteName' => 'Platform',
606
            'emailAdministrator' => 'admin', //'emailAdministrator' => 'Platform',
607
            'administratorSurname' => 'admin',
608
            'administratorTelephone' => 'admin',
609
            'administratorName' => 'admin',
610
            'show_administrator_data' => 'Platform',
611
            'show_tutor_data' => 'Session',
612
            'show_teacher_data' => 'Platform',
613
            'homepage_view' => 'Course',
614
            'show_toolshortcuts' => 'Course',
615
            'allow_group_categories' => 'Course',
616
            'server_type' => 'Platform',
617
            'platformLanguage' => 'Language',
618
            'showonline' => 'Platform',
619
            'profile' => 'User',
620
            'default_document_quotum' => 'Course',
621
            'registration' => 'User',
622
            'default_group_quotum' => 'Course',
623
            'allow_registration' => 'Platform',
624
            'allow_registration_as_teacher' => 'Platform',
625
            'allow_lostpassword' => 'Platform',
626
            'allow_user_headings' => 'Course',
627
            'allow_personal_agenda' => 'agenda',
628
            'display_coursecode_in_courselist' => 'Platform',
629
            'display_teacher_in_courselist' => 'Platform',
630
            'permanently_remove_deleted_files' => 'Tools',
631
            'dropbox_allow_overwrite' => 'Tools',
632
            'dropbox_max_filesize' => 'Tools',
633
            'dropbox_allow_just_upload' => 'Tools',
634
            'dropbox_allow_student_to_student' => 'Tools',
635
            'dropbox_allow_group' => 'Tools',
636
            'dropbox_allow_mailing' => 'Tools',
637
            'extended_profile' => 'User',
638
            'student_view_enabled' => 'Platform',
639
            'show_navigation_menu' => 'Course',
640
            'enable_tool_introduction' => 'course',
641
            'page_after_login' => 'Platform',
642
            'time_limit_whosonline' => 'Platform',
643
            'breadcrumbs_course_homepage' => 'Course',
644
            'example_material_course_creation' => 'Platform',
645
            'account_valid_duration' => 'Platform',
646
            'use_session_mode' => 'Session',
647
            'allow_email_editor' => 'Tools',
648
            //'registered' => null',
649
            //'donotlistcampus' =>'null',
650
            'show_email_addresses' => 'Platform',
651
            'service_ppt2lp' => 'NULL',
652
            'stylesheets' => 'stylesheets',
653
            'upload_extensions_list_type' => 'Security',
654
            'upload_extensions_blacklist' => 'Security',
655
            'upload_extensions_whitelist' => 'Security',
656
            'upload_extensions_skip' => 'Security',
657
            'upload_extensions_replace_by' => 'Security',
658
            'show_number_of_courses' => 'Platform',
659
            'show_empty_course_categories' => 'Platform',
660
            'show_back_link_on_top_of_tree' => 'Platform',
661
            'show_different_course_language' => 'Platform',
662
            'split_users_upload_directory' => 'Tuning',
663
            'hide_dltt_markup' => 'Languages',
664
            'display_categories_on_homepage' => 'Platform',
665
            'permissions_for_new_directories' => 'Security',
666
            'permissions_for_new_files' => 'Security',
667
            'show_tabs' => 'Platform',
668
            'default_forum_view' => 'Course',
669
            'platform_charset' => 'Languages',
670
            'noreply_email_address' => 'Platform',
671
            'survey_email_sender_noreply' => 'Course',
672
            'gradebook_enable' => 'Gradebook',
673
            'gradebook_score_display_coloring' => 'Gradebook',
674
            'gradebook_score_display_custom' => 'Gradebook',
675
            'gradebook_score_display_colorsplit' => 'Gradebook',
676
            'gradebook_score_display_upperlimit' => 'Gradebook',
677
            'gradebook_number_decimals' => 'Gradebook',
678
            'user_selected_theme' => 'Platform',
679
            'allow_course_theme' => 'Course',
680
            'show_closed_courses' => 'Platform',
681
            'extendedprofile_registration' => 'User',
682
            'extendedprofile_registrationrequired' => 'User',
683
            'add_users_by_coach' => 'Session',
684
            'extend_rights_for_coach' => 'Security',
685
            'extend_rights_for_coach_on_survey' => 'Security',
686
            'course_create_active_tools' => 'Tools',
687
            'show_session_coach' => 'Session',
688
            'allow_users_to_create_courses' => 'Platform',
689
            'allow_message_tool' => 'Tools',
690
            'allow_social_tool' => 'Tools',
691
            'allow_students_to_browse_courses' => 'Platform',
692
            'show_session_data' => 'Session',
693
            'allow_use_sub_language' => 'language',
694
            'show_glossary_in_documents' => 'Course',
695
            'allow_terms_conditions' => 'Platform',
696
            'search_enabled' => 'Search',
697
            'search_prefilter_prefix' => 'Search',
698
            'search_show_unlinked_results' => 'Search',
699
            'show_courses_descriptions_in_catalog' => 'Course',
700
            'allow_coach_to_edit_course_session' => 'Session',
701
            'show_glossary_in_extra_tools' => 'Course',
702
            'send_email_to_admin_when_create_course' => 'Platform',
703
            'go_to_course_after_login' => 'Course',
704
            'math_asciimathML' => 'Editor',
705
            'enabled_asciisvg' => 'Editor',
706
            'include_asciimathml_script' => 'Editor',
707
            'youtube_for_students' => 'Editor',
708
            'block_copy_paste_for_students' => 'Editor',
709
            'more_buttons_maximized_mode' => 'Editor',
710
            'students_download_folders' => 'Document',
711
            'users_copy_files' => 'Tools',
712
            'allow_students_to_create_groups_in_social' => 'Tools',
713
            'allow_send_message_to_all_platform_users' => 'Message',
714
            'message_max_upload_filesize' => 'Tools',
715
            'use_users_timezone' => 'profile', //'use_users_timezone' => 'Timezones',
716
            'timezone_value' => 'platform', //'timezone_value' => 'Timezones',
717
            'allow_user_course_subscription_by_course_admin' => 'Security',
718
            'show_link_bug_notification' => 'Platform',
719
            'show_link_ticket_notification' => 'Platform',
720
            'course_validation' => 'course', //'course_validation' => 'Platform',
721
            'course_validation_terms_and_conditions_url' => 'Platform',
722
            'enabled_wiris' => 'Editor',
723
            'allow_spellcheck' => 'Editor',
724
            'force_wiki_paste_as_plain_text' => 'Editor',
725
            'enabled_googlemaps' => 'Editor',
726
            'enabled_imgmap' => 'Editor',
727
            'enabled_support_svg' => 'Tools',
728
            'pdf_export_watermark_enable' => 'Platform',
729
            'pdf_export_watermark_by_course' => 'Platform',
730
            'pdf_export_watermark_text' => 'Platform',
731
            'enabled_insertHtml' => 'Editor',
732
            'students_export2pdf' => 'Document',
733
            'exercise_min_score' => 'Course',
734
            'exercise_max_score' => 'Course',
735
            'show_users_folders' => 'Tools',
736
            'show_default_folders' => 'Tools',
737
            'show_chat_folder' => 'Tools',
738
            'enabled_text2audio' => 'Tools',
739
            'course_hide_tools' => 'Course',
740
            'enabled_support_pixlr' => 'Tools',
741
            'show_groups_to_users' => 'Session',
742
            'accessibility_font_resize' => 'Platform',
743
            'hide_courses_in_sessions' => 'Session',
744
            'enable_quiz_scenario' => 'Course',
745
            'filter_terms' => 'Security',
746
            'header_extra_content' => 'Tracking',
747
            'footer_extra_content' => 'Tracking',
748
            'show_documents_preview' => 'Tools',
749
            'htmlpurifier_wiki' => 'Editor',
750
            'cas_activate' => 'CAS',
751
            'cas_server' => 'CAS',
752
            'cas_server_uri' => 'CAS',
753
            'cas_port' => 'CAS',
754
            'cas_protocol' => 'CAS',
755
            'cas_add_user_activate' => 'CAS',
756
            'update_user_info_cas_with_ldap' => 'CAS',
757
            'student_page_after_login' => 'Platform',
758
            'teacher_page_after_login' => 'Platform',
759
            'drh_page_after_login' => 'Platform',
760
            'sessionadmin_page_after_login' => 'Session',
761
            'student_autosubscribe' => 'Platform',
762
            'teacher_autosubscribe' => 'Platform',
763
            'drh_autosubscribe' => 'Platform',
764
            'sessionadmin_autosubscribe' => 'Session',
765
            'scorm_cumulative_session_time' => 'Course',
766
            'allow_hr_skills_management' => 'Gradebook',
767
            'enable_help_link' => 'Platform',
768
            'teachers_can_change_score_settings' => 'Gradebook',
769
            'allow_users_to_change_email_with_no_password' => 'User',
770
            'show_admin_toolbar' => 'display',
771
            'allow_global_chat' => 'Platform',
772
            'languagePriority1' => 'language',
773
            'languagePriority2' => 'language',
774
            'languagePriority3' => 'language',
775
            'languagePriority4' => 'language',
776
            'login_is_email' => 'Platform',
777
            'courses_default_creation_visibility' => 'Course',
778
            'gradebook_enable_grade_model' => 'Gradebook',
779
            'teachers_can_change_grade_model_settings' => 'Gradebook',
780
            'gradebook_default_weight' => 'Gradebook',
781
            'ldap_description' => 'LDAP',
782
            'shibboleth_description' => 'Shibboleth',
783
            'facebook_description' => 'Facebook',
784
            'gradebook_locking_enabled' => 'Gradebook',
785
            'gradebook_default_grade_model_id' => 'Gradebook',
786
            'allow_session_admins_to_manage_all_sessions' => 'Session',
787
            'allow_skills_tool' => 'Platform',
788
            'allow_public_certificates' => 'Course',
789
            'platform_unsubscribe_allowed' => 'Platform',
790
            'enable_iframe_inclusion' => 'Editor',
791
            'show_hot_courses' => 'Platform',
792
            'enable_webcam_clip' => 'Tools',
793
            'use_custom_pages' => 'Platform',
794
            'tool_visible_by_default_at_creation' => 'Tools',
795
            'prevent_session_admins_to_manage_all_users' => 'Session',
796
            'documents_default_visibility_defined_in_course' => 'Tools',
797
            'enabled_mathjax' => 'Editor',
798
            'meta_twitter_site' => 'Tracking',
799
            'meta_twitter_creator' => 'Tracking',
800
            'meta_title' => 'Tracking',
801
            'meta_description' => 'Tracking',
802
            'meta_image_path' => 'Tracking',
803
            'allow_teachers_to_create_sessions' => 'Session',
804
            'institution_address' => 'Platform',
805
            'chamilo_database_version' => 'null',
806
            'cron_remind_course_finished_activate' => 'Crons',
807
            'cron_remind_course_expiration_frequency' => 'Crons',
808
            'cron_remind_course_expiration_activate' => 'Crons',
809
            'allow_coach_feedback_exercises' => 'Session',
810
            'allow_my_files' => 'Platform',
811
            'ticket_allow_student_add' => 'Ticket',
812
            'ticket_send_warning_to_all_admins' => 'Ticket',
813
            'ticket_warn_admin_no_user_in_category' => 'Ticket',
814
            'ticket_allow_category_edition' => 'Ticket',
815
            'load_term_conditions_section' => 'Platform',
816
            'show_terms_if_profile_completed' => 'Ticket',
817
            'hide_home_top_when_connected' => 'Platform',
818
            'hide_global_announcements_when_not_connected' => 'Platform',
819
            'course_creation_use_template' => 'Course',
820
            'allow_strength_pass_checker' => 'Security',
821
            'allow_captcha' => 'Security',
822
            'captcha_number_mistakes_to_block_account' => 'Security',
823
            'captcha_time_to_block' => 'Security',
824
            'drh_can_access_all_session_content' => 'Session',
825
            'display_groups_forum_in_general_tool' => 'Tools',
826
            'allow_tutors_to_assign_students_to_session' => 'Session',
827
            'allow_lp_return_link' => 'Course',
828
            'hide_scorm_export_link' => 'Course',
829
            'hide_scorm_copy_link' => 'Course',
830
            'hide_scorm_pdf_link' => 'Course',
831
            'session_days_before_coach_access' => 'Session',
832
            'session_days_after_coach_access' => 'Session',
833
            'pdf_logo_header' => 'Course',
834
            'order_user_list_by_official_code' => 'Platform',
835
            'email_alert_manager_on_new_quiz' => 'exercise',
836
            'show_official_code_exercise_result_list' => 'Tools',
837
            'course_catalog_hide_private' => 'Platform',
838
            'catalog_show_courses_sessions' => 'Platform',
839
            'auto_detect_language_custom_pages' => 'Platform',
840
            'lp_show_reduced_report' => 'Course',
841
            'allow_session_course_copy_for_teachers' => 'Session',
842
            'hide_logout_button' => 'Platform',
843
            'redirect_admin_to_courses_list' => 'Platform',
844
            'course_images_in_courses_list' => 'Course',
845
            'student_publication_to_take_in_gradebook' => 'Gradebook',
846
            'certificate_filter_by_official_code' => 'Gradebook',
847
            'exercise_max_ckeditors_in_page' => 'Tools',
848
            'document_if_file_exists_option' => 'Tools',
849
            'add_gradebook_certificates_cron_task_enabled' => 'Gradebook',
850
            'openbadges_backpack' => 'Gradebook',
851
            'cookie_warning' => 'Tools',
852
            'hide_course_group_if_no_tools_available' => 'Tools',
853
            'catalog_allow_session_auto_subscription' => 'Session',
854
            'registration.soap.php.decode_utf8' => 'Platform',
855
            'allow_delete_attendance' => 'Tools',
856
            'gravatar_enabled' => 'Platform',
857
            'gravatar_type' => 'Platform',
858
            'limit_session_admin_role' => 'Session',
859
            'show_session_description' => 'Session',
860
            'hide_certificate_export_link_students' => 'Gradebook',
861
            'hide_certificate_export_link' => 'Gradebook',
862
            'dropbox_hide_course_coach' => 'Tools',
863
            'dropbox_hide_general_coach' => 'Tools',
864
            'session_course_ordering' => 'Session',
865
            'gamification_mode' => 'Platform',
866
            'prevent_multiple_simultaneous_login' => 'Security',
867
            'gradebook_detailed_admin_view' => 'Gradebook',
868
            'course_catalog_published' => 'Course',
869
            'user_reset_password' => 'Security',
870
            'user_reset_password_token_limit' => 'Security',
871
            'my_courses_view_by_session' => 'Session',
872
            'show_full_skill_name_on_skill_wheel' => 'Platform',
873
            'messaging_allow_send_push_notification' => 'WebServices',
874
            'messaging_gdc_project_number' => 'WebServices',
875
            'messaging_gdc_api_key' => 'WebServices',
876
            'teacher_can_select_course_template' => 'Course',
877
            'enable_record_audio' => 'Tools',
878
            'allow_show_skype_account' => 'Platform',
879
            'allow_show_linkedin_url' => 'Platform',
880
            'enable_profile_user_address_geolocalization' => 'User',
881
            'show_official_code_whoisonline' => 'Profile',
882
            'icons_mode_svg' => 'display',
883
            'user_name_order' => 'display',
884
            'user_name_sort_by' => 'display',
885
            'default_calendar_view' => 'agenda',
886
            'exercise_invisible_in_session' => 'exercise',
887
            'configure_exercise_visibility_in_course' => 'exercise',
888
            'allow_download_documents_by_api_key' => 'Webservices',
889
            'ProfilingFilterAddingUsers' => 'profile',
890
            'donotlistcampus' => 'platform',
891
            'gradebook_show_percentage_in_reports' => 'gradebook',
892
            'course_creation_splash_screen' => 'Course',
893
        ];
894
    }
895
896
    /**
897
     * Rename old variable with variable used in Chamilo 2.0.
898
     *
899
     * @param string $variable
900
     */
901
    private function renameVariable($variable)
902
    {
903
        $list = [
904
            'timezone_value' => 'timezone',
905
            'Institution' => 'institution',
906
            'SiteName' => 'site_name',
907
            'siteName' => 'site_name',
908
            'InstitutionUrl' => 'institution_url',
909
            'registration' => 'required_profile_fields',
910
            'stylesheets' => 'theme',
911
            'platformLanguage' => 'platform_language',
912
            'languagePriority1' => 'language_priority_1',
913
            'languagePriority2' => 'language_priority_2',
914
            'languagePriority3' => 'language_priority_3',
915
            'languagePriority4' => 'language_priority_4',
916
            'gradebook_score_display_coloring' => 'my_display_coloring',
917
            'document_if_file_exists_option' => 'if_file_exists_option',
918
            'ProfilingFilterAddingUsers' => 'profiling_filter_adding_users',
919
            'course_create_active_tools' => 'active_tools_on_create',
920
            'emailAdministrator' => 'administrator_email',
921
            'administratorSurname' => 'administrator_surname',
922
            'administratorName' => 'administrator_name',
923
            'administratorTelephone' => 'administrator_phone',
924
            'registration.soap.php.decode_utf8' => 'decode_utf8',
925
            'profile' => 'changeable_options',
926
        ];
927
928
        return $list[$variable] ?? $variable;
929
    }
930
931
    /**
932
     * Replace old Chamilo 1.x category with 2.0 version.
933
     *
934
     * @param string $variable
935
     * @param string $defaultCategory
936
     */
937
    private function fixCategory($variable, $defaultCategory)
938
    {
939
        $settings = [
940
            'cookie_warning' => 'platform',
941
            'donotlistcampus' => 'platform',
942
            'administrator_email' => 'admin',
943
            'administrator_surname' => 'admin',
944
            'administrator_name' => 'admin',
945
            'administrator_phone' => 'admin',
946
            'exercise_max_ckeditors_in_page' => 'exercise',
947
            'allow_hr_skills_management' => 'skill',
948
            'accessibility_font_resize' => 'display',
949
            'account_valid_duration' => 'profile',
950
            'allow_global_chat' => 'chat',
951
            'allow_lostpassword' => 'registration',
952
            'allow_registration' => 'registration',
953
            'allow_registration_as_teacher' => 'registration',
954
            'required_profile_fields' => 'registration',
955
            'allow_skills_tool' => 'skill',
956
            'allow_students_to_browse_courses' => 'display',
957
            'allow_terms_conditions' => 'registration',
958
            'allow_users_to_create_courses' => 'course',
959
            'auto_detect_language_custom_pages' => 'language',
960
            'platform_language' => 'language',
961
            'course_validation' => 'course',
962
            'course_validation_terms_and_conditions_url' => 'course',
963
            'display_categories_on_homepage' => 'display',
964
            'display_coursecode_in_courselist' => 'course',
965
            'display_teacher_in_courselist' => 'course',
966
            'drh_autosubscribe' => 'registration',
967
            'drh_page_after_login' => 'registration',
968
            'enable_help_link' => 'display',
969
            'example_material_course_creation' => 'course',
970
            'login_is_email' => 'profile',
971
            'noreply_email_address' => 'mail',
972
            'page_after_login' => 'registration',
973
            'pdf_export_watermark_by_course' => 'document',
974
            'pdf_export_watermark_enable' => 'document',
975
            'pdf_export_watermark_text' => 'document',
976
            'platform_unsubscribe_allowed' => 'registration',
977
            'send_email_to_admin_when_create_course' => 'course',
978
            'show_admin_toolbar' => 'display',
979
            'show_administrator_data' => 'display',
980
            'show_back_link_on_top_of_tree' => 'display',
981
            'show_closed_courses' => 'display',
982
            'show_different_course_language' => 'display',
983
            'show_email_addresses' => 'display',
984
            'show_empty_course_categories' => 'display',
985
            'show_full_skill_name_on_skill_wheel' => 'skill',
986
            'show_hot_courses' => 'display',
987
            'show_link_bug_notification' => 'display',
988
            'show_number_of_courses' => 'display',
989
            'show_teacher_data' => 'display',
990
            'showonline' => 'display',
991
            'student_autosubscribe' => 'registration',
992
            'student_page_after_login' => 'registration',
993
            'student_view_enabled' => 'course',
994
            'teacher_autosubscribe' => 'registration',
995
            'teacher_page_after_login' => 'registration',
996
            'time_limit_whosonline' => 'display',
997
            'user_selected_theme' => 'profile',
998
            'hide_global_announcements_when_not_connected' => 'announcement',
999
            'hide_home_top_when_connected' => 'display',
1000
            'hide_logout_button' => 'display',
1001
            'institution_address' => 'platform',
1002
            'redirect_admin_to_courses_list' => 'admin',
1003
            'use_custom_pages' => 'platform',
1004
            'allow_group_categories' => 'group',
1005
            'allow_user_headings' => 'display',
1006
            'default_document_quotum' => 'document',
1007
            'default_forum_view' => 'forum',
1008
            'default_group_quotum' => 'document',
1009
            'enable_quiz_scenario' => 'exercise',
1010
            'exercise_max_score' => 'exercise',
1011
            'exercise_min_score' => 'exercise',
1012
            'pdf_logo_header' => 'platform',
1013
            'show_glossary_in_documents' => 'document',
1014
            'show_glossary_in_extra_tools' => 'glossary',
1015
            'survey_email_sender_noreply' => 'survey',
1016
            'allow_coach_feedback_exercises' => 'exercise',
1017
            'sessionadmin_autosubscribe' => 'registration',
1018
            'sessionadmin_page_after_login' => 'registration',
1019
            'show_tutor_data' => 'display',
1020
            'allow_social_tool' => 'social',
1021
            'allow_message_tool' => 'message',
1022
            'allow_email_editor' => 'editor',
1023
            'show_link_ticket_notification' => 'display',
1024
            'permissions_for_new_directories' => 'document',
1025
            'enable_profile_user_address_geolocalization' => 'profile',
1026
            'allow_show_skype_account' => 'profile',
1027
            'allow_show_linkedin_url' => 'profile',
1028
            'allow_students_to_create_groups_in_social' => 'social',
1029
            'default_calendar_view' => 'agenda',
1030
            'documents_default_visibility_defined_in_course' => 'document',
1031
            'message_max_upload_filesize' => 'message',
1032
            'course_create_active_tools' => 'course',
1033
            'tool_visible_by_default_at_creation' => 'document',
1034
            'show_users_folders' => 'document',
1035
            'show_default_folders' => 'document',
1036
            'show_chat_folder' => 'chat',
1037
            'enabled_support_svg' => 'editor',
1038
            'enabled_support_pixlr' => 'editor',
1039
            'enable_webcam_clip' => 'document',
1040
            'enable_record_audio' => 'course',
1041
            'enabled_text2audio' => 'document',
1042
            'permanently_remove_deleted_files' => 'document',
1043
            'allow_delete_attendance' => 'attendance',
1044
            'display_groups_forum_in_general_tool' => 'forum',
1045
            'dropbox_allow_overwrite' => 'dropbox',
1046
            'allow_user_course_subscription_by_course_admin' => 'course',
1047
            'hide_course_group_if_no_tools_available' => 'group',
1048
            'extend_rights_for_coach_on_survey' => 'survey',
1049
            'show_official_code_exercise_result_list' => 'exercise',
1050
            'dropbox_max_filesize' => 'dropbox',
1051
            'dropbox_allow_just_upload' => 'dropbox',
1052
            'dropbox_allow_student_to_student' => 'dropbox',
1053
            'dropbox_allow_group' => 'dropbox',
1054
            'dropbox_allow_mailing' => 'dropbox',
1055
            'upload_extensions_list_type' => 'document',
1056
            'upload_extensions_blacklist' => 'document',
1057
            'upload_extensions_skip' => 'document',
1058
            'changeable_options' => 'profile',
1059
            'users_copy_files' => 'document',
1060
            'if_file_exists_option' => 'document',
1061
            'permissions_for_new_files' => 'document',
1062
            'extended_profile' => 'profile',
1063
            'split_users_upload_directory' => 'profile',
1064
            'show_documents_preview' => 'document',
1065
            'decode_utf8' => 'webservice',
1066
            'messaging_allow_send_push_notification' => 'webservice',
1067
            'messaging_gdc_project_number' => 'webservice',
1068
            'messaging_gdc_api_key' => 'webservice',
1069
            'allow_download_documents_by_api_key' => 'webservice',
1070
            'profiling_filter_adding_users' => 'profile',
1071
            'hide_dltt_markup' => 'language',
1072
            'active_tools_on_create' => 'course',
1073
        ];
1074
1075
        return isset($settings[$variable]) ? $settings[$variable] : $defaultCategory;
1076
    }
1077
}
1078