UrlManager is configured as an application component in Application by default. You can access that instance via Yii::$app->urlManager. You can modify its configuration by adding an array to your application config under components as it is shown in the following example: php 'urlManager' => [ 'enablePrettyUrl' => true, 'rules' => [ your rules go here ], ... ]
С версии: 2.0
Автор: Qiang Xue (qiang.xue@gmail.com)
Наследование: extends yii\base\Component
Пример #1
21
 public function createUrl($params)
 {
     $url = parent::createUrl($params);
     if ($this->enableAppendLang) {
         $url = MultilangHelper::addLangToUrl($url);
     }
     return $url;
 }
Пример #2
0
 public function actionIndex()
 {
     \Yii::$app->language = 'ru-Ru';
     $u = new UrlManager();
     $newHome = $u->createUrl('items/index');
     //var_dump($st);exit();
     Yii::$app->homeUrl = $newHome;
     return $this->goHome();
 }
Пример #3
0
 /**
  * @inheritdoc
  */
 public function createUrl($params)
 {
     if (!isset($params['language'])) {
         $params['language'] = Yii::$app->language;
     }
     return parent::createUrl($params);
 }
Пример #4
0
 /**
  * Initializes UrlManager.
  */
 public function init()
 {
     parent::init();
     if (Yii::$app->request->getIsConsoleRequest()) {
         return true;
     }
     //set $this->langBegin is empty
     $this->setLangBegin();
     $request = Yii::$app->getRequest();
     $sourcePathInfo = $request->getPathInfo();
     $endSlash = '';
     if ($this->normalizer !== false) {
         $pathInfo = $this->normalizer->normalizePathInfo($sourcePathInfo, (string) $this->suffix, $this->normalized);
         if ($sourcePathInfo !== $pathInfo) {
             $endSlash = '/';
         }
     } else {
         $pathInfo = rtrim($sourcePathInfo, '/');
     }
     $suffix = (string) $this->suffix;
     if ($suffix !== '' && $pathInfo !== '') {
         $n = strlen($this->suffix);
         if (substr_compare($pathInfo, $this->suffix, -$n, $n) === 0) {
             $pathInfo = substr($pathInfo, 0, -$n);
             if ($pathInfo === '') {
                 // suffix alone is not allowed
                 throw new NotFoundHttpException(Yii::t('yii', 'Page not found.'));
             }
         } else {
             // suffix doesn't match
             throw new NotFoundHttpException(Yii::t('yii', 'Page not found.'));
         }
     }
     if ($this->enableLang) {
         if ($pathInfo != '') {
             if (strpos($pathInfo, '/') !== false) {
                 $segments = explode('/', $pathInfo);
                 $_GET[$this->langParam] = $segments['0'];
                 unset($segments['0']);
                 $pathInfo = join('/', $segments);
             } else {
                 if (in_array($pathInfo, $this->langBegin)) {
                     $_GET[$this->langParam] = $pathInfo;
                     $pathInfo = '';
                 }
             }
         } else {
             $_GET[$this->langParam] = reset($this->langBegin);
         }
     }
     $event = new UrlManagerEvent(['pathInfo' => $pathInfo]);
     $this->trigger(self::EVENT_INIT, $event);
     if (isset($_GET)) {
         foreach ($_GET as $k => $v) {
             $this->gets[$k] = $v;
         }
     }
     $request->setPathInfo($event->pathInfo . $endSlash);
     $this->_pathInfo = $event->pathInfo;
 }
