Passed
Push — master ( 783e3e...6b0899 )
by Julito
14:59
created

SettingsManager::getUrl()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 1
nc 1
nop 0
dl 0
loc 3
rs 10
c 0
b 0
f 0
1
<?php
2
3
/* For licensing terms, see /license.txt */
4
5
namespace Chamilo\CoreBundle\Settings;
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\Registry\ServiceRegistryInterface;
17
use Sylius\Bundle\SettingsBundle\Schema\SchemaInterface;
18
use Sylius\Bundle\SettingsBundle\Schema\SettingsBuilder;
19
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
20
use Symfony\Component\HttpFoundation\RequestStack;
21
use Symfony\Component\Validator\ConstraintViolationListInterface;
22
use Symfony\Component\Validator\Exception\ValidatorException;
23
24
/**
25
 * Handles the platform settings.
26
 */
27
class SettingsManager implements SettingsManagerInterface
28
{
29
    protected $url;
30
31
    /**
32
     * @var ServiceRegistryInterface
33
     */
34
    protected $schemaRegistry;
35
36
    /**
37
     * @var EntityManager
38
     */
39
    protected $manager;
40
41
    /**
42
     * @var EntityRepository
43
     */
44
    protected $repository;
45
46
    /**
47
     * @var EventDispatcherInterface
48
     */
49
    protected $eventDispatcher;
50
51
    /**
52
     * Runtime cache for resolved parameters.
53
     *
54
     * @var Settings[]
55
     */
56
    protected $resolvedSettings = [];
57
    protected $settings;
58
    protected $schemaList;
59
    protected $request;
60
61
    /**
62
     * SettingsManager constructor.
63
     *
64
     * @param $eventDispatcher
65
     */
66
    public function __construct(
67
        ServiceRegistryInterface $schemaRegistry,
68
        EntityManager $manager,
69
        EntityRepository $repository,
70
        EventDispatcherInterface $eventDispatcher,
71
        RequestStack $request
72
    ) {
73
        $this->schemaRegistry = $schemaRegistry;
74
        $this->manager = $manager;
75
        $this->repository = $repository;
76
        $this->eventDispatcher = $eventDispatcher;
77
        $this->request = $request;
78
        $this->schemaList = [];
79
    }
80
81
    /**
82
     * @return AccessUrl
83
     */
84
    public function getUrl()
85
    {
86
        return $this->url;
87
    }
88
89
    public function setUrl(AccessUrl $url)
90
    {
91
        $this->url = $url;
92
    }
93
94
    public function updateSchemas(AccessUrl $url)
95
    {
96
        $this->url = $url;
97
        $schemas = array_keys($this->getSchemas());
98
99
        /**
100
         * @var string
101
         * @var SchemaInterface $schema
102
         */
103
        foreach ($schemas as $schema) {
104
            $settings = $this->load($this->convertServiceToNameSpace($schema));
105
            $this->update($settings);
106
        }
107
    }
108
109
    public function installSchemas(AccessUrl $url)
110
    {
111
        $this->url = $url;
112
        $schemas = array_keys($this->getSchemas());
113
114
        /**
115
         * @var string
116
         * @var SchemaInterface $schema
117
         */
118
        foreach ($schemas as $schema) {
119
            $settings = $this->load($this->convertServiceToNameSpace($schema));
120
            $this->save($settings);
121
        }
122
    }
123
124
    /**
125
     * @return array
126
     */
127
    public function getSchemas()
128
    {
129
        return $this->schemaRegistry->all();
130
    }
131
132
    /**
133
     * @param string $category
134
     *
135
     * @return string
136
     */
137
    public function convertNameSpaceToService($category)
138
    {
139
        return 'chamilo_core.settings.'.$category;
140
    }
141
142
    /**
143
     * @param string $category
144
     *
145
     * @return string
146
     */
147
    public function convertServiceToNameSpace($category)
148
    {
149
        return str_replace('chamilo_core.settings.', '', $category);
150
    }
151
152
    /**
153
     * @param string $name
154
     *
155
     * @throws \InvalidArgumentException
156
     */
157
    public function getSetting($name)
158
    {
159
        if (false === strpos($name, '.')) {
160
            //throw new \InvalidArgumentException(sprintf('Parameter must be in format "namespace.name", "%s" given.', $name));
161
162
            // This code allows the possibility of calling
163
            // api_get_setting('allow_skills_tool') instead of
164
            // the "correct" way api_get_setting('platform.allow_skills_tool')
165
            $items = $this->getVariablesAndCategories();
166
167
            if (isset($items[$name])) {
168
                $originalName = $name;
169
                $name = $this->renameVariable($name);
170
                $category = $this->fixCategory(
171
                    strtolower($name),
172
                    strtolower($items[$originalName])
173
                );
174
                $name = $category.'.'.$name;
175
            } else {
176
                throw new \InvalidArgumentException(sprintf('Parameter must be in format "category.name", "%s" given.', $name));
177
            }
178
        }
179
180
        list($category, $name) = explode('.', $name);
181
        $this->loadAll();
182
183
        if (!empty($this->schemaList)) {
184
            $settings = $this->schemaList[$category];
185
186
            return $settings->get($name);
187
        }
188
189
        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...
190
191
        $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...
192
193
        if (!$settings) {
194
            throw new \InvalidArgumentException(sprintf("Parameter '$name' not found in category '$category'"));
195
        }
196
197
        $this->settings = $settings;
198
199
        return $settings->get($name);
200
    }
201
202
    public function loadAll()
203
    {
204
        $loadFromSession = true;
205
206
        if ($loadFromSession && $this->request->getCurrentRequest()) {
207
            $session = $this->request->getCurrentRequest()->getSession();
208
            $schemaList = $session->get('schemas');
209
            $this->schemaList = $schemaList;
210
        }
211
212
        if (empty($this->schemaList)) {
213
            $schemas = array_keys($this->getSchemas());
214
            $schemaList = [];
215
            $settingsBuilder = new SettingsBuilder();
216
            $all = $this->getAllParametersByCategory();
217
            /** @var SchemaInterface $schema */
218
            foreach ($schemas as $schema) {
219
                $schemaRegister = $this->schemaRegistry->get($schema);
220
                $schemaRegister->buildSettings($settingsBuilder);
221
                $name = $this->convertServiceToNameSpace($schema);
222
                $settings = new Settings();
223
                $parameters = isset($all[$name]) ? $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
                $parameters = $settingsBuilder->resolve($parameters);
236
                $settings->setParameters($parameters);
237
                $schemaList[$name] = $settings;
238
            }
239
            $this->schemaList = $schemaList;
240
            if ($loadFromSession && $this->request->getCurrentRequest()) {
241
                $session->set('schemas', $schemaList);
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable $session does not seem to be defined for all execution paths leading up to this point.
Loading history...
242
            }
243
        }
244
    }
245
246
    public function load($schemaAlias, $namespace = null, $ignoreUnknown = true)
247
    {
248
        $schemaAliasNoPrefix = $schemaAlias;
249
        $schemaAlias = 'chamilo_core.settings.'.$schemaAlias;
250
        if ($this->schemaRegistry->has($schemaAlias)) {
251
            /** @var SchemaInterface $schema */
252
            $schema = $this->schemaRegistry->get($schemaAlias);
253
        } else {
254
            return [];
255
        }
256
257
        $settings = new Settings();
258
        $settings->setSchemaAlias($schemaAlias);
259
260
        // We need to get a plain parameters array since we use the options resolver on it
261
        $parameters = $this->getParameters($schemaAliasNoPrefix);
262
        $settingsBuilder = new SettingsBuilder();
263
        $schema->buildSettings($settingsBuilder);
264
265
        // Remove unknown settings' parameters (e.g. From a previous version of the settings schema)
266
        if (true === $ignoreUnknown) {
267
            foreach ($parameters as $name => $value) {
268
                if (!$settingsBuilder->isDefined($name)) {
269
                    unset($parameters[$name]);
270
                }
271
            }
272
        }
273
274
        foreach ($settingsBuilder->getTransformers() as $parameter => $transformer) {
275
            if (array_key_exists($parameter, $parameters)) {
276
                if ('course_creation_use_template' === $parameter) {
277
                    if (empty($parameters[$parameter])) {
278
                        $parameters[$parameter] = null;
279
                    }
280
                } else {
281
                    $parameters[$parameter] = $transformer->reverseTransform($parameters[$parameter]);
282
                }
283
            }
284
        }
285
286
        $parameters = $settingsBuilder->resolve($parameters);
287
        $settings->setParameters($parameters);
288
289
        return $settings;
290
    }
291
292
    /**
293
     * @throws \Doctrine\ORM\ORMException
294
     * @throws \Doctrine\ORM\OptimisticLockException
295
     */
296
    public function update(SettingsInterface $settings)
297
    {
298
        $namespace = $settings->getSchemaAlias();
299
300
        /** @var SchemaInterface $schema */
301
        $schema = $this->schemaRegistry->get($settings->getSchemaAlias());
302
303
        $settingsBuilder = new SettingsBuilder();
304
        $schema->buildSettings($settingsBuilder);
305
        $parameters = $settingsBuilder->resolve($settings->getParameters());
306
        // Transform value. Example array to string using transformer. Example:
307
        // 1. Setting "tool_visible_by_default_at_creation" it's a multiple select
308
        // 2. Is defined as an array in class DocumentSettingsSchema
309
        // 3. Add transformer for that variable "ArrayToIdentifierTransformer"
310
        // 4. Here we recover the transformer and convert the array to string
311
        foreach ($settingsBuilder->getTransformers() as $parameter => $transformer) {
312
            if (array_key_exists($parameter, $parameters)) {
313
                $parameters[$parameter] = $transformer->transform($parameters[$parameter]);
314
            }
315
        }
316
        $settings->setParameters($parameters);
317
        $category = $this->convertServiceToNameSpace($settings->getSchemaAlias());
318
        $persistedParameters = $this->repository->findBy(['category' => $category]);
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
    /*private function transformParameters(SettingsBuilder $settingsBuilder, array $parameters)
582
    {
583
        $transformedParameters = $parameters;
584
585
        foreach ($settingsBuilder->getTransformers() as $parameter => $transformer) {
586
            if (array_key_exists($parameter, $parameters)) {
587
                $transformedParameters[$parameter] = $transformer->reverseTransform($parameters[$parameter]);
588
            }
589
        }
590
591
        return $transformedParameters;
592
    }*/
593
594
    /**
595
     * Get variables and categories as in 1.11.x.
596
     *
597
     * @return array
598
     */
599
    private function getVariablesAndCategories()
600
    {
601
        return [
602
            'Institution' => 'Platform',
603
            'InstitutionUrl' => 'Platform',
604
            'siteName' => 'Platform',
605
            'emailAdministrator' => 'admin', //'emailAdministrator' => 'Platform',
606
            'administratorSurname' => 'admin',
607
            'administratorTelephone' => 'admin',
608
            'administratorName' => 'admin',
609
            'show_administrator_data' => 'Platform',
610
            'show_tutor_data' => 'Session',
611
            'show_teacher_data' => 'Platform',
612
            'homepage_view' => 'Course',
613
            'show_toolshortcuts' => 'Course',
614
            'allow_group_categories' => 'Course',
615
            'server_type' => 'Platform',
616
            'platformLanguage' => 'Language',
617
            'showonline' => 'Platform',
618
            'profile' => 'User',
619
            'default_document_quotum' => 'Course',
620
            'registration' => 'User',
621
            'default_group_quotum' => 'Course',
622
            'allow_registration' => 'Platform',
623
            'allow_registration_as_teacher' => 'Platform',
624
            'allow_lostpassword' => 'Platform',
625
            'allow_user_headings' => 'Course',
626
            'allow_personal_agenda' => 'agenda',
627
            'display_coursecode_in_courselist' => 'Platform',
628
            'display_teacher_in_courselist' => 'Platform',
629
            'permanently_remove_deleted_files' => 'Tools',
630
            'dropbox_allow_overwrite' => 'Tools',
631
            'dropbox_max_filesize' => 'Tools',
632
            'dropbox_allow_just_upload' => 'Tools',
633
            'dropbox_allow_student_to_student' => 'Tools',
634
            'dropbox_allow_group' => 'Tools',
635
            'dropbox_allow_mailing' => 'Tools',
636
            'extended_profile' => 'User',
637
            'student_view_enabled' => 'Platform',
638
            'show_navigation_menu' => 'Course',
639
            'enable_tool_introduction' => 'course',
640
            'page_after_login' => 'Platform',
641
            'time_limit_whosonline' => 'Platform',
642
            'breadcrumbs_course_homepage' => 'Course',
643
            'example_material_course_creation' => 'Platform',
644
            'account_valid_duration' => 'Platform',
645
            'use_session_mode' => 'Session',
646
            'allow_email_editor' => 'Tools',
647
            //'registered' => null',
648
            //'donotlistcampus' =>'null',
649
            'show_email_addresses' => 'Platform',
650
            'service_ppt2lp' => 'NULL',
651
            'stylesheets' => 'stylesheets',
652
            'upload_extensions_list_type' => 'Security',
653
            'upload_extensions_blacklist' => 'Security',
654
            'upload_extensions_whitelist' => 'Security',
655
            'upload_extensions_skip' => 'Security',
656
            'upload_extensions_replace_by' => 'Security',
657
            'show_number_of_courses' => 'Platform',
658
            'show_empty_course_categories' => 'Platform',
659
            'show_back_link_on_top_of_tree' => 'Platform',
660
            'show_different_course_language' => 'Platform',
661
            'split_users_upload_directory' => 'Tuning',
662
            'hide_dltt_markup' => 'Languages',
663
            'display_categories_on_homepage' => 'Platform',
664
            'permissions_for_new_directories' => 'Security',
665
            'permissions_for_new_files' => 'Security',
666
            'show_tabs' => 'Platform',
667
            'default_forum_view' => 'Course',
668
            'platform_charset' => 'Languages',
669
            'noreply_email_address' => 'Platform',
670
            'survey_email_sender_noreply' => 'Course',
671
            'gradebook_enable' => 'Gradebook',
672
            'gradebook_score_display_coloring' => 'Gradebook',
673
            'gradebook_score_display_custom' => 'Gradebook',
674
            'gradebook_score_display_colorsplit' => 'Gradebook',
675
            'gradebook_score_display_upperlimit' => 'Gradebook',
676
            'gradebook_number_decimals' => 'Gradebook',
677
            'user_selected_theme' => 'Platform',
678
            'allow_course_theme' => 'Course',
679
            'show_closed_courses' => 'Platform',
680
            'extendedprofile_registration' => 'User',
681
            'extendedprofile_registrationrequired' => 'User',
682
            'add_users_by_coach' => 'Session',
683
            'extend_rights_for_coach' => 'Security',
684
            'extend_rights_for_coach_on_survey' => 'Security',
685
            'course_create_active_tools' => 'Tools',
686
            'show_session_coach' => 'Session',
687
            'allow_users_to_create_courses' => 'Platform',
688
            'allow_message_tool' => 'Tools',
689
            'allow_social_tool' => 'Tools',
690
            'allow_students_to_browse_courses' => 'Platform',
691
            'show_session_data' => 'Session',
692
            'allow_use_sub_language' => 'language',
693
            'show_glossary_in_documents' => 'Course',
694
            'allow_terms_conditions' => 'Platform',
695
            'search_enabled' => 'Search',
696
            'search_prefilter_prefix' => 'Search',
697
            'search_show_unlinked_results' => 'Search',
698
            'show_courses_descriptions_in_catalog' => 'Course',
699
            'allow_coach_to_edit_course_session' => 'Session',
700
            'show_glossary_in_extra_tools' => 'Course',
701
            'send_email_to_admin_when_create_course' => 'Platform',
702
            'go_to_course_after_login' => 'Course',
703
            'math_asciimathML' => 'Editor',
704
            'enabled_asciisvg' => 'Editor',
705
            'include_asciimathml_script' => 'Editor',
706
            'youtube_for_students' => 'Editor',
707
            'block_copy_paste_for_students' => 'Editor',
708
            'more_buttons_maximized_mode' => 'Editor',
709
            'students_download_folders' => 'Document',
710
            'users_copy_files' => 'Tools',
711
            'allow_students_to_create_groups_in_social' => 'Tools',
712
            'allow_send_message_to_all_platform_users' => 'Message',
713
            'message_max_upload_filesize' => 'Tools',
714
            'use_users_timezone' => 'profile', //'use_users_timezone' => 'Timezones',
715
            'timezone_value' => 'platform', //'timezone_value' => 'Timezones',
716
            'allow_user_course_subscription_by_course_admin' => 'Security',
717
            'show_link_bug_notification' => 'Platform',
718
            'show_link_ticket_notification' => 'Platform',
719
            'course_validation' => 'course', //'course_validation' => 'Platform',
720
            'course_validation_terms_and_conditions_url' => 'Platform',
721
            'enabled_wiris' => 'Editor',
722
            'allow_spellcheck' => 'Editor',
723
            'force_wiki_paste_as_plain_text' => 'Editor',
724
            'enabled_googlemaps' => 'Editor',
725
            'enabled_imgmap' => 'Editor',
726
            'enabled_support_svg' => 'Tools',
727
            'pdf_export_watermark_enable' => 'Platform',
728
            'pdf_export_watermark_by_course' => 'Platform',
729
            'pdf_export_watermark_text' => 'Platform',
730
            'enabled_insertHtml' => 'Editor',
731
            'students_export2pdf' => 'Document',
732
            'exercise_min_score' => 'Course',
733
            'exercise_max_score' => 'Course',
734
            'show_users_folders' => 'Tools',
735
            'show_default_folders' => 'Tools',
736
            'show_chat_folder' => 'Tools',
737
            'enabled_text2audio' => 'Tools',
738
            'course_hide_tools' => 'Course',
739
            'enabled_support_pixlr' => 'Tools',
740
            'show_groups_to_users' => 'Session',
741
            'accessibility_font_resize' => 'Platform',
742
            'hide_courses_in_sessions' => 'Session',
743
            'enable_quiz_scenario' => 'Course',
744
            'filter_terms' => 'Security',
745
            'header_extra_content' => 'Tracking',
746
            'footer_extra_content' => 'Tracking',
747
            'show_documents_preview' => 'Tools',
748
            'htmlpurifier_wiki' => 'Editor',
749
            'cas_activate' => 'CAS',
750
            'cas_server' => 'CAS',
751
            'cas_server_uri' => 'CAS',
752
            'cas_port' => 'CAS',
753
            'cas_protocol' => 'CAS',
754
            'cas_add_user_activate' => 'CAS',
755
            'update_user_info_cas_with_ldap' => 'CAS',
756
            'student_page_after_login' => 'Platform',
757
            'teacher_page_after_login' => 'Platform',
758
            'drh_page_after_login' => 'Platform',
759
            'sessionadmin_page_after_login' => 'Session',
760
            'student_autosubscribe' => 'Platform',
761
            'teacher_autosubscribe' => 'Platform',
762
            'drh_autosubscribe' => 'Platform',
763
            'sessionadmin_autosubscribe' => 'Session',
764
            'scorm_cumulative_session_time' => 'Course',
765
            'allow_hr_skills_management' => 'Gradebook',
766
            'enable_help_link' => 'Platform',
767
            'teachers_can_change_score_settings' => 'Gradebook',
768
            'allow_users_to_change_email_with_no_password' => 'User',
769
            'show_admin_toolbar' => 'display',
770
            'allow_global_chat' => 'Platform',
771
            'languagePriority1' => 'language',
772
            'languagePriority2' => 'language',
773
            'languagePriority3' => 'language',
774
            'languagePriority4' => 'language',
775
            'login_is_email' => 'Platform',
776
            'courses_default_creation_visibility' => 'Course',
777
            'gradebook_enable_grade_model' => 'Gradebook',
778
            'teachers_can_change_grade_model_settings' => 'Gradebook',
779
            'gradebook_default_weight' => 'Gradebook',
780
            'ldap_description' => 'LDAP',
781
            'shibboleth_description' => 'Shibboleth',
782
            'facebook_description' => 'Facebook',
783
            'gradebook_locking_enabled' => 'Gradebook',
784
            'gradebook_default_grade_model_id' => 'Gradebook',
785
            'allow_session_admins_to_manage_all_sessions' => 'Session',
786
            'allow_skills_tool' => 'Platform',
787
            'allow_public_certificates' => 'Course',
788
            'platform_unsubscribe_allowed' => 'Platform',
789
            'enable_iframe_inclusion' => 'Editor',
790
            'show_hot_courses' => 'Platform',
791
            'enable_webcam_clip' => 'Tools',
792
            'use_custom_pages' => 'Platform',
793
            'tool_visible_by_default_at_creation' => 'Tools',
794
            'prevent_session_admins_to_manage_all_users' => 'Session',
795
            'documents_default_visibility_defined_in_course' => 'Tools',
796
            'enabled_mathjax' => 'Editor',
797
            'meta_twitter_site' => 'Tracking',
798
            'meta_twitter_creator' => 'Tracking',
799
            'meta_title' => 'Tracking',
800
            'meta_description' => 'Tracking',
801
            'meta_image_path' => 'Tracking',
802
            'allow_teachers_to_create_sessions' => 'Session',
803
            'institution_address' => 'Platform',
804
            'chamilo_database_version' => 'null',
805
            'cron_remind_course_finished_activate' => 'Crons',
806
            'cron_remind_course_expiration_frequency' => 'Crons',
807
            'cron_remind_course_expiration_activate' => 'Crons',
808
            'allow_coach_feedback_exercises' => 'Session',
809
            'allow_my_files' => 'Platform',
810
            'ticket_allow_student_add' => 'Ticket',
811
            'ticket_send_warning_to_all_admins' => 'Ticket',
812
            'ticket_warn_admin_no_user_in_category' => 'Ticket',
813
            'ticket_allow_category_edition' => 'Ticket',
814
            'load_term_conditions_section' => 'Platform',
815
            'show_terms_if_profile_completed' => 'Ticket',
816
            'hide_home_top_when_connected' => 'Platform',
817
            'hide_global_announcements_when_not_connected' => 'Platform',
818
            'course_creation_use_template' => 'Course',
819
            'allow_strength_pass_checker' => 'Security',
820
            'allow_captcha' => 'Security',
821
            'captcha_number_mistakes_to_block_account' => 'Security',
822
            'captcha_time_to_block' => 'Security',
823
            'drh_can_access_all_session_content' => 'Session',
824
            'display_groups_forum_in_general_tool' => 'Tools',
825
            'allow_tutors_to_assign_students_to_session' => 'Session',
826
            'allow_lp_return_link' => 'Course',
827
            'hide_scorm_export_link' => 'Course',
828
            'hide_scorm_copy_link' => 'Course',
829
            'hide_scorm_pdf_link' => 'Course',
830
            'session_days_before_coach_access' => 'Session',
831
            'session_days_after_coach_access' => 'Session',
832
            'pdf_logo_header' => 'Course',
833
            'order_user_list_by_official_code' => 'Platform',
834
            'email_alert_manager_on_new_quiz' => 'exercise',
835
            'show_official_code_exercise_result_list' => 'Tools',
836
            'course_catalog_hide_private' => 'Platform',
837
            'catalog_show_courses_sessions' => 'Platform',
838
            'auto_detect_language_custom_pages' => 'Platform',
839
            'lp_show_reduced_report' => 'Course',
840
            'allow_session_course_copy_for_teachers' => 'Session',
841
            'hide_logout_button' => 'Platform',
842
            'redirect_admin_to_courses_list' => 'Platform',
843
            'course_images_in_courses_list' => 'Course',
844
            'student_publication_to_take_in_gradebook' => 'Gradebook',
845
            'certificate_filter_by_official_code' => 'Gradebook',
846
            'exercise_max_ckeditors_in_page' => 'Tools',
847
            'document_if_file_exists_option' => 'Tools',
848
            'add_gradebook_certificates_cron_task_enabled' => 'Gradebook',
849
            'openbadges_backpack' => 'Gradebook',
850
            'cookie_warning' => 'Tools',
851
            'hide_course_group_if_no_tools_available' => 'Tools',
852
            'catalog_allow_session_auto_subscription' => 'Session',
853
            'registration.soap.php.decode_utf8' => 'Platform',
854
            'allow_delete_attendance' => 'Tools',
855
            'gravatar_enabled' => 'Platform',
856
            'gravatar_type' => 'Platform',
857
            'limit_session_admin_role' => 'Session',
858
            'show_session_description' => 'Session',
859
            'hide_certificate_export_link_students' => 'Gradebook',
860
            'hide_certificate_export_link' => 'Gradebook',
861
            'dropbox_hide_course_coach' => 'Tools',
862
            'dropbox_hide_general_coach' => 'Tools',
863
            'session_course_ordering' => 'Session',
864
            'gamification_mode' => 'Platform',
865
            'prevent_multiple_simultaneous_login' => 'Security',
866
            'gradebook_detailed_admin_view' => 'Gradebook',
867
            'course_catalog_published' => 'Course',
868
            'user_reset_password' => 'Security',
869
            'user_reset_password_token_limit' => 'Security',
870
            'my_courses_view_by_session' => 'Session',
871
            'show_full_skill_name_on_skill_wheel' => 'Platform',
872
            'messaging_allow_send_push_notification' => 'WebServices',
873
            'messaging_gdc_project_number' => 'WebServices',
874
            'messaging_gdc_api_key' => 'WebServices',
875
            'teacher_can_select_course_template' => 'Course',
876
            'enable_record_audio' => 'Tools',
877
            'allow_show_skype_account' => 'Platform',
878
            'allow_show_linkedin_url' => 'Platform',
879
            'enable_profile_user_address_geolocalization' => 'User',
880
            'show_official_code_whoisonline' => 'Profile',
881
            'icons_mode_svg' => 'display',
882
            'user_name_order' => 'display',
883
            'user_name_sort_by' => 'display',
884
            'default_calendar_view' => 'agenda',
885
            'exercise_invisible_in_session' => 'exercise',
886
            'configure_exercise_visibility_in_course' => 'exercise',
887
            'allow_download_documents_by_api_key' => 'Webservices',
888
            'ProfilingFilterAddingUsers' => 'profile',
889
            'donotlistcampus' => 'platform',
890
            'gradebook_show_percentage_in_reports' => 'gradebook',
891
            'course_creation_splash_screen' => 'Course',
892
        ];
893
    }
894
895
    /**
896
     * Rename old variable with variable used in Chamilo 2.0.
897
     *
898
     * @param string $variable
899
     */
900
    private function renameVariable($variable)
901
    {
902
        $list = [
903
            'timezone_value' => 'timezone',
904
            'Institution' => 'institution',
905
            'SiteName' => 'site_name',
906
            'siteName' => 'site_name',
907
            'InstitutionUrl' => 'institution_url',
908
            'registration' => 'required_profile_fields',
909
            'stylesheets' => 'theme',
910
            'platformLanguage' => 'platform_language',
911
            'languagePriority1' => 'language_priority_1',
912
            'languagePriority2' => 'language_priority_2',
913
            'languagePriority3' => 'language_priority_3',
914
            'languagePriority4' => 'language_priority_4',
915
            'gradebook_score_display_coloring' => 'my_display_coloring',
916
            'document_if_file_exists_option' => 'if_file_exists_option',
917
            'ProfilingFilterAddingUsers' => 'profiling_filter_adding_users',
918
            'course_create_active_tools' => 'active_tools_on_create',
919
            'emailAdministrator' => 'administrator_email',
920
            'administratorSurname' => 'administrator_surname',
921
            'administratorName' => 'administrator_name',
922
            'administratorTelephone' => 'administrator_phone',
923
            'registration.soap.php.decode_utf8' => 'decode_utf8',
924
            'profile' => 'changeable_options',
925
        ];
926
927
        return $list[$variable] ?? $variable;
928
    }
929
930
    /**
931
     * Replace old Chamilo 1.x category with 2.0 version.
932
     *
933
     * @param string $variable
934
     * @param string $defaultCategory
935
     */
936
    private function fixCategory($variable, $defaultCategory)
937
    {
938
        $settings = [
939
            'cookie_warning' => 'platform',
940
            'donotlistcampus' => 'platform',
941
            'administrator_email' => 'admin',
942
            'administrator_surname' => 'admin',
943
            'administrator_name' => 'admin',
944
            'administrator_phone' => 'admin',
945
            'exercise_max_ckeditors_in_page' => 'exercise',
946
            'allow_hr_skills_management' => 'skill',
947
            'accessibility_font_resize' => 'display',
948
            'account_valid_duration' => 'profile',
949
            'allow_global_chat' => 'chat',
950
            'allow_lostpassword' => 'registration',
951
            'allow_registration' => 'registration',
952
            'allow_registration_as_teacher' => 'registration',
953
            'required_profile_fields' => 'registration',
954
            'allow_skills_tool' => 'skill',
955
            'allow_students_to_browse_courses' => 'display',
956
            'allow_terms_conditions' => 'registration',
957
            'allow_users_to_create_courses' => 'course',
958
            'auto_detect_language_custom_pages' => 'language',
959
            'platform_language' => 'language',
960
            'course_validation' => 'course',
961
            'course_validation_terms_and_conditions_url' => 'course',
962
            'display_categories_on_homepage' => 'display',
963
            'display_coursecode_in_courselist' => 'course',
964
            'display_teacher_in_courselist' => 'course',
965
            'drh_autosubscribe' => 'registration',
966
            'drh_page_after_login' => 'registration',
967
            'enable_help_link' => 'display',
968
            'example_material_course_creation' => 'course',
969
            'login_is_email' => 'profile',
970
            'noreply_email_address' => 'mail',
971
            'page_after_login' => 'registration',
972
            'pdf_export_watermark_by_course' => 'document',
973
            'pdf_export_watermark_enable' => 'document',
974
            'pdf_export_watermark_text' => 'document',
975
            'platform_unsubscribe_allowed' => 'registration',
976
            'send_email_to_admin_when_create_course' => 'course',
977
            'show_admin_toolbar' => 'display',
978
            'show_administrator_data' => 'display',
979
            'show_back_link_on_top_of_tree' => 'display',
980
            'show_closed_courses' => 'display',
981
            'show_different_course_language' => 'display',
982
            'show_email_addresses' => 'display',
983
            'show_empty_course_categories' => 'display',
984
            'show_full_skill_name_on_skill_wheel' => 'skill',
985
            'show_hot_courses' => 'display',
986
            'show_link_bug_notification' => 'display',
987
            'show_number_of_courses' => 'display',
988
            'show_teacher_data' => 'display',
989
            'showonline' => 'display',
990
            'student_autosubscribe' => 'registration',
991
            'student_page_after_login' => 'registration',
992
            'student_view_enabled' => 'course',
993
            'teacher_autosubscribe' => 'registration',
994
            'teacher_page_after_login' => 'registration',
995
            'time_limit_whosonline' => 'display',
996
            'user_selected_theme' => 'profile',
997
            'hide_global_announcements_when_not_connected' => 'announcement',
998
            'hide_home_top_when_connected' => 'display',
999
            'hide_logout_button' => 'display',
1000
            'institution_address' => 'platform',
1001
            'redirect_admin_to_courses_list' => 'admin',
1002
            'use_custom_pages' => 'platform',
1003
            'allow_group_categories' => 'group',
1004
            'allow_user_headings' => 'display',
1005
            'default_document_quotum' => 'document',
1006
            'default_forum_view' => 'forum',
1007
            'default_group_quotum' => 'document',
1008
            'enable_quiz_scenario' => 'exercise',
1009
            'exercise_max_score' => 'exercise',
1010
            'exercise_min_score' => 'exercise',
1011
            'pdf_logo_header' => 'platform',
1012
            'show_glossary_in_documents' => 'document',
1013
            'show_glossary_in_extra_tools' => 'glossary',
1014
            'survey_email_sender_noreply' => 'survey',
1015
            'allow_coach_feedback_exercises' => 'exercise',
1016
            'sessionadmin_autosubscribe' => 'registration',
1017
            'sessionadmin_page_after_login' => 'registration',
1018
            'show_tutor_data' => 'display',
1019
            'allow_social_tool' => 'social',
1020
            'allow_message_tool' => 'message',
1021
            'allow_email_editor' => 'editor',
1022
            'show_link_ticket_notification' => 'display',
1023
            'permissions_for_new_directories' => 'document',
1024
            'enable_profile_user_address_geolocalization' => 'profile',
1025
            'allow_show_skype_account' => 'profile',
1026
            'allow_show_linkedin_url' => 'profile',
1027
            'allow_students_to_create_groups_in_social' => 'social',
1028
            'default_calendar_view' => 'agenda',
1029
            'documents_default_visibility_defined_in_course' => 'document',
1030
            'message_max_upload_filesize' => 'message',
1031
            'course_create_active_tools' => 'course',
1032
            'tool_visible_by_default_at_creation' => 'document',
1033
            'show_users_folders' => 'document',
1034
            'show_default_folders' => 'document',
1035
            'show_chat_folder' => 'chat',
1036
            'enabled_support_svg' => 'editor',
1037
            'enabled_support_pixlr' => 'editor',
1038
            'enable_webcam_clip' => 'document',
1039
            'enable_record_audio' => 'course',
1040
            'enabled_text2audio' => 'document',
1041
            'permanently_remove_deleted_files' => 'document',
1042
            'allow_delete_attendance' => 'attendance',
1043
            'display_groups_forum_in_general_tool' => 'forum',
1044
            'dropbox_allow_overwrite' => 'dropbox',
1045
            'allow_user_course_subscription_by_course_admin' => 'course',
1046
            'hide_course_group_if_no_tools_available' => 'group',
1047
            'extend_rights_for_coach_on_survey' => 'survey',
1048
            'show_official_code_exercise_result_list' => 'exercise',
1049
            'dropbox_max_filesize' => 'dropbox',
1050
            'dropbox_allow_just_upload' => 'dropbox',
1051
            'dropbox_allow_student_to_student' => 'dropbox',
1052
            'dropbox_allow_group' => 'dropbox',
1053
            'dropbox_allow_mailing' => 'dropbox',
1054
            'upload_extensions_list_type' => 'document',
1055
            'upload_extensions_blacklist' => 'document',
1056
            'upload_extensions_skip' => 'document',
1057
            'changeable_options' => 'profile',
1058
            'users_copy_files' => 'document',
1059
            'if_file_exists_option' => 'document',
1060
            'permissions_for_new_files' => 'document',
1061
            'extended_profile' => 'profile',
1062
            'split_users_upload_directory' => 'profile',
1063
            'show_documents_preview' => 'document',
1064
            'decode_utf8' => 'webservice',
1065
            'messaging_allow_send_push_notification' => 'webservice',
1066
            'messaging_gdc_project_number' => 'webservice',
1067
            'messaging_gdc_api_key' => 'webservice',
1068
            'allow_download_documents_by_api_key' => 'webservice',
1069
            'profiling_filter_adding_users' => 'profile',
1070
            'hide_dltt_markup' => 'language',
1071
            'active_tools_on_create' => 'course',
1072
        ];
1073
1074
        return isset($settings[$variable]) ? $settings[$variable] : $defaultCategory;
1075
    }
1076
}
1077