Хак для роутинга
При создании собственного модуля встала задача, чтобы в URLе не присутствовало название экшена, а сразу шел параметр. В сообществе нашел пару постов которые помогли разобраться, но конечного решения так и не было. Хочу поделиться тем, что у меня получилось. Рассмотрим все на примере экшена profile. Переделываем URL страницы пользователя с
site.ru/profile/vasya/
На
site.ru/vasya/
Для этого сначала дописываем в конфиг правила роутинга:
/config/config.php
Добавляем код хака в файл /engine/classes/Router.class.php переделываем функцию RewriteRequest так:
Добавляем код в файл /classes/actions/Init.class.php после строки $this->Hook_Run('init_action'); так:
Могут возникнуть проблемы с именами пользователей совпадающих с экшенами и другими объявлениями роутинга. Как например из-за пользователя admin не будет работать админка сайта. Избавиться от этой проблемы поможет плагин Reserved Users. Данным хаком можно воспользоваться и с другими экшенами аналогично, но как это скажется на движке я гарантии дать не могу у меня вроде все нормально работает пока.
site.ru/profile/vasya/
На
site.ru/vasya/
Для этого сначала дописываем в конфиг правила роутинга:
/config/config.php
$config['router']['uri'] = array(
'~^([a-z_\-]+)$~i' => "profile/\1",
);
Добавляем код хака в файл /engine/classes/Router.class.php переделываем функцию RewriteRequest так:
protected function RewriteRequest($aRequestUrl) {
$sReq=implode('/',$aRequestUrl);
if(!in_array($sReq, array_keys(Config::Get('router.page'))) && $aRewrite=Config::Get('router.uri')) {
$sReq = preg_replace(array_keys($aRewrite), array_values($aRewrite), $sReq);
}
return ($sReq=='') ? array() : explode('/',$sReq);
}
Добавляем код в файл /classes/actions/Init.class.php после строки $this->Hook_Run('init_action'); так:
$this->Hook_Run('init_action');
if (preg_match('/^\/+([^\/]*)/si',str_replace(Config::Get('path.root.web'),'',Router::GetPathWebCurrent()),$aMatches)) {
$sLogin = $aMatches[1];
if ($this->User_GetUserByLogin($sLogin)) {
return Router::Action('profile',$sLogin,array());
}
}
Могут возникнуть проблемы с именами пользователей совпадающих с экшенами и другими объявлениями роутинга. Как например из-за пользователя admin не будет работать админка сайта. Избавиться от этой проблемы поможет плагин Reserved Users. Данным хаком можно воспользоваться и с другими экшенами аналогично, но как это скажется на движке я гарантии дать не могу у меня вроде все нормально работает пока.
12 комментариев
Т.к. получается дублирование одного и того же запроса. С начала для проверки есть ли пользователь с таким логином, а после перенаправления для получения информации о пользователе.
Nice URL плагин я разбирал в целом все ясно, но до конца не въехал как он работает. Если можешь в двух словах объяснить буду очень благодарен. Мне на самом деле всё это нужно для своего модуля, что бы сделать URLы по городам России, а не для профилей юзеров.
ниже уже ответили, нужно пробовать через плагин
Если человек не понимает кода, который ты привел, то, ИМХО, пусть лучше он другой движок выберет, чем в ядро лезть. Или пусть смирится с тем, что «ах, какой длинный УРЛ».
Если ты ЛС чисто как фреймворк юзаешь, то вопросов нет, для тебя, возможно, и обновлять его труда не составит. Но топик твой могут прочитать сотни неопытных новичков, которые, не догадываясь о последствиях, могут полезть править ядро, а потом этот же сайт наполнится воплями-соплями, почему у них сайт не работает. А еще хуже — начнут ломиться к авторам платных плагинов и требовать поддержки, потому что у них «плагин бажный» и не хочет запускаться на их замечательном сайте, правленном их кривыми неопытными ручками.
Я вот отсюда брал базу городов + там еще таблица есть для определения города по IP
Есть советы по решению данной проблемы? :(