У меня может быть решение для управления пользовательским uri в приложении CI.
Скажем, есть таблица с именем «маршруты».
CREATE TABLE IF NOT EXISTS `routes` (
`alias` VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`uri` VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
PRIMARY KEY (`alias`),
UNIQUE(`alias`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;
Затем пользовательский «помощник по URL» (application/helper/MY_url_helper.php)
// function that produces a safe uri
if( ! function_exists('safe_uri'))
{
function safe_uri($str, $replace=array(), $delimiter='-') {
if( !empty($replace) ) {
$str = str_replace((array)$replace, ' ', $str);
}
$clean = iconv('UTF-8', 'ASCII//TRANSLIT', $str);
$clean = preg_replace("/[^a-zA-Z0-9\/_|+ -]/", '', $clean);
$clean = strtolower(trim($clean, '-'));
$clean = preg_replace("/[\/_|+ -]+/", $delimiter, $clean);
return $clean;
}
}
// overriden function that checks if the uri exists in the routing table. If so, use this uri instead
if ( ! function_exists('site_url'))
{
function site_url($uri = '')
{
$CI =& get_instance();
if(in_array($uri, $CI->router->routes)){
$key = array_search($uri, $CI->router->routes);
if($key)$uri=$key;
}
return $CI->config->site_url($uri);
}
}
Затем я назвал библиотеку route_manager, которая создает/изменяет маршрут и генерирует пользовательский файл route.php (application/libraries/route_manager.php, создает application/cache/routes.php)
Примечание. Ваше приложение должно иметь возможность записывать файлы в 'application/cache'
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class route_manager{
public function set_alias($full_text, $uri){
$this->load->helper('url');
$sql = 'INSERT INTO `routes` (`alias`, `uri`) VALUES(?,?)
ON DUPLICATE KEY UPDATE
uri=VALUES(uri)';
$this->db->query($sql, array(safe_uri($full_text), $uri));
}
public function create_routes_file(){
$res = $this->db->get('routes');
$output = '<' . '?' . 'php ' . 'if ( ! defined(\'BASEPATH\')) exit(\'No direct script access allowed\');' . CRLF . CRLF;
foreach($res->result_array() as $rs){
$output .= '$' . 'route[\'' . $rs['alias'] . '\'] = "' . $rs['uri'] . '";'. CRLF;
}
// unsure the file won't generate errors
$route = array();
eval('?> '.$output);
// if error detected, the script will stop here (and won't bug the entire CI app). Otherwize it will generate the cache/route.php file
$this->load->helper('file');
write_file(APPPATH . 'cache/routes.php', $output);
}
}
Затем добавьте require_once (4-я строка в примере ниже) в ваш файл application/config/routes.php.
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
// require custom routes (if the file exists)
if(file_exists(APPPATH . 'cache/routes.php'))require_once(APPPATH . 'cache/routes.php');
$route['default_controller'] = "welcome";
$route['404_override'] = '';
Все будет работать, используя хороший uri!
Пример для создания пользовательского дьявольского uri, скажем, «супер-страница, которая ПОТРЯСАЕТ!» (действительно)» должен быть направлен на контроллер «страницы», функцию «индекс» с параметром «23»:
$this->load->library('route_manager');
$this->route_manager->set_alias('super page that ROCKS! (really)', 'page/index/23');
$this->route_manager->create_route_file();
Пример использования этого пользовательского uri
echo site_url('page/index/23');
Этот пример создаст дружественный и работающий URL-адрес, подобный этому:
http://www.yourwebsite.com/index.php/super-page-that-rocks-really
person
Simmoniz
schedule
31.01.2014
"routes"
после запроса администратора. например, я делаю некоторые изменения в своей базе данных (маршруты), чем я создал файлmy_routes.php
(имя не имеет большого значения) и включил его в исходныйroutes.php
. О влиянии на сайт понятия не имею. Никогда не тестировал 800+ маршрутов. У меня всего около 20, но пользователь/администратор может добавлять новые через php-скрипт. - person Kyslik   schedule 11.06.2013