Blame view

common/components/LangRequest.php 2.93 KB
ab4d7cb1   andryeyev   Page + Языковая в...
1
2
3
4
5
  <?php
  
  namespace common\components;
  
  use Yii;
e3105834   Yarik   Стандартизация
6
  use yii\base\InvalidConfigException;
ab4d7cb1   andryeyev   Page + Языковая в...
7
8
  use yii\web\Request;
  use common\models\Language;
1083271e   andryeyev   + идентификатор I...
9
10
  use common\models\Page;
  use yii\helpers\Url;
ab4d7cb1   andryeyev   Page + Языковая в...
11
12
  
  class LangRequest extends Request
1083271e   andryeyev   + идентификатор I...
13
  {  
ab4d7cb1   andryeyev   Page + Языковая в...
14
15
      private $_lang_url;
  
1083271e   andryeyev   + идентификатор I...
16
17
18
19
20
      public function getBaseUrl()
      {   
          return str_replace ((IS_FRONT ? '/frontend/web' : '/backend/web'), '', parent::getBaseUrl()) . (IS_FRONT ? '' : '/admin');
      }
  
ab4d7cb1   andryeyev   Page + Языковая в...
21
22
23
24
25
26
27
28
29
30
31
32
      public function getLangUrl()
      {
          if ($this->_lang_url === null) 
          {
  	        $this->_lang_url = $this->getUrl();
  	        
  	    	$url_list = explode ('/', $this->_lang_url);
  
  	    	$lang_url = isset ($url_list[1]) ? $url_list[1] : null;
  
  	    	Language::setCurrent($lang_url);
  
e3105834   Yarik   Стандартизация
33
34
              if ($lang_url !== null && $lang_url === Language::getCurrent()->language_code
                  && strpos($this->_lang_url, Language::getCurrent()->language_code) === 1)
ab4d7cb1   andryeyev   Page + Языковая в...
35
              {
e3105834   Yarik   Стандартизация
36
                  $this->_lang_url = substr ($this->_lang_url, strlen (Language::getCurrent()->language_code) + 1);
ab4d7cb1   andryeyev   Page + Языковая в...
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
              }
          }
  
          return $this->_lang_url;
      }
  
      protected function resolvePathInfo()
      {
          $pathInfo = $this->getLangUrl();
  
          if (($pos = strpos ($pathInfo, '?')) !== false) 
          {
              $pathInfo = substr ($pathInfo, 0, $pos);
          }
  
          $pathInfo = urldecode ($pathInfo);
  
          // try to encode in UTF8 if not so
          // http://w3.org/International/questions/qa-forms-utf-8.html
          if (! preg_match ('%^(?:
              [\x09\x0A\x0D\x20-\x7E]              # ASCII
              | [\xC2-\xDF][\x80-\xBF]             # non-overlong 2-byte
              | \xE0[\xA0-\xBF][\x80-\xBF]         # excluding overlongs
              | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}  # straight 3-byte
              | \xED[\x80-\x9F][\x80-\xBF]         # excluding surrogates
              | \xF0[\x90-\xBF][\x80-\xBF]{2}      # planes 1-3
              | [\xF1-\xF3][\x80-\xBF]{3}          # planes 4-15
              | \xF4[\x80-\x8F][\x80-\xBF]{2}      # plane 16
              )*$%xs', $pathInfo)
          ) 
          {
              $pathInfo = utf8_encode($pathInfo);
          }
  
          $scriptUrl = $this->getScriptUrl();
1083271e   andryeyev   + идентификатор I...
72
          
ab4d7cb1   andryeyev   Page + Языковая в...
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
          $baseUrl = $this->getBaseUrl();
  
          if (strpos($pathInfo, $scriptUrl) === 0) 
          {
              $pathInfo = substr($pathInfo, strlen($scriptUrl));
          } 
          else if ($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[0] === '/') 
          {
              $pathInfo = substr ($pathInfo, 1);
          }
1083271e   andryeyev   + идентификатор I...
96
   
ab4d7cb1   andryeyev   Page + Языковая в...
97
98
99
          return (string) $pathInfo;
      }
  }