Example #1
0
 /**
  * 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')));
 }
Example #2
0
 /**
  * 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')));
 }