Re: LangUrlManager
Добавлено: 2011.03.03, 21:00
Работает, спасибо !
Если использовать это расширение как есть, то появляется проблема с редиректом.Ekstazi писал(а):Хм, да я могу так кинуть, ща:
Последняя версия. Её пока нигде нет.
Код: Выделить всё
$this->redirect(Yii::app()->user->returnUrl)
kdmult писал(а):Если использовать это расширение как есть, то появляется проблема с редиректом.Ekstazi писал(а):Хм, да я могу так кинуть, ща:
Последняя версия. Её пока нигде нет.
Например, в стандартном сгенерированном приложении, при успешном выполнении действия login происходит такой редирект:В returnUrl (и в homeUrl) лежит строка '/index.php'. В результате после редиректа в Yii::app()->language лежит значение из конфига, а не то, что было выбрано до логина.Код: Выделить всё
$this->redirect(Yii::app()->user->returnUrl)
Как правильно побороть это?
Код: Выделить всё
<?php
/**
* This extension allows you to pass the application language via an url
* and then use it for all further generated urls.
* @author Ekstazi http://yii-blog.blogspot.com
* @author Pelesh Yaroslav aka Tokolist http://tokolist.com
* @version 1.0
*/
class LangUrlManager extends CUrlManager
{
public $languages=array('en');
public $langParam='lang';
public $langCookieName=false;
public $langCookieDomain=false;
protected function getCookieLang()
{
$cookieLang = false;
if(!empty($this->langCookieName))
{
$cookies = Yii::app()->getRequest()->getCookies();
if(isset($cookies[$this->langCookieName]))
{
$cookieLang = $cookies[$this->langCookieName]->value;
}
}
return $cookieLang;
}
protected function setCookieLang()
{
if(!empty($this->langCookieName))
{
$cookies = Yii::app()->getRequest()->getCookies();
if(!isset($cookies[$this->langCookieName])
|| $cookies[$this->langCookieName]->value != Yii::app()->language)
{
$cookie = new CHttpCookie($this->langCookieName,Yii::app()->language);
$cookie->expire = time() + 60*60*24*365; //1 year
if(!empty($this->langCookieDomain))
$cookie->domain = $this->langCookieDomain;
$cookies[$this->langCookieName] = $cookie;
}
}
}
protected function getPreferredLang()
{
return Yii::app()->getRequest()->getPreferredLanguage();
}
public function setAppLanguage()
{
//If language pass via url use it
if(isset($_GET[$this->langParam]) && in_array($_GET[$this->langParam],$this->languages))
{
Yii::app()->language = $_GET[$this->langParam];
}
//Else if lang cookie is setted
elseif(in_array($cookieLang=$this->getCookieLang(),$this->languages))
{
Yii::app()->language = $cookieLang;
}
//Else if preffered language is allowed
elseif(in_array($prefferedLang=$this->getPreferredLang(),$this->languages))
{
Yii::app()->language = $prefferedLang;
}
//Else use the first language from the list
else
{
Yii::app()->language = $this->languages[0];
}
//Remember lang in cookies
$this->setCookieLang();
}
public function createUrl($route, $params=array(), $ampersand='&')
{
if(!isset($params[$this->langParam]))
{
$params[$this->langParam]=Yii::app()->language;
}
return parent::createUrl($route,$params,$ampersand);
}
public function createLangUrl($language, $ampersand='&')
{
$route = Yii::app()->controller->route;
$params = $_GET;
unset($params[$this->routeVar]);
$params[$this->langParam] = $language;
return parent::createUrl($route,$params,$ampersand);
}
}
Код: Выделить всё
public function init()
{
parent::init();
Yii::app()->urlManager->setAppLanguage();
}
Код: Выделить всё
<?php
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
/**
* Description of LangUrlManager
*
* @author Ekstazi
* @ver 1.2
*/
class LangUrlManager extends CUrlManager{
public $languages=array('ru', 'en');
public $langParam='language';
public function parsePathInfo($pathInfo)
{
parent::parsePathInfo($pathInfo);
$userLang=Yii::app()->getRequest()->getPreferredLanguage();
//if language pass via url use it
if(isset($_GET[$this->langParam])&&in_array($_GET[$this->langParam],$this->languages)){
Yii::app()->language=$_GET[$this->langParam];
Yii::app()->request->cookies[$this->langParam] = new CHttpCookie($this->langParam, $_GET[$this->langParam]);
//else if isset lang in cookies
}elseif(isset( Yii::app()->request->cookies[$this->langParam] )){
Yii::app()->language = Yii::app()->request->cookies[$this->langParam]->value;
//else if preffered language is allowed
}elseif(in_array($userLang,$this->languages)) {
Yii::app()->language=$userLang;
//else use the first language from the list
}else Yii::app()->language=$this->languages[0];
}
//put your code here
public function createUrl($route, $params=array(), $ampersand='&'){
if(!isset($params[$this->langParam])) $params[$this->langParam]=Yii::app()->language;
return parent::createUrl($route,$params,$ampersand);
}
//put your code here
}
Код: Выделить всё
<?= CHtml::link ('<span class="ru">по-русски</span>', array(''.Yii::app()->request->getQueryString(),
Yii::app()->urlManager->langParam=>'ru'),
));?>
Я так сделалPlutDem писал(а):Господа, а как ссылки, то создать для переключения языка, что бы ссылались на текущую страницу?
Сделал вот так,но в этом случае к ссылке не присоединяются $_GET параметры.Код: Выделить всё
<?= CHtml::link ('<span class="ru">по-русски</span>', array(''.Yii::app()->request->getQueryString(), Yii::app()->urlManager->langParam=>'ru'), ));?>
Как это привольно сделать ?
Код: Выделить всё
<?php
$route = Yii::app()->urlManager->parseUrl(Yii::app()->getRequest());
$params = $_GET;
$params['lang'] = 'en';
$url = $this->createUrl('/'.$route,$params);
?>
Код: Выделить всё
'<language:ru|en>/<controller:\w+>/<id:\d+>' => '<controller>/view'
'<language:ru|en>/<controller:\w+>/<action:\w+>/<id:\d+>' => '<controller>/<action>'
'<language:ru|en>/<controller:\w+>/<action:\w+>' => '<controller>/<action>'
Код: Выделить всё
'<language:ru|en>/<controller:\w+>' => '<controller>/index'