neronmoon
(Krasnoperov)
July 4, 2012, 10:59am
1
Суть такова.
Есть ссылки вида /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 ничего не выходит(
Charger
(Charger)
July 4, 2012, 1:13pm
2
Что вы делаете кодом? Разве роутинг уже настраивается не в конфиг файле?
someone
(198506)
July 4, 2012, 3:40pm
3
[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>',
?
neronmoon
(Krasnoperov)
July 5, 2012, 2:12am
4
Ну так это и есть часть конфиг файла
Charger
(Charger)
July 5, 2012, 3:30am
6
Ни разу не видел что бы в конфиг файле юзался цикл, поэтому был удивлен.
Ошибаетесь, оно работает. Но зависит от многих деталей.
Например такое правило будет конфликтовать с:
'<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: доп. материалы
Shiftok
(Svizev Igor)
July 17, 2012, 4:01pm
7
Наиболее легким способом будет <city> вынести в поддомен. Тут написано как это сделать.
eresik
(Eresik)
July 17, 2012, 4:42pm
8
Делал я такое когда-то.
Создаёшь свой класс унаследованный от CBaseUrlRule.
В нём переопределяешь методы CreateUrl и ParseUrl
Указываешь этот класс UrlManager-у в конфиге.
В документации есть пример:
array(
// a standard rule
'<action:(login|logout)>' => 'site/<action>',
// a custom rule
array(
'class' => 'application.components.MyUrlRule',
),
Ну а уж в своих методах CreateUrl и ParseUrl можешь извращаться как хочешь, полная свобода действий.