LanguageComponent::get()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 2
Code Lines 0

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 0
nc 1
nop 0
dl 0
loc 2
rs 10
c 0
b 0
f 0
1
<?php
2
3
namespace CloudControl\Cms\components;
4
5
6
use CloudControl\Cms\cc\Request;
7
use CloudControl\Cms\storage\Storage;
8
9
class LanguageComponent implements Component
10
{
11
    const SESSION_PARAMETER_LANGUAGE = 'language';
12
    const SESSION_PARAMETER_DETECTED_LANGUAGE = 'detectedLanguage';
13
    const SESSION_PARAMETER_LANGUAGE_COMPONENT = 'LanguageComponent';
14
15
    const HTTP_ACCEPT_LANGUAGE = 'HTTP_ACCEPT_LANGUAGE';
16
17
    const PARAMETER_DEFAULT_LANGUAGE = 'defaultLanguage';
18
    const PARAMETER_ACCEPTED_LANGUAGES = 'acceptedLanguages';
19
    const PARAMETER_LANGUAGE_PARAMETER_NAME = 'languageParameterName';
20
    const PARAMETER_FORCE_REDIRECT = 'forceRedirect';
21
22
    protected $request;
23
    protected $parameters;
24
25
    public static $DEFAULT_LANGUAGE = 'en';
26
    protected $acceptedLanguages;
27
    protected $languageParameterName = self::SESSION_PARAMETER_LANGUAGE;
28
    protected $forceRedirect = false;
29
    protected $sessionValues;
30
31
32
    /**
33
     * Component constructor.
34
     *
35
     * @param                     $template
36
     * @param Request $request
37
     * @param                     $parameters
38
     * @param                     $matchedSitemapItem
39
     */
40
    public function __construct($template, Request $request, $parameters, $matchedSitemapItem)
41
    {
42
        $this->parameters = (array)$parameters;
43
        $this->checkParameters();
44
45
        $lang = substr(isset($_SERVER[self::HTTP_ACCEPT_LANGUAGE]) ? $_SERVER[self::HTTP_ACCEPT_LANGUAGE] : self::$DEFAULT_LANGUAGE,
46
            0, 2);
47
        $_SESSION[self::SESSION_PARAMETER_LANGUAGE_COMPONENT][self::SESSION_PARAMETER_DETECTED_LANGUAGE] = $lang;
48
49
        $this->checkLanguageSwitch($request);
50
51
        if (!isset($_SESSION[self::SESSION_PARAMETER_LANGUAGE_COMPONENT][$this->languageParameterName])) {
52
            $this->detectLanguage($lang, $request);
53
        } else {
54
            if ($this->forceRedirect === true) {
55
                $this->detectLanguage($_SESSION[self::SESSION_PARAMETER_LANGUAGE_COMPONENT][self::SESSION_PARAMETER_LANGUAGE],
56
                    $request);
57
            }
58
        }
59
60
        $this->parameters[$this->languageParameterName] = $_SESSION[self::SESSION_PARAMETER_LANGUAGE_COMPONENT][self::SESSION_PARAMETER_LANGUAGE];
61
    }
62
63
    /**
64
     * Checks to see if any parameters are given from the configuration in the CMS
65
     */
66
    protected function checkParameters()
67
    {
68
        if (isset($this->parameters[self::PARAMETER_DEFAULT_LANGUAGE])) {
69
            self::$DEFAULT_LANGUAGE = $this->parameters[self::PARAMETER_DEFAULT_LANGUAGE];
70
            unset($this->parameters[self::PARAMETER_DEFAULT_LANGUAGE]);
71
        }
72
        if (isset($this->parameters[self::PARAMETER_ACCEPTED_LANGUAGES])) {
73
            $this->acceptedLanguages = explode(',', $this->parameters[self::PARAMETER_ACCEPTED_LANGUAGES]);
74
            unset($this->parameters[self::PARAMETER_ACCEPTED_LANGUAGES]);
75
        }
76
        if (isset($this->parameters[self::PARAMETER_LANGUAGE_PARAMETER_NAME])) {
77
            $this->languageParameterName = $this->parameters[self::PARAMETER_LANGUAGE_PARAMETER_NAME];
78
            unset($this->parameters[self::PARAMETER_LANGUAGE_PARAMETER_NAME]);
79
        }
80
        if (isset($this->parameters[self::PARAMETER_FORCE_REDIRECT])) {
81
            $this->forceRedirect = (bool)$this->parameters[self::PARAMETER_FORCE_REDIRECT];
82
            unset($this->parameters[self::PARAMETER_FORCE_REDIRECT]);
83
        }
84
    }
85
86
    /**
87
     * @return array
88
     */
89
    public function getParameters()
90
    {
91
        return $this->parameters;
92
    }
93
94
95
    /**
96
     * Check if the found language is allowed and
97
     * if an action is to be taken.
98
     *
99
     * @param $lang
100
     * @param Request $request
101
     */
102
    protected function detectLanguage($lang, $request)
103
    {
104
        $lang = $this->setLanguagInSession($lang);
105
106
        $this->sessionValues = $_SESSION[self::SESSION_PARAMETER_LANGUAGE_COMPONENT];
107
108
        $this->checkForceRedirect($lang, $request);
109
    }
110
111
    /**
112
     * Detect if the language is switched manually
113
     *
114
     * @param Request $request
115
     */
116
    protected function checkLanguageSwitch($request)
117
    {
118
        if (isset($request::$get['langSwitch'])) {
119
            $this->forceRedirect = true;
120
            $this->detectLanguage($request::$get['langSwitch'], $request);
121
        }
122
    }
123
124
    public function render()
125
    {
126
    }
127
128
    public function get()
129
    {
130
    }
131
132
    /**
133
     * @param Storage $storage
134
     */
135
    public function run(Storage $storage)
136
    {
137
        // To be implemented
138
    }
139
140
    /**
141
     * @param $lang
142
     * @param $request
143
     */
144
    protected function checkForceRedirect($lang, $request)
145
    {
146
        if ($this->forceRedirect === true && !CmsComponent::isCmsLoggedIn()) {
147
            if (substr($request::$relativeUri, 0, 2) !== $lang) {
148
                if ($lang !== self::$DEFAULT_LANGUAGE) {
149
                    $redirectUrl = $request::$subfolders . $lang . '/' . $request::$relativeUri;
150
                    if (!empty($request::$queryString)) {
151
                        $redirectUrl .= '?' . $request::$queryString;
152
                    }
153
                    header('Location: ' . $redirectUrl);
154
                    exit;
155
                }
156
            }
157
        }
158
    }
159
160
    /**
161
     * @param $lang
162
     * @return string
163
     */
164
    protected function setLanguagInSession($lang)
165
    {
166
        $_SESSION[self::SESSION_PARAMETER_LANGUAGE_COMPONENT][self::SESSION_PARAMETER_LANGUAGE] = self::$DEFAULT_LANGUAGE;
167
168
        if ($this->acceptedLanguages === null) {
169
            $_SESSION[self::SESSION_PARAMETER_LANGUAGE_COMPONENT][self::SESSION_PARAMETER_LANGUAGE] = $lang;
170
        } elseif (in_array($lang, $this->acceptedLanguages)) {
171
            $_SESSION[self::SESSION_PARAMETER_LANGUAGE_COMPONENT][self::SESSION_PARAMETER_LANGUAGE] = $lang;
172
        } else {
173
            $lang = self::$DEFAULT_LANGUAGE;
174
        }
175
        return $lang;
176
    }
177
}