From 623ef0e36b684d6e278fb8144e22d24056acdc4a Mon Sep 17 00:00:00 2001 From: SMaker Date: Sun, 9 Feb 2014 23:45:34 +0900 Subject: [PATCH 1/4] =?UTF-8?q?Router=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .htaccess | 36 +---- classes/context/Context.class.php | 12 +- classes/router/Router.class.php | 240 ++++++++++++++++++++++++++++++ config/config.inc.php | 1 + 4 files changed, 255 insertions(+), 34 deletions(-) create mode 100644 classes/router/Router.class.php diff --git a/.htaccess b/.htaccess index 89ecf951f..43536f5e9 100644 --- a/.htaccess +++ b/.htaccess @@ -15,37 +15,7 @@ RewriteRule ^(.+)/files/(member_extra_info|attach|cache|faceOff)/(.*) ./files/$2 RewriteCond %{SCRIPT_FILENAME} !-f RewriteRule ^(.+)/(files|modules|widgets|widgetstyles|layouts|m.layouts|addons)/(.*) ./$2/$3 [L] -# rss , blogAPI -RewriteRule ^(rss|atom)$ ./index.php?module=rss&act=$1 [L] -RewriteRule ^([a-zA-Z0-9_]+)/(rss|atom|api)$ ./index.php?mid=$1&act=$2 [L] -RewriteRule ^([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)/(rss|atom|api)$ ./index.php?vid=$1&mid=$2&act=$3 [L] - -# trackback -RewriteRule ^([0-9]+)/(.+)/trackback$ ./index.php?document_srl=$1&key=$2&act=trackback [L] -RewriteRule ^([a-zA-Z0-9_]+)/([0-9]+)/(.+)/trackback$ ./index.php?mid=$1&document_srl=$2&key=$3&act=trackback [L] -RewriteRule ^([a-zA-Z0-9_]+)/([0-9]+)/(.+)/trackback$ ./index.php?vid=$1&document_srl=$2&key=$3&act=trackback [L] -RewriteRule ^([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)/([0-9]+)/(.+)/trackback$ ./index.php?vid=$1&mid=$2&document_srl=$3&key=$4&act=trackback [L] - -# document permanent link -RewriteRule ^([0-9]+)$ ./index.php?document_srl=$1 [L,QSA] - -# mid link -RewriteCond %{SCRIPT_FILENAME} !-d -RewriteRule ^([a-zA-Z0-9_]+)/?$ ./index.php?mid=$1 [L,QSA] -# mid + document link -RewriteRule ^([a-zA-Z0-9_]+)/([0-9]+)$ ./index.php?mid=$1&document_srl=$2 [L,QSA] - -# vid + mid link -RewriteCond %{SCRIPT_FILENAME} !-d -RewriteRule ^([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)/?$ ./index.php?vid=$1&mid=$2 [L,QSA] -# vid + mid + document link -RewriteRule ^([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)/([0-9]+)$ ./index.php?vid=$1&mid=$2&document_srl=$3 [L,QSA] - -# mid + entry title -RewriteRule ^([a-zA-Z0-9_]+)/entry/(.+)$ ./index.php?mid=$1&entry=$2 [L,QSA] -# vid + mid + entry title -RewriteRule ^([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)/entry/(.+)$ ./index.php?vid=$1&mid=$2&entry=$3 [L,QSA] - -#shop / vid / [category|product] / identifier +# router RewriteCond %{SCRIPT_FILENAME} !-f -RewriteRule ^([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)/([a-zA-Z0-9_\.-]+)$ ./index.php?act=route&vid=$1&type=$2&identifier=$3 [L,QSA] +RewriteCond %{SCRIPT_FILENAME} !-d +RewriteRule ^(.*)$ ./index.php [L] diff --git a/classes/context/Context.class.php b/classes/context/Context.class.php index fec8c5449..f93227338 100644 --- a/classes/context/Context.class.php +++ b/classes/context/Context.class.php @@ -366,6 +366,13 @@ class Context // check if using rewrite module $this->allow_rewrite = ($this->db_info->use_rewrite == 'Y' ? TRUE : FALSE); + // If using rewrite module, initializes router + if($this->allow_rewrite) + { + $oRouter = Router::getInstance(); + $oRouter->proc(); + } + // set locations for javascript use if($_SERVER['REQUEST_METHOD'] == 'GET') { @@ -1568,7 +1575,10 @@ class Context 'act.document_srl.key.mid.vid' => ($act == 'trackback') ? "$vid/$mid/$srl/$key/$act" : '' ); - $query = $target_map[$target]; + $oRouter = Router::getInstance(); + $oRouter->setMap($target_map); + + $query = $oRouter->makePrettyUrl($target); } if(!$query) diff --git a/classes/router/Router.class.php b/classes/router/Router.class.php new file mode 100644 index 000000000..d71a23854 --- /dev/null +++ b/classes/router/Router.class.php @@ -0,0 +1,240 @@ + 0) + { + self::$segments = explode('/', $path); + + // Remove the meanless segment + unset(self::$segments[0]); + } + + $self = Router::getInstance(); + + // Set default routes + $self->routes = array( + // rss , blogAPI + '(rss|atom)' => array('module' => 'rss', 'act' => '$1'), + '([a-zA-Z0-9_]+)/(rss|atom|api)' => array('mid' => '$1', 'act' => '$2'), + '([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)/(rss|atom|api)' => array('vid' => '$1', 'mid' => '$2', 'act' => '$3'), + // trackback + '([0-9]+)/(.+)/trackback' => array('document_srl' => '$1', 'key' => '$2', 'act' => 'trackback'), + '([a-zA-Z0-9_]+)/([0-9]+)/(.+)/trackback' => array('mid' => '$1', 'document_srl' => '$2', 'key' => '$3', 'act' => 'trackback'), + '([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)/([0-9]+)/(.+)/trackback' => array('vid' => '$1', 'mid' => '$2', 'document_srl' => '$3' , 'key' => '$4', 'act' => 'trackback'), + // mid + '([a-zA-Z0-9_]+)/?' => array('mid' => '$1'), + // mid + document_srl + '([a-zA-Z0-9_]+)/([0-9]+)' => array('mid' => '$1', 'document_srl' => '$2'), + // vid + mid + '([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)/' => array('vid' => '$1', 'mid' => '$2'), + // vid + mid + document_srl + '([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)/([0-9]+)?' => array('vid' => '$1', 'mid' => '$2', 'document_srl' => '$3'), + // document_srl + '([0-9]+)' => array('document_srl' => '$1'), + // mid + entry title + '([a-zA-Z0-9_]+)/entry/(.+)' => array('mid' => '$1', 'entry' => '$2'), + // vid + mid + entry title + '([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)/entry/(.+)' => array('vid' => '$1', 'mid' => '$2', 'entry' => '$3'), + // shop / vid / [category|product] / identifier + '([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)/([a-zA-Z0-9_\.-]+)' => array('act' => 'route', 'vid' => '$1', 'type' => '$2', 'identifier'=> '$3'), + ); + + if(isset($self->routes[$path])) + { + foreach($self->routes[$path] as $key => $val) + { + $val = preg_replace('#^\$([0-9]+)$#e', '\$matches[$1]', $val); + + Context::set($key, $val, TRUE); + } + + return; + } + + // Apply routes + foreach($self->routes as $regex => $query) + { + if(preg_match('#^' . $regex . '$#', $path, $matches)) + { + foreach($query as $key => $val) + { + $val = preg_replace('#^\$([0-9]+)$#e', '\$matches[$1]', $val); + + Context::set($key, $val, TRUE); + } + } + } + } + + /** + * @brief Add a rewrite map(s) + * @param array $map + * @return void + */ + public function setMap($map) + { + $self = Router::getInstance(); + $self->rewrite_map = array_merge($self->rewrite_map, $map); + } + + /** + * @brief Add a route + * @param string $target + * @param array $query + * @return void + */ + public function add($target, $query) + { + $self = Router::getInstance(); + $self->routes[$target] = $query; + } + + /** + * @brief Add multiple routes + * @param array $routes + * @return void + */ + public function adds($routes) + { + $self = Router::getInstance(); + $self->routes = array_merge($self->routes, $routes); + } + + /** + * @brief Get segment from request uri + * @param int $index + * @return string + */ + public function getSegment($index) + { + $self = Router::getInstance(); + return $self->segments[$index]; + } + + + /** + * @brief Get segment from request uri + * @param int $index + * @return string + */ + public function getSegments() + { + $self = Router::getInstance(); + return $self->segments; + } + + /** + * @brief Get route info + * @param string $regex + * @return array + */ + public function getRoute($regex) + { + $self = Router::getInstance(); + return $self->routes[$regex]; + } + + /** + * @brief Get routes list + * @return array + */ + public function getRoutes() + { + $self = Router::getInstance(); + return $self->routes; + } + + /** + * @brief Get routes list + * @param string $regex + * @return boolean + */ + public function isExistsRoute($regex) + { + $self = Router::getInstance(); + return isset($self->routes[$regex]); + } + + /** + * @brief Makes shortten url + * @param string $regex + * @return string + */ + public function makePrettyUrl($regex) + { + $self = Router::getInstance(); + return $self->rewrite_map[$regex]; + } +} \ No newline at end of file diff --git a/config/config.inc.php b/config/config.inc.php index 16530850a..b79323919 100644 --- a/config/config.inc.php +++ b/config/config.inc.php @@ -299,6 +299,7 @@ if(!defined('__XE_LOADED_CLASS__')) require(_XE_PATH_ . 'classes/xml/XmlJsFilter.class.php'); require(_XE_PATH_ . 'classes/xml/XmlLangParser.class.php'); require(_XE_PATH_ . 'classes/cache/CacheHandler.class.php'); + require(_XE_PATH_ . 'classes/router/Router.class.php'); require(_XE_PATH_ . 'classes/context/Context.class.php'); require(_XE_PATH_ . 'classes/db/DB.class.php'); require(_XE_PATH_ . 'classes/file/FileHandler.class.php'); From b52421457201f1fdf1f061b7dd3e3caa699d0f88 Mon Sep 17 00:00:00 2001 From: SMaker Date: Thu, 13 Feb 2014 12:23:01 +0900 Subject: [PATCH 2/4] =?UTF-8?q?singleton=20=EA=B0=9D=EC=B2=B4=EB=A5=BC=20?= =?UTF-8?q?=EC=82=AC=EC=9A=A9=ED=95=98=EB=8A=94=20=EB=8C=80=EC=8B=A0?= =?UTF-8?q?=EC=97=90=20static=20method=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- classes/context/Context.class.php | 8 +- classes/router/Router.class.php | 131 +++++++++++------------------- 2 files changed, 51 insertions(+), 88 deletions(-) diff --git a/classes/context/Context.class.php b/classes/context/Context.class.php index f93227338..7c0918a03 100644 --- a/classes/context/Context.class.php +++ b/classes/context/Context.class.php @@ -369,8 +369,7 @@ class Context // If using rewrite module, initializes router if($this->allow_rewrite) { - $oRouter = Router::getInstance(); - $oRouter->proc(); + Router::proc(); } // set locations for javascript use @@ -1575,10 +1574,9 @@ class Context 'act.document_srl.key.mid.vid' => ($act == 'trackback') ? "$vid/$mid/$srl/$key/$act" : '' ); - $oRouter = Router::getInstance(); - $oRouter->setMap($target_map); + Router::setMap($target_map); - $query = $oRouter->makePrettyUrl($target); + $query = Router::makePrettyUrl($target); } if(!$query) diff --git a/classes/router/Router.class.php b/classes/router/Router.class.php index d71a23854..94de130b3 100644 --- a/classes/router/Router.class.php +++ b/classes/router/Router.class.php @@ -6,12 +6,6 @@ */ class Router { - /** - * Singleton - * @var object - */ - private static $theInstance = null; - /** * URI Segments * @var array @@ -22,35 +16,45 @@ class Router * Routes * @var array */ - private $routes = array(); + private static $routes = array( + // rss , blogAPI + '(rss|atom)' => array('module' => 'rss', 'act' => '$1'), + '([a-zA-Z0-9_]+)/(rss|atom|api)' => array('mid' => '$1', 'act' => '$2'), + '([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)/(rss|atom|api)' => array('vid' => '$1', 'mid' => '$2', 'act' => '$3'), + // trackback + '([0-9]+)/(.+)/trackback' => array('document_srl' => '$1', 'key' => '$2', 'act' => 'trackback'), + '([a-zA-Z0-9_]+)/([0-9]+)/(.+)/trackback' => array('mid' => '$1', 'document_srl' => '$2', 'key' => '$3', 'act' => 'trackback'), + '([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)/([0-9]+)/(.+)/trackback' => array('vid' => '$1', 'mid' => '$2', 'document_srl' => '$3' , 'key' => '$4', 'act' => 'trackback'), + // mid + '([a-zA-Z0-9_]+)/?' => array('mid' => '$1'), + // mid + document_srl + '([a-zA-Z0-9_]+)/([0-9]+)' => array('mid' => '$1', 'document_srl' => '$2'), + // vid + mid + '([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)/' => array('vid' => '$1', 'mid' => '$2'), + // vid + mid + document_srl + '([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)/([0-9]+)?' => array('vid' => '$1', 'mid' => '$2', 'document_srl' => '$3'), + // document_srl + '([0-9]+)' => array('document_srl' => '$1'), + // mid + entry title + '([a-zA-Z0-9_]+)/entry/(.+)' => array('mid' => '$1', 'entry' => '$2'), + // vid + mid + entry title + '([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)/entry/(.+)' => array('vid' => '$1', 'mid' => '$2', 'entry' => '$3'), + // shop / vid / [category|product] / identifier + '([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)/([a-zA-Z0-9_\.-]+)' => array('act' => 'route', 'vid' => '$1', 'type' => '$2', 'identifier'=> '$3') + ); /** * Rewrite map * @var array */ - private $rewrite_map = array(); - - /** - * @brief returns static context object (Singleton). It's to use Router without declaration of an object - * @return object Instance - */ - public static function getInstance() - { - if(!isset(self::$theInstance)) - { - self::$theInstance = new Router(); - } - - return self::$theInstance; - } - + private static $rewrite_map = array(); /** * @brief Applys routes. * @see This function should be called only once * @return void */ - public function proc() + public static function proc() { $uri = $_SERVER['REQUEST_URI']; @@ -81,39 +85,9 @@ class Router unset(self::$segments[0]); } - $self = Router::getInstance(); - - // Set default routes - $self->routes = array( - // rss , blogAPI - '(rss|atom)' => array('module' => 'rss', 'act' => '$1'), - '([a-zA-Z0-9_]+)/(rss|atom|api)' => array('mid' => '$1', 'act' => '$2'), - '([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)/(rss|atom|api)' => array('vid' => '$1', 'mid' => '$2', 'act' => '$3'), - // trackback - '([0-9]+)/(.+)/trackback' => array('document_srl' => '$1', 'key' => '$2', 'act' => 'trackback'), - '([a-zA-Z0-9_]+)/([0-9]+)/(.+)/trackback' => array('mid' => '$1', 'document_srl' => '$2', 'key' => '$3', 'act' => 'trackback'), - '([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)/([0-9]+)/(.+)/trackback' => array('vid' => '$1', 'mid' => '$2', 'document_srl' => '$3' , 'key' => '$4', 'act' => 'trackback'), - // mid - '([a-zA-Z0-9_]+)/?' => array('mid' => '$1'), - // mid + document_srl - '([a-zA-Z0-9_]+)/([0-9]+)' => array('mid' => '$1', 'document_srl' => '$2'), - // vid + mid - '([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)/' => array('vid' => '$1', 'mid' => '$2'), - // vid + mid + document_srl - '([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)/([0-9]+)?' => array('vid' => '$1', 'mid' => '$2', 'document_srl' => '$3'), - // document_srl - '([0-9]+)' => array('document_srl' => '$1'), - // mid + entry title - '([a-zA-Z0-9_]+)/entry/(.+)' => array('mid' => '$1', 'entry' => '$2'), - // vid + mid + entry title - '([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)/entry/(.+)' => array('vid' => '$1', 'mid' => '$2', 'entry' => '$3'), - // shop / vid / [category|product] / identifier - '([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)/([a-zA-Z0-9_\.-]+)' => array('act' => 'route', 'vid' => '$1', 'type' => '$2', 'identifier'=> '$3'), - ); - - if(isset($self->routes[$path])) + if(isset(self::$routes[$path])) { - foreach($self->routes[$path] as $key => $val) + foreach(self::$routes[$path] as $key => $val) { $val = preg_replace('#^\$([0-9]+)$#e', '\$matches[$1]', $val); @@ -124,7 +98,7 @@ class Router } // Apply routes - foreach($self->routes as $regex => $query) + foreach(self::$routes as $regex => $query) { if(preg_match('#^' . $regex . '$#', $path, $matches)) { @@ -143,10 +117,9 @@ class Router * @param array $map * @return void */ - public function setMap($map) + public static function setMap($map) { - $self = Router::getInstance(); - $self->rewrite_map = array_merge($self->rewrite_map, $map); + self::$rewrite_map = array_merge(self::$rewrite_map, $map); } /** @@ -155,10 +128,9 @@ class Router * @param array $query * @return void */ - public function add($target, $query) + public static function add($target, $query) { - $self = Router::getInstance(); - $self->routes[$target] = $query; + self::$routes[$target] = $query; } /** @@ -168,8 +140,7 @@ class Router */ public function adds($routes) { - $self = Router::getInstance(); - $self->routes = array_merge($self->routes, $routes); + self::$routes = array_merge(self::$routes, $routes); } /** @@ -177,10 +148,9 @@ class Router * @param int $index * @return string */ - public function getSegment($index) + public static function getSegment($index) { - $self = Router::getInstance(); - return $self->segments[$index]; + return self::$segments[$index]; } @@ -189,10 +159,9 @@ class Router * @param int $index * @return string */ - public function getSegments() + public static function getSegments() { - $self = Router::getInstance(); - return $self->segments; + return self::$segments; } /** @@ -200,20 +169,18 @@ class Router * @param string $regex * @return array */ - public function getRoute($regex) + public static function getRoute($regex) { - $self = Router::getInstance(); - return $self->routes[$regex]; + return self::$routes[$regex]; } /** * @brief Get routes list * @return array */ - public function getRoutes() + public static function getRoutes() { - $self = Router::getInstance(); - return $self->routes; + return self::$routes; } /** @@ -221,10 +188,9 @@ class Router * @param string $regex * @return boolean */ - public function isExistsRoute($regex) + public static function isExistsRoute($regex) { - $self = Router::getInstance(); - return isset($self->routes[$regex]); + return isset(self::$routes[$regex]); } /** @@ -232,9 +198,8 @@ class Router * @param string $regex * @return string */ - public function makePrettyUrl($regex) + public static function makePrettyUrl($regex) { - $self = Router::getInstance(); - return $self->rewrite_map[$regex]; + return self::$rewrite_map[$regex]; } } \ No newline at end of file From 33d26ca17967fb60aea64cf3158adf5a86a22e39 Mon Sep 17 00:00:00 2001 From: SMaker Date: Sat, 16 Aug 2014 23:19:18 +0900 Subject: [PATCH 3/4] =?UTF-8?q?Router=20class=20=EA=B0=9C=EC=84=A0=20?= =?UTF-8?q?=EB=B0=8F=20=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - RewriteRule의 break 문법 지원 -- Apache RewriteRule의 [L] 플래그 -- Nginx RewriteRule의 break 문법 -성능 이슈 및 deprecated 이슈로 preg_replace() 대신에 substr_compare() 함수와 substr() 함수를 이용하여 동작하도록 개선 ps. preg_replace() 함수의 /e modifier가 PHP 5.5에서 deprecated 처리됨 - URI Segment가 1개인 경우 해당 Segment를 Unset 하던 오류 수정 --- classes/router/Router.class.php | 100 +++++++++++++++++++++++--------- 1 file changed, 74 insertions(+), 26 deletions(-) diff --git a/classes/router/Router.class.php b/classes/router/Router.class.php index 94de130b3..8b95c2275 100644 --- a/classes/router/Router.class.php +++ b/classes/router/Router.class.php @@ -18,29 +18,29 @@ class Router */ private static $routes = array( // rss , blogAPI - '(rss|atom)' => array('module' => 'rss', 'act' => '$1'), - '([a-zA-Z0-9_]+)/(rss|atom|api)' => array('mid' => '$1', 'act' => '$2'), - '([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)/(rss|atom|api)' => array('vid' => '$1', 'mid' => '$2', 'act' => '$3'), + '(rss|atom)' => array('module' => 'rss', 'act' => '$1', '[L]' => TRUE), + '([a-zA-Z0-9_]+)/(rss|atom|api)' => array('mid' => '$1', 'act' => '$2', '[L]' => TRUE), + '([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)/(rss|atom|api)' => array('vid' => '$1', 'mid' => '$2', 'act' => '$3', '[L]' => TRUE), // trackback - '([0-9]+)/(.+)/trackback' => array('document_srl' => '$1', 'key' => '$2', 'act' => 'trackback'), - '([a-zA-Z0-9_]+)/([0-9]+)/(.+)/trackback' => array('mid' => '$1', 'document_srl' => '$2', 'key' => '$3', 'act' => 'trackback'), - '([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)/([0-9]+)/(.+)/trackback' => array('vid' => '$1', 'mid' => '$2', 'document_srl' => '$3' , 'key' => '$4', 'act' => 'trackback'), - // mid - '([a-zA-Z0-9_]+)/?' => array('mid' => '$1'), - // mid + document_srl - '([a-zA-Z0-9_]+)/([0-9]+)' => array('mid' => '$1', 'document_srl' => '$2'), - // vid + mid - '([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)/' => array('vid' => '$1', 'mid' => '$2'), - // vid + mid + document_srl - '([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)/([0-9]+)?' => array('vid' => '$1', 'mid' => '$2', 'document_srl' => '$3'), + '([0-9]+)/(.+)/trackback' => array('document_srl' => '$1', 'key' => '$2', 'act' => 'trackback', '[L]' => TRUE), + '([a-zA-Z0-9_]+)/([0-9]+)/(.+)/trackback' => array('mid' => '$1', 'document_srl' => '$2', 'key' => '$3', 'act' => 'trackback', '[L]' => TRUE), + '([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)/([0-9]+)/(.+)/trackback' => array('vid' => '$1', 'mid' => '$2', 'document_srl' => '$3' , 'key' => '$4', 'act' => 'trackback', '[L]' => TRUE), // document_srl - '([0-9]+)' => array('document_srl' => '$1'), + '([0-9]+)' => array('document_srl' => '$1', '[L]' => TRUE), + // mid + '([a-zA-Z0-9_]+)/?' => array('mid' => '$1', '[L]' => TRUE), + // mid + document_srl + '([a-zA-Z0-9_]+)/([0-9]+)' => array('mid' => '$1', 'document_srl' => '$2', '[L]' => TRUE), + // vid + mid + '([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)/' => array('vid' => '$1', 'mid' => '$2', '[L]' => TRUE), + // vid + mid + document_srl + '([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)/([0-9]+)?' => array('vid' => '$1', 'mid' => '$2', 'document_srl' => '$3', '[L]' => TRUE), // mid + entry title - '([a-zA-Z0-9_]+)/entry/(.+)' => array('mid' => '$1', 'entry' => '$2'), + '([a-zA-Z0-9_]+)/entry/(.+)' => array('mid' => '$1', 'entry' => '$2', '[L]' => TRUE), // vid + mid + entry title - '([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)/entry/(.+)' => array('vid' => '$1', 'mid' => '$2', 'entry' => '$3'), + '([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)/entry/(.+)' => array('vid' => '$1', 'mid' => '$2', 'entry' => '$3', '[L]' => TRUE), // shop / vid / [category|product] / identifier - '([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)/([a-zA-Z0-9_\.-]+)' => array('act' => 'route', 'vid' => '$1', 'type' => '$2', 'identifier'=> '$3') + '([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)/([a-zA-Z0-9_\.-]+)' => array('act' => 'route', 'vid' => '$1', 'type' => '$2', 'identifier'=> '$3', '[L]' => TRUE) ); /** @@ -72,6 +72,7 @@ class Router return; } + // Get relative path from request uri $path = parse_url($uri, PHP_URL_PATH); // Do some final cleaning of the URI and return it @@ -80,33 +81,80 @@ class Router if(strlen($path) > 0) { self::$segments = explode('/', $path); - - // Remove the meanless segment - unset(self::$segments[0]); } if(isset(self::$routes[$path])) { foreach(self::$routes[$path] as $key => $val) { - $val = preg_replace('#^\$([0-9]+)$#e', '\$matches[$1]', $val); + if(strlen($val) > 0) + { + if(substr_compare($val, '$', 0, 1) == 0) + { + $segment_index = (int) substr($val, 1) - 1; + if($segment_index < 0) + { + continue; + } - Context::set($key, $val, TRUE); + Context::set($key, self::$segments[$segment_index], TRUE); + } + else + { + Context::set($key, $val, TRUE); + } + } + else + { + Context::set($key, '', TRUE); + } } return; } + $break = FALSE; + // Apply routes foreach(self::$routes as $regex => $query) { + // Stop the routing proccess + if($break) + { + break; + } if(preg_match('#^' . $regex . '$#', $path, $matches)) { foreach($query as $key => $val) { - $val = preg_replace('#^\$([0-9]+)$#e', '\$matches[$1]', $val); + // If [L] keyword is defined + if($key == '[L]') + { + // Stop the routing process and don't apply any more rules + $break = TRUE; + continue; + } - Context::set($key, $val, TRUE); + if(strlen($val) > 0) + { + if(substr($val, 0, 1) == '$') + { + $segment_index = (int) substr($val, 1) - 1; + if($segment_index < 0) + { + continue; + } + Context::set($key, self::$segments[$segment_index], TRUE); + } + else + { + Context::set($key, $val, TRUE); + } + } + else + { + Context::set($key, '', TRUE); + } } } } @@ -150,7 +198,7 @@ class Router */ public static function getSegment($index) { - return self::$segments[$index]; + return self::$segments[$index - 1]; } From 2ecbec7296655b3db33cc4b6f5e6b21bf6a88c1e Mon Sep 17 00:00:00 2001 From: akasima Date: Tue, 26 Aug 2014 12:34:15 +0900 Subject: [PATCH 4/4] #930 modify Router class call position --- classes/context/Context.class.php | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/classes/context/Context.class.php b/classes/context/Context.class.php index 7c0918a03..e055f320a 100644 --- a/classes/context/Context.class.php +++ b/classes/context/Context.class.php @@ -242,9 +242,18 @@ class Context } } + // check if using rewrite module + $this->allow_rewrite = ($this->db_info->use_rewrite == 'Y' ? TRUE : FALSE); + // If XE is installed, get virtual site information if(self::isInstalled()) { + // If using rewrite module, initializes router + if($this->allow_rewrite) + { + Router::proc(); + } + $oModuleModel = getModel('module'); $site_module_info = $oModuleModel->getDefaultMid(); @@ -363,15 +372,6 @@ class Context $this->lang = &$GLOBALS['lang']; $this->loadLang(_XE_PATH_ . 'common/lang/'); - // check if using rewrite module - $this->allow_rewrite = ($this->db_info->use_rewrite == 'Y' ? TRUE : FALSE); - - // If using rewrite module, initializes router - if($this->allow_rewrite) - { - Router::proc(); - } - // set locations for javascript use if($_SERVER['REQUEST_METHOD'] == 'GET') {