Возникла необходимость сделать так, чтобы можно было выбирать какой URL на какой контроллер ведет. Каждый раз лазить в файлы и править правила роутинга не есть правильное решение. Кроме того, в основном на сайте будут расположены страницы, и хотелось бы чтобы был ЧПУ из названия раздела и страницы. Особо гуглить я на эту тему не стал и придумал своё решение.
Принцип действия следующий:
1. В базе содержатся alias'ы страниц, к примеру '/it' и '/it/articles'. Последнему соответствует определенный контроллер и метод, допустим 'pages' и 'showList' соответственно.
2. Роутинг CodeIgniter'a смотрит куда обращаться по query_string или path_info. Эту строку мы и будем сравнивать с alias'ом в базе.
3. После сравнения, мы находим самое большое вхождение имеющейся строки. Допустим, если мы введем в строке '/it/test', то результатом будет алиас '/it', а если '/it/articles/param1' — '/it/articles' (все это делается одним запросом)
4. Для передачи параметров, мы из исходной строки удаляем alias, тем самым получается остаток от URI и являющийся параметрами, которые передадутся методу.
Скрипт подключается в виде хука, перед загрузкой всей системы, до того момента, когда срабатывает класс роутинга.
Принцип действия следующий:
1. В базе содержатся alias'ы страниц, к примеру '/it' и '/it/articles'. Последнему соответствует определенный контроллер и метод, допустим 'pages' и 'showList' соответственно.
2. Роутинг CodeIgniter'a смотрит куда обращаться по query_string или path_info. Эту строку мы и будем сравнивать с alias'ом в базе.
3. После сравнения, мы находим самое большое вхождение имеющейся строки. Допустим, если мы введем в строке '/it/test', то результатом будет алиас '/it', а если '/it/articles/param1' — '/it/articles' (все это делается одним запросом)
4. Для передачи параметров, мы из исходной строки удаляем alias, тем самым получается остаток от URI и являющийся параметрами, которые передадутся методу.
Скрипт подключается в виде хука, перед загрузкой всей системы, до того момента, когда срабатывает класс роутинга.
- <?
-
- /**
- * Класс роутинга через БД
- *
- */
- class APath
- {
- function catcher()
- {
- // Подключаем класс для работы с БД
- include_once('system/database/DB.php');
- $this->db = &DB();
-
- // Делаем запрос в базу
- $query = $this->db->query("SELECT CONCAT('/',controller,'/',IFNULL(method,'index'),'/') as cm, alias FROM pages WHERE '".mysql_escape_string($_SERVER['PATH_INFO'])."' LIKE concat(alias,'%') ORDER BY LENGTH(alias) DESC LIMIT 1");
-
- // Проверяем есть ли результат
- if($query->num_rows() > 0)
- {
- // Распиливаем строку на сегменты, и вырезаем alias
- $segments = str_replace($query->row()->alias,'',$_SERVER['PATH_INFO']);
-
- // Добавляем сегменты - как параметры метода
- $_SERVER['PATH_INFO'] = $query->row()->cm.'/'.$segments;
- }
- else
- {
- show_404();
- }
- }
- }
-
- ?>
* This source code was highlighted with Source Code Highlighter.
База в которую делается запрос, выглядит следующий образом:
--
-- Структура таблицы `pages`
--
CREATE TABLE IF NOT EXISTS `pages` (
`id` int(9) NOT NULL auto_increment,
`alias` varchar(250) NOT NULL,
`title` varchar(250) NOT NULL,
`controller` varchar(100) NOT NULL,
`method` varchar(100) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `alias` (`alias`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
* This source code was highlighted with Source Code Highlighter.