Пример #5
0
 public function createUrl($params)
 {
     if (isset($params['lang_id'])) {
         //Если указан идентификатор языка, то делаем попытку найти язык в БД,
         //иначе работаем с языком по умолчанию
         $lang = Lang::findOne($params['lang_id']);
         if ($lang === null) {
             $lang = Lang::getDefaultLang();
         }
         unset($params['lang_id']);
     } else {
         //Если не указан параметр языка, то работаем с текущим языком
         $lang = Lang::getCurrent();
     }
     //Получаем сформированный URL(без префикса идентификатора языка)
     $url = parent::createUrl($params);
     //Добавляем к URL префикс - буквенный идентификатор языка
     if ($url == '/') {
         return '/' . $lang->url;
     } else {
         if (YII_DEBUG && !empty(Yii::$app->params['mainPathCount'])) {
             $url_list = explode('/', $url);
             $mainPath = [];
             for ($i = 0; $i <= Yii::$app->params['mainPathCount']; $i++) {
                 $mainPath[] = array_shift($url_list);
             }
             $url_list = array_merge($mainPath, [$lang->url], $url_list);
             return join('/', $url_list);
         }
         return '/' . $lang->url . $url;
     }
 }
Пример #6
0
 public function init()
 {
     parent::init();
     $event = new UrlRuleCacheEvent(["ruleCache" => $this->_ruleCache, "urlManager" => $this]);
     $this->trigger(static::EVENT_INIT_RULECACHE, $event);
     $this->_ruleCache = $event->ruleCache;
 }
Пример #7
0
 /**
  * @inheritdoc
  */
 public function createUrl($params)
 {
     $params = (array) $params;
     $language = $this->getLanguage(isset($params['language']) ? $params['language'] : self::DEFAULT_KEY);
     unset($params['language']);
     return '/' . $language->url . '/' . ltrim(parent::createUrl($params), '/');
 }
Пример #8
0
 /**
  * [createUrl description]
  * @param  [type] $params [description]
  * @return [type]         [description]
  */
 public function createUrl($params)
 {
     $defaultLang = Lang::getDefaultLang();
     if (isset($params[1]) && isset($params[1]['lang_id'])) {
         // Если указан идентификатор языка, то делаем попытку найти язык в БД, иначе работаем с языком по умолчанию.
         $lang = Lang::findOne(['url' => $params[1]['lang_id']]);
         if ($lang === null) {
             $lang = $defaultLang;
         }
         unset($params[1]['lang_id']);
     } else {
         // Если не указан параметр языка, то работаем с текущим языком.
         $lang = Lang::getCurrent();
     }
     // Получаем сформированный URL(без префикса идентификатора языка).
     $url = parent::createUrl($params);
     if ($lang->url == $defaultLang->url) {
         return $url;
     }
     // Добавляем к URL префикс - буквенный идентификатор языка.
     if ($url == '/') {
         return '/' . $lang->url;
     } else {
         return '/' . $lang->url . $url;
     }
 }
Пример #9
0
 public function createUrl($params)
 {
     if (isset($params['q'])) {
         unset($params['q']);
     }
     return parent::createUrl($params);
 }
Пример #10
0
 public function parseRequest($request)
 {
     $route = parent::parseRequest($request);
     //        $route = lcfirst(str_replace(' ', '', ucwords(str_replace('-', ' ', $route))));
     if ($this->_isExcluded($route[0])) {
         $requestLang = Yii::$app->lang->getDefault();
     } else {
         if (isset($route[1][$this->languageVar])) {
             $requestLang = $route[1][$this->languageVar];
         } else {
             if (isset($route[0]) && $route[0] === Yii::$app->defaultRoute) {
                 header('HTTP/1.1 301 Moved Permanently');
                 header('Location: /' . Yii::$app->lang->get());
                 exit;
             } else {
                 throw new HttpException(404, Yii::t('app', 'Page not found'));
             }
         }
     }
     Yii::$app->language = Yii::$app->lang->get();
     if (!Yii::$app->lang->checkLang($requestLang)) {
         throw new HttpException(404, Yii::t('app', 'Page not found'));
     } else {
         if (Yii::$app->language !== $requestLang) {
             Yii::$app->lang->update($requestLang);
         }
     }
     return $route;
 }
Пример #11
0
 public function createUrl($params)
 {
     if ($this->selectedLanguageIsNotTheDefalutLanguage() && $this->isSelectedLanguageSupported()) {
         $params['language'] = Yii::$app->language;
     }
     return parent::createUrl($params);
 }
 public function createUrl($params)
 {
     if (isset($params['title'])) {
         $params['title'] = $this->clean(self::normal_chars($params['title']));
     }
     return parent::createUrl($params);
 }
