Префикс в url

Суть такова.

Есть ссылки вида /news/cat/10

Надо сделать, чтобы работало /<city>/news/cat/10

где city – название города из списка.

Пытался сделать роуты – 404

Пытался сделать так




$cityArray = $cfgArray['params']['cityDomain'];

$cityString = "(".implode("|", array_keys($cityArray)).")/";

$additional = array();

foreach($cfgArray['components']['urlManager']['rules'] as $pattern=>$route ){

	if( is_string($pattern) ){

		$additional[$cityString.$pattern] = $route;

	}

}




$cfgArray['components']['urlManager']['rules'] = array_merge($cfgArray['components']['urlManager']['rules'],$additional);

return $cfgArray;



Тут работают ссылки вида /<city>/news/88/<news_title>

А на /<city>/news/cat/10 – опять 404

Где news_title просто значение, которое берется из базы.

3 прогера думают над проблемой уже дня 3-4 ничего не выходит(

:blink:

Что вы делаете кодом? Разве роутинг уже настраивается не в конфиг файле?

[color=#1C2837][size=2]/<city>/news/cat/10[/size][/color]

[color=#1C2837][size=2]

[/size][/color]


'<city:\w+>/<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>',

?

Ну так это и есть часть конфиг файла

Все равно не работает(

Ни разу не видел что бы в конфиг файле юзался цикл, поэтому был удивлен.

Ошибаетесь, оно работает. Но зависит от многих деталей.

Например такое правило будет конфликтовать с:


'<module:\w+>/<controller:\w+>/<action:\w+>/<id:\d+>'=>'<module>/<controller>/<action>',

и использовать модули у вас получится только если перечислить их имена:


'<module:(mod1|mod2)>/<controller:\w+>/<action:\w+>/<id:\d+>'=>'<module>/<controller>/<action>',

Но я отвлекся, за модули вы не спрашивали.

У меня сработало правило, которое любезно предоставил someone. По ссылке /Dnepr/site/test/25 было вызвано действие "test" в контроллере "site" которому было переданы GET переменные city и id.

Вызывает недоумение, что именно у вас не сработало.

PS: если пройти по ссылкк /Dnepr/site/test (без указания id) то она перестанет попадать под правило от someone и будет вызвано действие "site" у контроллера "Dnepr" (которого не существует) или что-то еще не менее ошибочное. Может у вас была такая ситуация.

PSS: доп. материалы

Наиболее легким способом будет <city> вынести в поддомен. Тут написано как это сделать.

Делал я такое когда-то.

Создаёшь свой класс унаследованный от CBaseUrlRule.

В нём переопределяешь методы CreateUrl и ParseUrl

Указываешь этот класс UrlManager-у в конфиге.

В документации есть пример:


array(

  // a standard rule

  '<action:(login|logout)>' => 'site/<action>',

  // a custom rule

  array(

    'class' => 'application.components.MyUrlRule',

  ),

Ну а уж в своих методах CreateUrl и ParseUrl можешь извращаться как хочешь, полная свобода действий.