LanguageRequest.php
4.06 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
<?php
namespace artbox\core\components;
use artbox\core\models\Language;
use yii\base\InvalidConfigException;
use yii\log\Logger;
use yii\web\Request;
class LanguageRequest extends Request
{
/**
* Language model $url field for current request.
*
* @var string
*/
private $languageUrl;
/**
* Get $languageUrl from current Request Url.
*
* @return string
*/
public function getLanguageUrl()
{
if ($this->languageUrl === null) {
$this->languageUrl = $this->getUrl();
$url_list = explode('/', $this->languageUrl);
$language_url = isset($url_list[ 1 ]) ? $url_list[ 1 ] : null;
if ($paramsPos = strpos($language_url, '?')) {
$language_url = substr($language_url, 0, $paramsPos);
}
$is_language = Language::setCurrent($language_url);
if (!$is_language && !$this->isAjax) {
if (strpos($language_url, '.') === false && count(Language::getActive()) !== 1) {
\Yii::$app->response->redirect('/' . Language::getCurrent()->url . $this->url, 302, false);
} else {
\Yii::getLogger()
->log(
"Url $language_url has extension '.' symbol in name. No language redirect applied.",
Logger::LEVEL_INFO,
'artbox'
);
}
}
if ($language_url !== null && $language_url === Language::getCurrent()->url && strpos(
$this->languageUrl,
Language::getCurrent()->url
) === 1
) {
$this->languageUrl = substr($this->languageUrl, strlen(Language::getCurrent()->url) + 1);
if (count(Language::getActive()) === 1 && !$this->isAjax) {
\Yii::$app->response->redirect('/', 302, false);
}
}
}
return $this->languageUrl;
}
/**
* @inheritdoc
*/
protected function resolvePathInfo()
{
$pathInfo = $this->getLanguageUrl();
if (( $pos = strpos($pathInfo, '?') ) !== false) {
$pathInfo = substr($pathInfo, 0, $pos);
}
$pathInfo = urldecode($pathInfo);
if (!preg_match(
'%^(?:
[\x09\x0A\x0D\x20-\x7E]
| [\xC2-\xDF][\x80-\xBF]
| \xE0[\xA0-\xBF][\x80-\xBF]
| [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}
| \xED[\x80-\x9F][\x80-\xBF]
| \xF0[\x90-\xBF][\x80-\xBF]{2}
| [\xF1-\xF3][\x80-\xBF]{3}
| \xF4[\x80-\x8F][\x80-\xBF]{2}
)*$%xs',
$pathInfo
)
) {
$pathInfo = utf8_encode($pathInfo);
}
$scriptUrl = $this->getScriptUrl();
$baseUrl = $this->getBaseUrl();
if (strpos($pathInfo, $scriptUrl) === 0) {
$pathInfo = substr($pathInfo, strlen($scriptUrl));
} elseif ($baseUrl === '' || strpos($pathInfo, $baseUrl) === 0) {
$pathInfo = substr($pathInfo, strlen($baseUrl));
} elseif (isset($_SERVER[ 'PHP_SELF' ]) && strpos($_SERVER[ 'PHP_SELF' ], $scriptUrl) === 0) {
$pathInfo = substr($_SERVER[ 'PHP_SELF' ], strlen($scriptUrl));
} else {
throw new InvalidConfigException('Unable to determine the path info of the current request.');
}
if ($pathInfo === '/') {
$pathInfo = substr($pathInfo, 1);
}
return (string) $pathInfo;
}
}