Пример #13
0
 /**
  * @inheritdoc
  */
 public function createUrl($params)
 {
     $params = (array) $params;
     $localeUrls = Yii::$app->localeUrls;
     if (isset($params[$this->languageParam])) {
         $language = $params[$this->languageParam];
         unset($params[$this->languageParam]);
         $languageRequired = true;
     } else {
         $language = Yii::$app->language;
         $languageRequired = false;
     }
     $url = parent::createUrl($params);
     // Unless a language was explicitely specified in the parameters we can return a URL without any prefix
     // for the default language, if suffixes are disabled for the default language. In any other case we
     // always add the suffix, e.g. to create "reset" URLs that explicitely contain the default language.
     if (!$languageRequired && !$localeUrls->enableDefaultSuffix && $language === $localeUrls->getDefaultLanguage()) {
         return $url;
     } else {
         $key = array_search($language, $localeUrls->languages);
         $base = $this->showScriptName ? $this->getScriptUrl() : $this->getBaseUrl();
         $length = strlen($base);
         if (is_string($key)) {
             $language = $key;
         }
         return $length ? substr_replace($url, "{$base}/{$language}", 0, $length) : "/{$language}{$url}";
     }
 }
 public function createUrl($params)
 {
     if (isset($params['language']) && $params['language'] === false || isset($params[0]) && in_array($params[0], $this->nonMultilingualUrls)) {
         unset($params['language']);
         return parent::createUrl($params);
     }
     if (Yii::$app->yee->isMultilingual && !empty($this->multilingualRules)) {
         $languages = array_keys(Yii::$app->yee->displayLanguages);
         //remove incorrect language param
         if (isset($params['language']) && !in_array($params['language'], $languages)) {
             unset($params['language']);
         }
         //trying to get language param
         if (!isset($params['language'])) {
             if (Yii::$app->session->has('language')) {
                 $language = Yii::$app->session->get('language');
             } elseif (isset(Yii::$app->request->cookies['language'])) {
                 $language = Yii::$app->request->cookies['language']->value;
             } else {
                 $language = Yii::$app->language;
             }
             if (in_array($language, $languages)) {
                 Yii::$app->language = $language;
             }
             $params['language'] = Yii::$app->yee->getDisplayLanguageShortcode(Yii::$app->language);
         }
     }
     return parent::createUrl($params);
 }
Пример #15
0
 public function createAbsoluteUrl($params, $scheme = null)
 {
     $params = (array) $params;
     if (!isset($params['language'])) {
         $params['language'] = Yii::$app->language;
     }
     return parent::createAbsoluteUrl($params);
 }
Пример #16
0
 /**
  * Creates a URL using the given route and query parameters.
  * Add lang param before route
  */
 public function createUrl($params)
 {
     $params = array_merge(['lang' => $this->currLang], (array) $params);
     $lang = $params['lang'];
     if ($this->enablePrettyUrl) {
         unset($params['lang']);
     }
     $url = parent::createUrl($params);
     return $this->enablePrettyUrl ? '/' . $lang . ($url === '/' ? '' : $url) : $url;
 }
 public function parseRequest($request)
 {
     $hostInfo = $request->getHostInfo();
     $arr = explode('://', $hostInfo);
     $host = $arr[1];
     $arr = explode('.' . $this->baseDomain, $host);
     $subDomain = $arr[0];
     $request->setQueryParams(array_merge($request->getQueryParams(), [$this->subDomainKey => $subDomain]));
     return parent::parseRequest($request);
 }
