Blame view

artweb/artbox-core/components/LanguageRequest.php 4.06 KB
326af919   mzavalniuk   add artbox-core t...
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;
          }
      }