1

$route の先頭に言語パラメーターを追加するためのカスタム UrlManager を作成しました。

$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;
    }

  ...... 

}
4

1 に答える 1