Пример #18
0
 /**
  * @inheritdoc
  */
 public function createUrl($params)
 {
     $params = (array) $params;
     $anchor = isset($params['#']) ? $params['#'] : '';
     $localeUrls = Yii::$app->localeUrls;
     if (isset($params[$this->languageParam])) {
         $language = $params[$this->languageParam];
         unset($params[$this->languageParam]);
         $languageRequired = true;
     } else {
         $language = Yii::$app->language;
         $languageRequired = false;
     }
     // if disable param is set return default url
     if (isset($params[$this->disableLocalesParam])) {
         unset($params[$this->disableLocalesParam]);
         return parent::createUrl($params);
     }
     $url = parent::createUrl($params);
     // Unless a language was explicitely specified in the parameters we can return a URL without any prefix
     // for the default language, if suffixes are disabled for the default language. In any other case we
     // always add the suffix, e.g. to create "reset" URLs that explicitely contain the default language.
     if (!$languageRequired && !$localeUrls->enableDefaultSuffix && $language === $localeUrls->getDefaultLanguage()) {
         return $url;
     } else {
         $key = array_search($language, $localeUrls->languages);
         $base = $this->showScriptName ? $this->getScriptUrl() : $this->getBaseUrl();
         $length = strlen($base);
         if (is_string($key)) {
             $language = $key;
         }
         $parts = parse_url($url);
         if (isset($parts['scheme'], $parts['host'], $parts['path'])) {
             if ($length) {
                 $parts['path'] = trim(substr_replace($parts['path'], sprintf('%s/%s', $base, $language), 0, $length), '/');
             } else {
                 $parts['path'] = trim(sprintf('%s%s', $language, $parts['path']), '/');
             }
             $fullpath = sprintf('%s://%s/%s%s', $parts['scheme'], $parts['host'], $parts['path'], $this->suffix);
             if ($anchor) {
                 $fullpath = sprintf('%s#%s', $fullpath, $anchor);
             }
             if (isset($parts['query'])) {
                 return sprintf('%s?%s', $fullpath, $parts['query']);
             }
             return $fullpath;
         }
         if ($length) {
             $path = substr_replace($url, "{$base}/{$language}", 0, $length);
         } else {
             $path = "/{$language}{$url}";
         }
         return $path . $anchor;
     }
 }
Пример #19
0
 /**
  * @param array|string $params
  * @return string
  */
 public function createUrl($params)
 {
     $params = (array) $params;
     $language = isset($params['language']) ? $params['language'] : Language::getCurrent();
     if (!Language::isLanguage($language)) {
         $language = Language::getCurrent();
     }
     unset($params['route'], $params['language']);
     $params['0'] = $language . '/' . trim($params['0'], '/');
     return parent::createUrl($params);
 }
Пример #20
0
 public function createUrl($params)
 {
     if (empty($params['lang'])) {
         if (Yii::$app->session->has('lang')) {
             Yii::$app->language = Yii::$app->session->get('lang', Yii::$app->language);
         } elseif (Yii::$app->request->cookies->getValue('lang')) {
             Yii::$app->language = Yii::$app->request->cookies->getValue('lang');
         }
         $params['lang'] = Yii::$app->language;
     }
     return parent::createUrl($params);
 }
 /**
  * createUrl
  * Adding language parameter to links
  *
  * @param array $params
  *
  * @return string
  */
 public function createUrl($params)
 {
     if (!isset($params['_language'])) {
         if (Yii::$app->session->has('_language')) {
             Yii::$app->language = Yii::$app->session->get('_language');
         } elseif (Yii::$app->request->cookies->has('_language')) {
             Yii::$app->language = Yii::$app->request->cookies->get('_language');
         }
         $params['_language'] = Yii::$app->language;
     }
     return parent::createUrl($params);
 }
 public function createUrl($params)
 {
     if (!isset($params["lang"])) {
         if (Yii::$app->session->has('lang')) {
             Yii::$app->language = Yii::$app->session->get('lang');
         } elseif (isset(Yii::$app->request->cookies["lang"])) {
             Yii::$app->language = Yii::$app->request->cookies["lang"]->value;
         } else {
             $params['lang'] = Yii::$app->language;
         }
     }
     return parent::createUrl($params);
 }
