protected static function _handleNoRoute($url)
{
$named = $args = array();
$skip = array_merge(array('bare', 'action', 'controller', 'plugin', 'prefix'), static::$_prefixes);
$keys = array_values(array_diff(array_keys($url), $skip));
// Remove this once parsed URL parameters can be inserted into 'pass'
foreach ($keys as $key) {
if (is_numeric($key)) {
$args[] = $url[$key];
} else {
$named[$key] = $url[$key];
}
}
list($args, $named) = array(Hash::filter($args), Hash::filter($named));
foreach (static::$_prefixes as $prefix) {
$prefixed = $prefix . '_';
if (!empty($url[$prefix]) && strpos($url['action'], $prefixed) === 0) {
$url['action'] = substr($url['action'], strlen($prefixed) * -1);
break;
}
}
if (empty($named) && empty($args) && (!isset($url['action']) || $url['action'] === 'index')) {
$url['action'] = null;
}
$urlOut = array_filter(array($url['controller'], $url['action']));
if (isset($url['plugin'])) {
array_unshift($urlOut, $url['plugin']);
}
foreach (static::$_prefixes as $prefix) {
if (isset($url[$prefix])) {
array_unshift($urlOut, $prefix);
break;
}
}
$output = implode('/', $urlOut);
if (!empty($args)) {
$output .= '/' . implode('/', array_map('rawurlencode', $args));
}
if (!empty($named)) {
foreach ($named as $name => $value) {
if (is_array($value)) {
$flattend = Hash::flatten($value, '%5D%5B');
foreach ($flattend as $namedKey => $namedValue) {
$output .= '/' . $name . "%5B{$namedKey}%5D" . static::$_namedConfig['separator'] . rawurlencode($namedValue);
}
} else {
$output .= '/' . $name . static::$_namedConfig['separator'] . rawurlencode($value);
}
}
}
return $output;
}