Passed
Push — develop ( bbe31e...6a6eba )
by Jens
09:49
created

LanguageComponent::getParameters()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

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