Пример #23
0
 public function createUrl($params)
 {
     $langPrefix = '';
     if (Yii::$app->getModule('radiata')->activeLanguage->code != Yii::$app->getModule('radiata')->defaultLanguage->code) {
         $langPrefix = '/' . Yii::$app->getModule('radiata')->activeLanguage->code;
     }
     $url = parent::createUrl($params);
     $parsedUrl = parse_url($url);
     if (isset($parsedUrl['scheme']) && $parsedUrl['scheme'] != '') {
         return str_replace($parsedUrl['path'], $langPrefix . $parsedUrl['path'], $url);
     } else {
         return $langPrefix . $url;
     }
 }
Пример #24
0
 /** @inheritdoc */
 public function createUrl($params)
 {
     $params = (array) $params;
     if (array_key_exists($this->languageParam, $params)) {
         $language = Language::fromAlias($params[$this->languageParam]) ?: Language::getDefault();
     } else {
         $language = Language::fromLocal(\Yii::$app->language) ?: Language::getDefault();
     }
     $params[$this->languageParam] = $language->alias;
     if (!$this->showDefaultLanguage && $language->alias === Language::getDefault()->alias) {
         unset($params[$this->languageParam]);
     }
     return parent::createUrl($params);
 }
Пример #25
0
 /**
  * Creates translated url.
  * @param array $params
  * @return string the created URL
  */
 public function createUrl($params)
 {
     if (!empty($params[0])) {
         $route = explode('/', $params[0]);
         if (isset($route[0]) && !empty($this->languageControllers[$this->language][$route[0]])) {
             $route[0] = $this->languageControllers[$this->language][$route[0]];
         }
         if (isset($route[1]) && !empty($this->languageActions[$this->language][$route[1]])) {
             $route[1] = $this->languageActions[$this->language][$route[1]];
         }
         $params[0] = implode('/', $route);
     }
     return parent::createUrl($params);
 }
Пример #26
0
 /**
  * Parse request and set application language
  * @param \yii\web\Request $request
  * @return array|bool
  */
 public function parseRequest($request)
 {
     if (count($this->availableLanguages) > 0) {
         if (preg_match('/\\/(' . implode('|', $this->availableLanguages) . ')(.*)/si', $request->url, $matches)) {
             Yii::$app->language = $matches[1];
         }
     }
     $res = parent::parseRequest($request);
     if (is_array($res)) {
         if (isset($res[1]['language']) && in_array($res[1]['language'], $this->availableLanguages)) {
             Yii::$app->language = $res[1]['language'];
         }
     }
     return $res;
 }
Пример #27
0
 public function createUrl($params)
 {
     if (!Yii::$app->has('composition')) {
         return parent::createUrl($params);
     }
     $links = Yii::$app->get('links', false);
     $composition = Yii::$app->composition->getFull();
     $originalParams = $params;
     $params[0] = $composition . $params[0];
     $response = parent::createUrl($params);
     // we have not found the composition rule matching against rules, so use the original params and try again!
     if (strpos($response, $params[0]) !== false) {
         $params = $originalParams;
         $response = parent::createUrl($params);
     } else {
         // now we have to remove the composition informations from the links to make a valid link parsing (read module)
         $params[0] = str_replace($composition, '', $params[0]);
     }
     $params = (array) $params;
     $moduleName = \luya\helpers\Url::fromRoute($params[0], 'module');
     if ($this->getContextNavItemId() && $links !== null) {
         $link = $links->findOneByArguments(['id' => (int) $this->getContextNavItemId()]);
         $this->resetContext();
         return preg_replace("/{$moduleName}/", $composition . $link['url'], $response, 1);
     }
     $context = false;
     if ($moduleName !== false) {
         $moduleObject = \yii::$app->getModule($moduleName);
         if (method_exists($moduleObject, 'setContext') && !empty($moduleObject->context)) {
             if ($links !== null) {
                 $context = true;
                 $options = $moduleObject->getContextOptions();
                 $link = $links->findOneByArguments(['id' => (int) $options['navItemId']]);
                 $response = preg_replace("/{$moduleName}/", $composition . $link['url'], $response, 1);
             }
         }
     }
     if (!$context) {
         // because the urlCreation of yii returns a realtive url we have to manually add the composition getFull() path.
         $baseUrl = yii::$app->request->baseUrl;
         if (empty($baseUrl)) {
             $response = Url::removeTrailing($composition) . $response;
         } else {
             $response = str_replace($baseUrl, Url::trailing($baseUrl) . Url::removeTrailing($composition), $response);
         }
     }
     return $response;
 }
