Нестандартная логика формирования URL

Вопросы об установке, настройке и работе самого фреймворка

Нестандартная логика формирования URL

Сообщение Скрипник 19 июл 2008, 14:19

Хочу перевести свой проект http://briefly.ru/ на CodeIgniter. Столкнулся со следующей задачей: логика формирования URL в исходном виде у меня довольно непростая: первый сегмент URL может означать и первую букву, и имя автора, и текстовую страницу, и результаты поиска.

Опишу логику чуть подробнее. Если первый сегмент URL равен:
1. одному из зарезервированных слов типа «wanted», «about», «search» и т. д., то подключаются конкретные страницы для каждого из них.
2. транслитерации одной из букв алфавита из таблицы транслитерации в БД, то подключается страница этой конкретной буквы.
3. транслитерации фамилии одного из авторов из таблицы авторов в БД, то открывается страница этого конкретного автора; а если сегмент 2 при этом соответствует транслитерации названия произведения этого автора, то открывается страница этого произведения.

Варианты перечислены в порядке приоритетности. То есть, если есть, скажем, автор с транслитерацией фамилии «b» и страница буквы «b», то грузиться должна последняя. Есть ещё пара нюансов в формировании, но понять задачу написанное, надеюсь, позволяет.

Так вот, я не представляю, как реализовать подобное с помощью CI. Подскажите, пожалуйста.
Аватара пользователя
Скрипник
 
Сообщения: 4
Зарегистрирован: 19 июл 2008, 14:03

Re: Нестандартная логика формирования URL

Сообщение kaiser Zaido 19 июл 2008, 15:15

1. В файле routes.php написать

Код: Выделить всё
$route['wanted']="main/wanted";
$route['about']="main/about";


2. , 3.
Вероятно надо будет в методе index дефолтного контроллера делать
Код: Выделить всё
$first=$this->uri->segment(1);
if(mb_strlen($first)==1)
{
/* код про поиск буквы */
}
else{/* про автора пошло */
$second=$this->uri->segment(2);

     if($second)
     {
     /* еще и книгу хотят */
     }

}



Но самым правильным решением(если уж вы решили переделывать сайт с CI) имхо было бы переделать и ссылки) Зачем за них цепляться?
В таком случае сделать контроллеры search, author.
Ссылки вида:
Код: Выделить всё
/search/book/А/
/author/show/kaverin/
/author/book/kevarin/dva_kapitana/


И реализовать все функции вполне логичными методами контроллеров (для search метод book; для author методы show и book).
Аватара пользователя
kaiser Zaido
 
Сообщения: 63
Зарегистрирован: 27 июн 2008, 22:37


Re: Нестандартная логика формирования URL

Сообщение Скрипник 22 июл 2008, 07:59

Про текстовые странички более-менее понятно, но как дать фреймворку понять, что tolstoi или dostoevsky нужно обрабатывать именно контроллером по умолчанию?

Мне видится вариант сделать распознавание сегментов URL в контроллере 404 ошибки. Но это не совсем логично, и не понятно, сработает ли.
Аватара пользователя
Скрипник
 
Сообщения: 4
Зарегистрирован: 19 июл 2008, 14:03

Re: Нестандартная логика формирования URL

Сообщение Exel 22 июл 2008, 09:09

Авторы CI специально для вас придумали изощренный механизм наследования классов ядра, а вы хотите через обработчик 404 ошибки все сделать :D
Для себя писал поддержку маршрутизации путей неограниченной вложенности без имени контроллера в первом сегменте uri именно через переопределение пары методов в классе URI (как минимум _validate_request). Логика была такова: если контроллер не нашелся и вот-вот уже будет вызвана show_404, вместо нее рисуем:
Код: Выделить всё
$this->_set_default_controller();
return array();   

Пустой массив нужно вернуть для того, чтобы при дальнейшей маршрутизации default_controller не был заменен на то, что в первом сегменте, пусть CI считает, что там ничего нет.
А в дефолтном контроллере через $this->uri->segment_array() получаем наш uri и делаем с ним чего хотим.
Exel
 
Сообщения: 6
Зарегистрирован: 18 апр 2008, 12:55

Re: Нестандартная логика формирования URL

Сообщение Скрипник 22 июл 2008, 09:55

изощренный механизм наследования классов ядра

Звучит устрашающе :)

Я сделал вот как: в файле application/config/routes.php после определения постоянных путей написал:
Код: Выделить всё
$route[':any'] = "router";

И теперь уже в контроллере router.php проверяю сегменты URL. До конца пока не дописал, но вроде бы, работает.
Аватара пользователя
Скрипник
 
Сообщения: 4
Зарегистрирован: 19 июл 2008, 14:03

Re: Нестандартная логика формирования URL

Сообщение Exel 22 июл 2008, 11:56

Тоже конечно вариант, только теперь вам придется в $route[] писать все контроллеры в явном виде. Иначе в неупомянутый в $routes, но существующий контроллер, попасть будет нельзя. Ну и как следствие перебор всего массива $routes при каждом запросе (Router::_parse_routes()).
Exel
 
Сообщения: 6
Зарегистрирован: 18 апр 2008, 12:55


Вернуться в Общие вопросы по фреймворку

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0