diff --git a/cake/libs/router.php b/cake/libs/router.php index f140ef607..54eb366ad 100644 --- a/cake/libs/router.php +++ b/cake/libs/router.php @@ -78,7 +78,22 @@ class Router extends Overloadable { * @var array */ var $__currentRoute = array(); - /** + +/** + * Maintains the parameter stack for the current request + * + * @var array + */ + var $__params = array(); + +/** + * Maintains the path stack for the current request + * + * @var array + */ + var $__paths = array(); + +/** * Initialize the Router object * */ @@ -140,10 +155,14 @@ class Router extends Overloadable { $default['action'] = 'index'; } + if (!isset($default['plugin']) || empty($default['plugin'])) { + $default['plugin'] = null; + } + $r = null; if (($route == '') || ($route == '/')) { $regexp = '/^[\/]*$/'; - $_this->routes[] = array($route, $regexp, array(), $default); + $_this->routes[] = array($route, $regexp, array(), $default, array()); } else { $elements = array(); @@ -178,7 +197,7 @@ class Router extends Overloadable { } $regexp = '#^' . join('', $parsed) . '[\/]*$#'; - $_this->routes[] = array($route, $regexp, $names, $default); + $_this->routes[] = array($route, $regexp, $names, $default, $params); } return $_this->routes; } @@ -280,8 +299,22 @@ class Router extends Overloadable { */ function setParams($params) { $_this =& Router::getInstance(); + if (!isset($params[1]['plugin'])) { + $params[1]['plugin'] = null; + } list($_this->__params[], $_this->__paths[]) = $params; } +/** + * Reloads default Router settings + * + * @return void + */ + function reload() { + $_this =& Router::getInstance(); + foreach (get_class_vars('Router') as $key => $val) { + $_this->{$key} = $val; + } + } /** * Finds URL for specified action. * @@ -301,18 +334,13 @@ class Router extends Overloadable { function url($url = null, $full = false) { $_this =& Router::getInstance(); - $base = strip_plugin($this->base, $this->plugin); - $extension = null; $params = $_this->__params[0]; $path = $_this->__paths[0]; + $base = strip_plugin($path['base'], $path['plugin']); + $extension = null; + $mapped = null; if (is_array($url) && !empty($url)) { - if (isset($url['?']) && !empty($url['?'])) { - $url['?'] = '?' . $url['?']; - } else { - $url['?'] = null; - } - if (!isset($url['action'])) { if (!isset($url['controller']) || $params['controller'] == $url['controller']) { $url['action'] = $params['action']; @@ -341,8 +369,38 @@ class Router extends Overloadable { if (is_numeric($keys[$i])) { $args[] = $url[$keys[$i]]; } else { - if (!in_array($keys[$i], array('action', 'controller', 'plugin', 'ext', '?'))) { // CAKE_ADMIN - $named[] = array($keys[$i], $url[$keys[$i]]); + if (!in_array($keys[$i], array('action', 'controller', 'plugin', 'ext', '?'))) { + //if (defined('CAKE_ADMIN') && $keys[$i] != CAKE_ADMIN) { + $named[] = array($keys[$i], $url[$keys[$i]]); + //} + } + } + } + + if (empty($named) && empty($args) && $url['action'] == 'index') { + $url['action'] = null; + } + + foreach ($this->routes as $route) { + $diff = array_diff_assoc($url, $route[3]); + if (empty($diff)) { + $match = true; + foreach ($route[4] as $key => $pattern) { + if (isset($url[$key])) { + if (!preg_match($pattern, $url[$key])) { + $match = false; + break; + } + } elseif (isset($route[2]) && $route[2] == null) { + $match = false; + break; + } + } + if ($match) { + $mapped = $_this->mapRouteElements($route, $url); + foreach (array_keys($route[3]) as $key) { + $url[$key] = ''; + } } } } @@ -365,8 +423,10 @@ class Router extends Overloadable { $combined = join('/', $named); } - if (empty($named) && empty($args) && $url['action'] == 'index') { - $url['action'] = null; + if (isset($url['?']) && !empty($url['?'])) { + $url['?'] = '?' . $url['?']; + } else { + $url['?'] = null; } $urlOut = array_filter(array($url['plugin'], $url['controller'], $url['action'], join('/', array_filter($args)), $combined)); @@ -380,11 +440,11 @@ class Router extends Overloadable { } if (empty($url)) { - return $context->here; + return $path['here']; } elseif($url{0} == '/') { $output = $base . $url; } else { - $output = $base . '/' . strtolower($this->params['controller']) . '/' . $url; + $output = $base . '/' . strtolower($params['controller']) . '/' . $url; } } if ($full) { @@ -392,6 +452,16 @@ class Router extends Overloadable { } return $output . $extension; } +/** + * Maps a URL array onto a route and returns the string result, of false if no match + * + * @param array Route + * @param array URL + * @return mixed + */ + function mapRouteElements($route, $url) { + + } /** * Returns the route matching the current request URL *