@EVOSandru6

Как в модуле Yii можно перебить правила CUrlManager?

такая проблема, унаследовал от CUrlManager:

class UrlManager extends CUrlManager
{
    public function createUrl($route,$params=array(),$ampersand='&')
    {
        if (!isset($params['language'])) {
            if (Yii::app()->user->hasState('language'))
                Yii::app()->language = Yii::app()->user->getState('language');
            else if(isset(Yii::app()->request->cookies['language']))
                Yii::app()->language = Yii::app()->request->cookies['language']->value;
            $params['language']=Yii::app()->language;
        }
        return parent::createUrl($route, $params, $ampersand);
    }
}


И теперь у меня в url сразу после домена идет ru/ или другойязык/ приставка

В клиентской глюков пока не наблюдалось, но вот в модуле админке на экшены нужного контроллера могу попасть только если в адресной строке убрать ru/ илидругойязык/ . Еще почему-то в ссылках нужно после языковой приставки через / указывать названия модуля, чтобы не вылететь в клиентскую часть.

Вот Конфигурация Url менеджера:

'urlManager'=>array(
            'class'=>'application.components.UrlManager',
            'urlFormat'=>'path',
            'showScriptName'=>false,
            'rules'=>array(
                '<language:(ru|en|kz|de|ch|tu|ar)>/' => 'site/index',
                '<language:(ru|en|kz|de|ch|tu|ar)>/<action:(contact|login|logout)>/*' => 'site/<action>',
                '<language:(ru|en|kz|de|ch|tu|ar)>/<controller:\w+>/<id:\d+>'=>'<controller>/view',
                '<language:(ru|en|kz|de|ch|tu|ar)>/<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>',
                '<language:(ru|en|kz|de|ch|tu|ar)>/<controller:\w+>/<action:\w+>/*'=>'<controller>/<action>',
                '<language:(ru|en|kz|de|ch|tu|ar)>/<module:\w+>/<controller:\w+>/<action:\w+>/<id:\d+>' => '<module>/<controller>/<action>/<id>',
                '<language:(ru|en|kz|de|ch|tu|ar)>/<module:\w+>/<controller:\w+>/<action:\w+>' => '<module>/<controller>/<action>',

            ),
        ),


Как я думаю тут решение может быть следующим:
1. Создать новый конфиг в админке и не использовать и закоментить в ней 'class'=>'application.components.UrlManager' ( но тогда я не смогу пользоваться мультиязычностью в админке и не знаю как подключить config внутри модуля)
2. Как то все же допилить правила основного конфига

Помогите люди добрые! Очень интересны соображения и ссылочки по обоим пунктам.
  • Вопрос задан
  • 2522 просмотра
Решения вопроса 1
mishamx
@mishamx
Web-Developer
Посмотри реализацию https://github.com/mishamx/yii-multilanguage хотя там тоже не всё идеально, в модулях нельзя короткие адреса использовать без имени моуля
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
Arks
@Arks
никто не мешает создать админке отдельный конфиг и точку входа или разделить на уровне приложений.
Оба конфига должны наследоваться от базового. Понятно что мешать все в кучу это как-то странно.
Ответ написан
IvanCher
@IvanCher
Мысли шире
Правила сравниваются сверху вниз и берется первое совпадение.
Например, если запрос /ru/edit-post/12 должен нас отправлять в модуль админки по пути admin-module/post/edit и передавать id поста 12. Тогда правила выглядят примерно так:
'rules'=>array(
    '<language:(ru|en|kz|de|ch|tu|ar)>/' => 'site/index',
    '<language:(ru|en|kz|de|ch|tu|ar)>/<action:edit-post>/<id:\d+>' => 'admin-module/post/<action>',
    ...
),


Но, разумеется, так не очень красиво получиться перечислять все нужные Вам экшены модулей. Поэтому напишите свой класс правила и поместите в него всю логику. Я не знаю, какие у Вас модули и контроллеры, и какие требуются для них пути, поэтому тут подсказать уже не могу.
Можете почитать про пользовательские классы урл-правил тут.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы