Passed
Push — master ( 33aff7...84dd35 )
by Julito
09:17
created

LocaleSubscriber::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 3
nc 1
nop 3
dl 0
loc 5
rs 10
c 0
b 0
f 0
1
<?php
2
3
/* For licensing terms, see /license.txt */
4
5
namespace Chamilo\CoreBundle\EventSubscriber;
6
7
use Chamilo\CoreBundle\Entity\Course;
8
use Chamilo\CoreBundle\Manager\SettingsManager;
9
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
10
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
11
use Symfony\Component\HttpKernel\Event\RequestEvent;
12
use Symfony\Component\HttpKernel\KernelEvents;
13
14
/**
15
 * Checks the portal listener depending of different settings:
16
 * platform, user, course.
17
 */
18
class LocaleSubscriber implements EventSubscriberInterface
19
{
20
    protected $defaultLocale;
21
    protected $parameterBag;
22
    protected $settingsManager;
23
24
    public function __construct(string $defaultLocale, SettingsManager $settingsManager, ParameterBagInterface $parameterBag)
25
    {
26
        $this->defaultLocale = $defaultLocale;
27
        $this->settingsManager = $settingsManager;
28
        $this->parameterBag = $parameterBag;
29
    }
30
31
    public function onKernelRequest(RequestEvent $event)
32
    {
33
        $request = $event->getRequest();
34
        if (!$request->hasPreviousSession()) {
35
            return;
36
        }
37
        $installed = 1 === (int) $this->parameterBag->get('installed');
38
39
        if (!$installed) {
40
            return;
41
        }
42
43
        if (false === $request->hasSession()) {
44
            return;
45
        }
46
47
        $loadFromDb = $request->getSession()->get('check_locale_from_db', true);
48
49
        if (false === $loadFromDb &&
50
            $request->getSession()->has('_locale') &&
51
            !empty($request->getSession()->get('_locale'))
52
        ) {
53
            $locale = $request->getSession()->get('_locale');
54
            $request->setLocale($locale);
55
56
            return true;
57
        }
58
59
        // Try to see if the locale has been set as a _locale routing parameter (from lang switcher)
60
        //if ($locale = $request->getSession('_locale')) {
61
        if ($loadFromDb) {
62
            $localeList = [];
63
64
            // 1. Check platform locale
65
            $platformLocale = $this->settingsManager->getSetting('language.platform_language');
66
67
            if (!empty($platformLocale)) {
68
                $localeList['platform_lang'] = $platformLocale;
69
            }
70
            // 2. Check user locale
71
            // _locale_user is set when user logins the system check UserLocaleListener
72
            $userLocale = $request->getSession()->get('_locale_user');
73
74
            if (!empty($userLocale)) {
75
                $localeList['user_profil_lang'] = $userLocale;
76
            }
77
78
            // 3. Check course locale
79
            $courseId = $request->get('cid');
80
81
            if (!empty($courseId)) {
82
                /** @var Course $course */
83
                $course = $request->getSession()->get('course');
84
                // 3. Check course locale
85
                /** @var Course $course */
86
                if (!empty($course)) {
87
                    $courseLocale = $course->getCourseLanguage();
88
                    if (!empty($courseLocale)) {
89
                        $localeList['course_lang'] = $platformLocale;
90
                    }
91
                }
92
            }
93
94
            // 4. force locale if it was selected from the URL
95
            $localeFromUrl = $request->get('_locale');
96
            if (!empty($localeFromUrl)) {
97
                $localeList['user_selected_lang'] = $platformLocale;
98
            }
99
100
            $priorityList = [
101
                'language_priority_4',
102
                'language_priority_3',
103
                'language_priority_2',
104
                'language_priority_1',
105
            ];
106
107
            $locale = '';
108
            foreach ($priorityList as $setting) {
109
                $priority = $this->settingsManager->getSetting("language.$setting");
110
                if (!empty($priority) && isset($localeList[$priority])) {
111
                    $locale = $localeList[$priority];
112
113
                    break;
114
                }
115
            }
116
117
            if (empty($locale)) {
118
                // Use default order
119
                $priorityList = [
120
                    'platform_lang',
121
                    'user_profil_lang',
122
                    'course_lang',
123
                    'user_selected_lang',
124
                ];
125
                foreach ($priorityList as $setting) {
126
                    if (isset($localeList[$setting])) {
127
                        $locale = $localeList[$setting];
128
                    }
129
                }
130
            }
131
132
            if (empty($locale)) {
133
                $locale = $this->defaultLocale;
134
            }
135
136
            // if no explicit locale has been set on this request, use one from the session
137
            $request->setLocale($locale);
138
            $request->getSession()->set('_locale', $locale);
139
            $request->getSession()->set('check_locale_from_db', false);
140
        }
141
    }
142
143
    public static function getSubscribedEvents()
144
    {
145
        return [
146
            // must be registered before the default Locale listener
147
            KernelEvents::REQUEST => [['onKernelRequest', 20]],
148
        ];
149
    }
150
}
151