第二,自定义UrlManager::createUrl()崩溃widget-create-link



我已经创建了一个自定义UrlManager,用于在$route的开头添加语言参数。

它的作用是使$route="site/index" --> $route="en/site/index"(或其他当前使用的语言)

它正在工作,但我有一些页面,我不希望"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中的链接也有一些错误。

如何让我的自定义Url路由与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;
    }
  ...... 
}

尝试将语言设置为$_GET参数

在你自定义的"protected/components/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;
}

相关内容

最新更新