2014-08-21 3 views
1

Я создал пользовательский UrlManager для добавления параметра языка в начале маршрута $.Yii, custom UrlManager :: createUrl() crash the widget-create-link

что это сделать, это $ маршрут = «сайт/индекс» ---> $ маршрутную = «EN/сайт/индекс» (или другого тока с помощью языка)

Это работает, но я есть на какой-то странице я не хочу, чтобы правило «createUrl» применялось, некоторые виджеты, которые создают ссылки (например, разбиение на страницы CGridView, а также кнопку обновления), будут делать ошибку.

URL of the page  : en/controller/admin/ 
pagination URL created : en/controller/admin/language/en/model_page/2 (error) 
what I want   : en/controller/admin?model_page=2    (this will work) 

Кроме того, ссылка в Gii также имеет некоторые ошибки.

Как я могу выполнить свою обычную маршрутизацию маршрутов с изначальной экологией Yii?


защищенные/Config/main.php

'urlManager'=>array(

     'class' =>'application.components.UrlManager', 
     'urlFormat'=>'path', 
     'showScriptName'=>false, 
     'caseSensitive'=>false,  
     'rules'=>array(
      '<language:(fr|en)>/<controller:\w+>/<action:\w+>/id/<id:\d+>'=>'<controller>/<action>', 
      '<language:(fr|en)>/<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>', 
      '<language:(fr|en)>/<controller:\w+>/<action:\w+>'=>'<controller>/<action>', 
      '<language:(fr|en)>/<controller:\w+>'=>'<controller>', 
     ) 
    ) 

защищенные/компоненты/UrlManager.php

class UrlManager extends CUrlManager{ 

    public function createUrl($route,$params=array(),$ampersand='&'){ 
     $route = Language::addRouteLang($route); 
     return parent::createUrl($route, $params, $ampersand); 
    } 

} 

защищенные/компоненты/Language.php

class Language extends CComponent{ 


    public static $current_lang; 
    public static $current_lang_id; 


    public static function getCurrentLang(){ 
     return self::$current_lang_id; 
    } 


    public static function addRouteLang($route){ 
     //To do : make this get data from dataBase 
     $langList = array('fr', 'en'); 

     //get first para of $route 
     $routeArr = explode("/",$route); 
     $firstPara = $routeArr[0]; 

     if (! in_array($firstPara, $langList)){ 
      //there is no language parameter 

      if (Yii::app()->user->hasState('language')){ 
       //check user State 
       $lang = Yii::app()->user->getState('language'); 
       $route = $lang.'/'.$route; 
      }else if(isset(Yii::app()->request->cookies['language'])){ 
       //check cookies 
       $lang = Yii::app()->request->cookies['language']->value; 
       $route = $lang.'/'.$route; 
      } 
     } 
     return $route; 
    } 

    ...... 

} 

ответ

0

Try сделать язык как параметр $ _GET.

В пользовательских "защищаемого/компоненты/UrlManager.php"

public function createUrl($route,$params=array(),$ampersand='&'){ 
    $params = Language::addParamLang($params); 
    return parent::createUrl($route, $params, $ampersand); 
} 

В классе языка, добавьте

public static function addParamLang($params){ 
    //To do : make this get data from dataBase 
    $langList = array('fr', 'en'); 

    if (Yii::app()->user->hasState('language')){ 
     //check user State 
     $activeLanguage = Yii::app()->user->getState('language'); 
    }else if(isset(Yii::app()->request->cookies['language'])){ 
     //check cookies 
     $activeLanguage = Yii::app()->request->cookies['language']->value; 
    }else{ 
     //default language 
     $activeLanguage = 'fr'; 
     /* additional codes here... */ 
    } 

    if(! isset($params['language'])){ 
     $params['language']=$activeLanguage; 
    } else if (! in_array($params['language'], $langList)){ 
     $params['language']=$activeLanguage; 
    } 

    return $params; 
}