Passed
Push — develop ( 73ee1c...b9875a )
by Jens
06:23
created

LanguageComponent::detectLanguage()   C

Complexity

Conditions 7
Paths 15

Size

Total Lines 27
Code Lines 17

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 7
eloc 17
c 0
b 0
f 0
nc 15
nop 2
dl 0
loc 27
rs 6.7272
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
        $_SESSION['LanguageComponent'][$this->languageParameterName] = $this->defaultLanguage;
91
92
        if ($this->acceptedLanguages === null) {
93
            $_SESSION['LanguageComponent'][$this->languageParameterName] = $lang;
94
        } else if (in_array($lang, $this->acceptedLanguages)) {
95
            $_SESSION['LanguageComponent'][$this->languageParameterName] = $lang;
96
        } else {
97
            $lang = $this->defaultLanguage;
98
        }
99
100
        $this->sessionValues = $_SESSION['LanguageComponent'];
101
102
        if ($this->forceRedirect === true) {
103
            if (substr($request::$relativeUri, 0, 2) !== $lang) {
104
                if ($lang !== $this->defaultLanguage) {
105
                    $redirectUrl = $request::$subfolders . $lang . '/' . $request::$relativeUri;
106
                    if (!empty($request::$queryString)) {
107
                        $redirectUrl .= '?' . $request::$queryString;
108
                    }
109
                    header('Location: ' . $redirectUrl);
110
                    exit;
111
                }
112
            }
113
        }
114
    }
115
116
    /**
117
     * Detect if the language is switched manually
118
     *
119
     * @param Request $request
120
     */
121
    private function checkLanguageSwitch($request)
122
    {
123
        if (isset($request::$get['langSwitch'])) {
124
            $this->forceRedirect = true;
125
            $this->detectLanguage($request::$get['langSwitch'], $request);
126
        }
127
    }
128
129
    public function render()
130
    {
131
    }
132
133
    public function get()
134
    {
135
    }
136
137
    /**
138
     * @param Storage $storage
139
     */
140
    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...
141
    {
142
        // To be implemented
143
    }
144
}