Passed
Push — master ( fa28f5...070d6c )
by Jens
02:40
created

LanguageComponent   A

Complexity

Total Complexity 20

Size/Duplication

Total Lines 117
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 0

Importance

Changes 2
Bugs 1 Features 1
Metric Value
c 2
b 1
f 1
dl 0
loc 117
rs 10
wmc 20
lcom 1
cbo 0

8 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 16 3
B checkParameters() 0 19 5
A getParameters() 0 4 1
B detectLanguage() 0 21 6
A checkLanguageSwitch() 0 7 2
A run() 0 1 1
A render() 0 1 1
A get() 0 1 1
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
    public function run(Storage $storage) {}
122
    public function render() {}
123
    public function get() {}
124
}