/** * Maps a URL array onto a route and returns the string result, or false if no match * * @param array $route Route Route * @param array $url URL URL to map * @return mixed Result (as string) or false if no match * @access public * @static */ function mapRouteElements($route, $url) { if (isset($route[3]['prefix'])) { $prefix = $route[3]['prefix']; unset($route[3]['prefix']); } $pass = array(); $defaults = $route[3]; $routeParams = $route[2]; $params = Set::diff($url, $defaults); $urlInv = array_combine(array_values($url), array_keys($url)); $i = 0; while (isset($defaults[$i])) { if (isset($urlInv[$defaults[$i]])) { if (!in_array($defaults[$i], $url) && is_int($urlInv[$defaults[$i]])) { return false; } unset($urlInv[$defaults[$i]], $defaults[$i]); } else { return false; } $i++; } foreach ($params as $key => $value) { if (is_int($key)) { $pass[] = $value; unset($params[$key]); } } list($named, $params) = Router::getNamedElements($params); if (!strpos($route[0], '*') && (!empty($pass) || !empty($named))) { return false; } $urlKeys = array_keys($url); $paramsKeys = array_keys($params); $defaultsKeys = array_keys($defaults); if (!empty($params)) { if (array_diff($paramsKeys, $routeParams) != array()) { return false; } $required = array_values(array_diff($routeParams, $urlKeys)); $reqCount = count($required); for ($i = 0; $i < $reqCount; $i++) { if (array_key_exists($required[$i], $defaults) && $defaults[$required[$i]] === null) { unset($required[$i]); } } } $isFilled = true; if (!empty($routeParams)) { $filled = array_intersect_key($url, array_combine($routeParams, array_keys($routeParams))); $isFilled = array_diff($routeParams, array_keys($filled)) === array(); if (!$isFilled && empty($params)) { return false; } } if (empty($params)) { return Router::__mapRoute($route, array_merge($url, compact('pass', 'named', 'prefix'))); } elseif (!empty($routeParams) && !empty($route[3])) { if (!empty($required)) { return false; } foreach ($params as $key => $val) { if (!isset($url[$key]) || $url[$key] != $val || (!isset($defaults[$key]) || $defaults[$key] != $val) && !in_array($key, $routeParams)) { if (!isset($defaults[$key])) { continue; } return false; } } } else { if (empty($required) && $defaults['plugin'] === $url['plugin'] && $defaults['controller'] === $url['controller'] && $defaults['action'] === $url['action']) { return Router::__mapRoute($route, array_merge($url, compact('pass', 'named', 'prefix'))); } return false; } if (!empty($route[4])) { foreach ($route[4] as $key => $reg) { if (array_key_exists($key, $url) && !preg_match('#' . $reg . '#', $url[$key])) { return false; } } } return Router::__mapRoute($route, array_merge($filled, compact('pass', 'named', 'prefix'))); }
/** * Maps a URL array onto a route and returns the string result, or false if no match * * @param array $route Route Route * @param array $url URL URL to map * @return mixed Result (as string) or false if no match * @access public * @static */ function mapRouteElements($route, $url) { $_this =& Router::getInstance(); if (isset($route[3]['prefix'])) { $prefix = $route[3]['prefix']; unset($route[3]['prefix']); } $pass = array(); $defaults = $route[3]; $routeParams = $route[2]; $params = Set::diff($url, $defaults); foreach ($params as $key => $value) { if (is_int($key)) { $pass[] = $value; unset($params[$key]); } } list($named, $params) = $_this->getNamedElements($params); if (!strpos($route[0], '*') && (!empty($pass) || !empty($named))) { return false; } $urlKeys = array_keys($url); $paramsKeys = array_keys($params); $defaultsKeys = array_keys($defaults); if (!empty($params)) { if (array_diff($paramsKeys, $routeParams) != array()) { return false; } $required = array_diff($defaultsKeys, $urlKeys); } $isFilled = true; if (!empty($routeParams)) { $filled = array_intersect_key($url, array_combine($routeParams, array_keys($routeParams))); $isFilled = array_diff($routeParams, array_keys($filled)) == array(); if (!$isFilled && empty($params)) { return false; } } if (empty($params)) { return Router::__mapRoute($route, am($url, compact('pass', 'named', 'prefix'))); } elseif (!empty($routeParams) && !empty($route[3])) { if (!empty($required)) { return false; } foreach ($params as $key => $val) { if (!isset($url[$key]) || $url[$key] != $val || (!isset($defaults[$key]) || $defaults[$key] != $val) && !in_array($key, $routeParams)) { return false; } } } else { if (empty($required) && $defaults['plugin'] == $url['plugin'] && $defaults['controller'] == $url['controller'] && $defaults['action'] == $url['action']) { return Router::__mapRoute($route, am($url, compact('pass', 'named', 'prefix'))); } return false; } if (!empty($route[4])) { foreach ($route[4] as $key => $reg) { if (array_key_exists($key, $url) && !preg_match('/' . $reg . '/', $url[$key])) { return false; } } } return Router::__mapRoute($route, am($filled, compact('pass', 'named', 'prefix'))); }