Passed
Push — master ( 6aacd7...ff96ae )
by Jens
04:01
created

LanguageComponent::setLanguagInSession()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 13
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 3
eloc 9
c 1
b 0
f 0
nc 3
nop 1
dl 0
loc 13
rs 9.4285
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
    protected $request;
12
    protected $parameters;
13
14
    protected $defaultLanguage = 'en';
15
    protected $acceptedLanguages = null;
16
    protected $languageParameterName = 'language';
17
    protected $forceRedirect = false;
18
    protected $sessionValues;
19
20
    /**
21
     * Component constructor.
22
     *
23
     * @param                     $template
24
     * @param Request $request
25
     * @param                     $parameters
26
     * @param                     $matchedSitemapItem
27
     */
28
    public function __construct($template, Request $request, $parameters, $matchedSitemapItem)
29
    {
30
        $this->parameters = (array)$parameters;
31
        $this->checkParameters();
32
33
        $lang = substr(isset($_SERVER['HTTP_ACCEPT_LANGUAGE']) ? $_SERVER['HTTP_ACCEPT_LANGUAGE'] : $this->defaultLanguage, 0, 2);
34
        $_SESSION['LanguageComponent']['detectedLanguage'] = $lang;
35
36
        $this->checkLanguageSwitch($request);
37
38
        if (!isset($_SESSION['LanguageComponent'][$this->languageParameterName])) {
39
            $this->detectLanguage($lang, $request);
40
        } else {
41
            if ($this->forceRedirect === true) {
42
                $this->detectLanguage($_SESSION['LanguageComponent'][$this->languageParameterName], $request);
43
            }
44
        }
45
46
        $this->parameters[$this->languageParameterName] = $_SESSION['LanguageComponent'][$this->languageParameterName];
47
    }
48
49
    /**
50
     * Checks to see if any parameters are given from the configuration in the CMS
51
     */
52
    private function checkParameters()
53
    {
54
        if (isset($this->parameters['defaultLanguage'])) {
55
            $this->defaultLanguage = $this->parameters['defaultLanguage'];
56
            unset($this->parameters['defaultLanguage']);
57
        }
58
        if (isset($this->parameters['acceptedLanguages'])) {
59
            $this->acceptedLanguages = explode(',', $this->parameters['acceptedLanguages']);
60
            unset($this->parameters['acceptedLanguages']);
61
        }
62
        if (isset($this->parameters['languageParameterName'])) {
63
            $this->languageParameterName = $this->parameters['languageParameterName'];
64
            unset($this->parameters['languageParameterName']);
65
        }
66
        if (isset($this->parameters['forceRedirect'])) {
67
            $this->forceRedirect = (bool)$this->parameters['forceRedirect'];
68
            unset($this->parameters['forceRedirect']);
69
        }
70
    }
71
72
    /**
73
     * @return array
74
     */
75
    public function getParameters()
76
    {
77
        return $this->parameters;
78
    }
79
80
81
    /**
82
     * Check if the found language is allowed and
83
     * if an action is to be taken.
84
     *
85
     * @param $lang
86
     * @param Request $request
87
     */
88
    private function detectLanguage($lang, $request)
89
    {
90
        $lang = $this->setLanguagInSession($lang);
91
92
        $this->sessionValues = $_SESSION['LanguageComponent'];
93
94
        $this->checkForceRedirect($lang, $request);
95
    }
96
97
    /**
98
     * Detect if the language is switched manually
99
     *
100
     * @param Request $request
101
     */
102
    private function checkLanguageSwitch($request)
103
    {
104
        if (isset($request::$get['langSwitch'])) {
105
            $this->forceRedirect = true;
106
            $this->detectLanguage($request::$get['langSwitch'], $request);
107
        }
108
    }
109
110
    public function render()
111
    {
112
    }
113
114
    public function get()
115
    {
116
    }
117
118
    /**
119
     * @param Storage $storage
120
     */
121
    function run(Storage $storage)
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
122
    {
123
        // To be implemented
124
    }
125
126
    /**
127
     * @param $lang
128
     * @param $request
129
     */
130
    private function checkForceRedirect($lang, $request)
131
    {
132
        if ($this->forceRedirect === true) {
133
            if (substr($request::$relativeUri, 0, 2) !== $lang) {
134
                if ($lang !== $this->defaultLanguage) {
135
                    $redirectUrl = $request::$subfolders . $lang . '/' . $request::$relativeUri;
136
                    if (!empty($request::$queryString)) {
137
                        $redirectUrl .= '?' . $request::$queryString;
138
                    }
139
                    header('Location: ' . $redirectUrl);
140
                    exit;
141
                }
142
            }
143
        }
144
    }
145
146
    /**
147
     * @param $lang
148
     * @return string
149
     */
150
    private function setLanguagInSession($lang)
151
    {
152
        $_SESSION['LanguageComponent'][$this->languageParameterName] = $this->defaultLanguage;
153
154
        if ($this->acceptedLanguages === null) {
155
            $_SESSION['LanguageComponent'][$this->languageParameterName] = $lang;
156
        } else if (in_array($lang, $this->acceptedLanguages)) {
157
            $_SESSION['LanguageComponent'][$this->languageParameterName] = $lang;
158
        } else {
159
            $lang = $this->defaultLanguage;
160
        }
161
        return $lang;
162
    }
163
}