Пример #28
0
 public function createUrl($params)
 {
     // Url's language such as "en"
     $url_lang = Yii::$app->language;
     // If isset lang param
     if (isset($params['x-language-url'])) {
         // Do not change url
         if ($params['x-language-url'] === false) {
             unset($params['x-language-url']);
             return parent::createUrl($params);
         }
         // If exists language
         $xLang = LangHelper::getLanguageByParam('url', $params['x-language-url']);
         if ($xLang) {
             $url_lang = $xLang['url'];
         }
     }
     $current = LangHelper::getLanguageByParam('locale', $url_lang);
     $isDefault = isset($current['default']) && $current['default'];
     // Delete if is pretty url
     if ($this->enablePrettyUrl || $isDefault) {
         unset($params['x-language-url']);
     }
     $url = parent::createUrl($params);
     if ($current) {
         // Is curent language
         // Pretty url
         if ($this->enablePrettyUrl && !$this->showScriptName) {
             $pattern = "/^" . preg_quote($this->baseUrl, '/') . "/";
             $replaceTo = $this->baseUrl;
             if (!$isDefault) {
                 $replaceTo .= '/' . $url_lang;
             }
             $url = preg_replace($pattern, $replaceTo, $url);
         } else {
             if ($this->enablePrettyUrl && $this->showScriptName) {
                 // Pretty url with showScriptName
                 $pattern = "/^" . preg_quote($this->scriptUrl, '/') . "/";
                 $replaceTo = $this->baseUrl;
                 if (!$isDefault) {
                     $replaceTo .= '/' . $url_lang;
                 }
                 $url = preg_replace($pattern, $replaceTo, $url);
             }
         }
     }
     return $url;
 }
Пример #29
-1
 public function createUrl($params)
 {
     if (isset($params['lang_id'])) {
         //Если указан идентификатор языка, то делаем попытку найти язык в БД,
         //иначе работаем с языком по умолчанию
         $lang = Language::findOne($params['lang_id']);
         if ($lang === null) {
             $lang = \Yii::$app->languageManager->getDefault();
         }
         unset($params['lang_id']);
     } else {
         //Если не указан параметр языка, то работаем с текущим языком
         $lang = \Yii::$app->languageManager->getCurrent();
     }
     //Получаем сформированный URL(без префикса идентификатора языка)
     $url = parent::createUrl($params);
     if ($lang->is_default) {
         return $url;
     } else {
         if ($url == '/') {
             return '/' . $lang->url;
         } elseif (preg_match('/^https?/si', $url)) {
             return preg_replace('#(^https?:\\/\\/[a-zA-Z0-9\\.]+)#', '$1/' . $lang->url, $url);
         } else {
             return '/' . $lang->url . $url;
         }
     }
 }
 public function createUrl($params)
 {
     $default = Languages::all()->getConfigDefault();
     $current = Languages::all()->getConfigCurrent();
     $url_prefix = null;
     if (isset($params['x-language-url']) && !$params['x-language-url']) {
         $params['x-language-url'] = $default['url'];
     }
     if (isset($params['x-language-url']) && Languages::all()->getConfigByParam('url', $params['x-language-url'])) {
         $url_prefix = $params['x-language-url'] === $default['url'] && $this->multilanguageHideDefaultPrefix ? '' : $params['x-language-url'];
         unset($params['x-language-url']);
     }
     //        echo "url_prefix: ";
     //        var_export($url_prefix);
     //        echo "\n";
     //
     //        print_r($params);
     //        exit;
     if ($url_prefix === null) {
         // Иначе подставляем текущий язык
         $url_prefix = Yii::$app->request->getLanguageInurl();
     }
     $url = parent::createUrl($params);
     if ($url_prefix) {
         $url = '/' . $url_prefix . $url;
     }
     return $url;
 }