Yii urlManager язык в URL - PullRequest
       9

Yii urlManager язык в URL

4 голосов
/ 04 апреля 2010

Я пытаюсь добавить язык в URL со следующим синтаксисом: http://www.example.com/en/site/page/view/about

То, что у меня есть, работает с короткими URL-адресами, такими как: http://www.example.com/en/site/contact, но не с длинным, как вмой первый пример

Вот что у меня есть:

/ config / main.php

'urlManager'=>array(
    'class'=>'application.components.MyCUrlManager',
    'urlFormat'=>'path', 'showScriptName'=>false,
    'rules'=>array(
        '<language:\w+>/<controller:\w+>/<id:\d+>'=>'<controller>/view',
        '<language:\w+>/<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>',
        '<language:\w+>/<controller:\w+>/<action:\w+>'=>'<controller>/<action>',
    ),
),

<?php // components/MyCUrlManager.php

class MyCUrlManager extends CUrlManager
{
    public function createUrl($route,$params=array(),$ampersand='&')
    {
        if(isset($_POST['_lang']))
        {
            Yii::app()->setLanguage($_POST['_lang']);
            $route['language']=Yii::app()->language;
        }
        elseif (!isset($route['language']))
        {
            $route['language']=Yii::app()->language;
        }
        else
        {
            Yii::app()->setLanguage($route['language']);
        }
        return parent::createUrl($route, $params, $ampersand);
    }
}
?>

class LangBox extends CWidget {

    public function run() {

        $currentLang = Yii::app()->language;
        require_once 'Zend/Locale.php';
        $locale = new Zend_Locale();
        //$siteLanguages = $this->getLang();
        $siteLanguages = array('en','de','tr');
        foreach($siteLanguages as $value){
                $list[$value] = $locale->getTranslation($value, 'Language', $value);
        }
        asort($list);
        $this->render('langBox', array('currentLang' => $currentLang, 'list'=>$list));
    }
}

1 Ответ

5 голосов
/ 07 января 2011

У меня была такая же проблема, и следующие правила работают для меня также с подмодулями и любым количеством параметров:

                 '<lang:[a-z]{2}>/<_m>/<_c>' => '<_m>/<_c>',
                 '<lang:[a-z]{2}>/<_m>/<_c>/<_a>*' => '<_m>/<_c>/<_a>',
                 '<lang:[a-z]{2}>/<_m>/<_a>' => '<_m>/<_a>',
                 '<lang:[a-z]{2}>/<_c>' => '<_c>',
                 '<lang:[a-z]{2}>/<_c>/<_a>' => '<_c>/<_a>',

_m - это специальное значение для модуля, _c для контроллера и _a для действия.

...