D
D
Dilik Pulatov2017-06-21 10:09:42
Yii
Dilik Pulatov, 2017-06-21 10:09:42

Yii2 redirect() not working correctly in multilingual site?

Hello!
I made a website while reading this article
, but when redirecting something went wrong,
for example, if I write like this

$this->redirect(['login']);
или
$this->redirect(['/login']);

then it redirects to login and not site.com/login
I think something is wrong here
because when there is a language prefix in the urel, then the redirect works correctly
<?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;
  }
}

Answer the question

In order to leave comments, you need to log in

1 answer(s)
M
Maxim Timofeev, 2017-06-21
@dilikpulatov

Ready and working UrlManager for multilingualism, with help and docs: https://github.com/codemix/yii2-localeurls
Video on multilingualism in general:
https://youtu.be/J9IZFXcIKb4

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question