dilikpulatov
@dilikpulatov
веб-программист

Yii2 redirect() не правильно работает в многоязычный сайте?

Здравствуйте!
сделал сайт читая этого статья
но при редиректе что-то пошёл не так
например если я пишу так
$this->redirect(['login']);
или
$this->redirect(['/login']);

то он редиректирует в login а не site.com/login

думаю здесь что-то не так
потому что когда в уреле есть префикс языка то редирект правильно работает
<?php
namespace app\components;

use Yii;
use yii\web\Request;
use app\models\Language;

class LangRequest extends Request{
  private $_lang_url;
  public function getLangUrl(){
    if ($this->_lang_url === null) {
      $this->_lang_url = $this->getUrl();
      if(empty(Yii::$app->controller->module)){
      	$url_list = explode('/', $this->_lang_url);
        if(isset($url_list[1]) && $url_list[1] !== Yii::$app->session->get('__lang')){
          Language::setCurrent($url_list[1]);
        }
      	$lang_url = Yii::$app->session->get('__lang');
        if( $lang_url !== null && $lang_url === Yii::$app->session->get('__lang') && strpos($this->_lang_url, Yii::$app->session->get('__lang')) === 1 ){
          $this->_lang_url = substr($this->_lang_url, strlen(Yii::$app->session->get('__lang'))+1);
        }
      }
    }
    return $this->_lang_url;
  }

  protected function resolvePathInfo(){
    $pathInfo = $this->getLangUrl();
    if (($pos = strpos($pathInfo, '?')) !== false) {
      $pathInfo = substr($pathInfo, 0, $pos);
    }

    $pathInfo = urldecode($pathInfo);

      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();
      $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[0] === '/') {
        $pathInfo = substr($pathInfo, 1);
      }

      return (string) $pathInfo;
  }
}
  • Вопрос задан
  • 246 просмотров
Решения вопроса 1
webinar
@webinar Куратор тега Yii
Учим yii: https://youtu.be/-WRMlGHLgRg
Готовый и рабочий UrlManager для мультиязычности, с хелпами и доками: https://github.com/codemix/yii2-localeurls
Видео по мультиязычности в целом:
https://youtu.be/J9IZFXcIKb4
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы