NULL, //Ruta pasada en el GET 'module' => NULL, //Nombre del modulo actual 'controller' => 'index', //Nombre del controlador actual 'action' => 'index', //Nombre de la acción actual, por defecto index 'parameters' => array(), //Lista los parametros adicionales de la URL 'routed' => FALSE, //Indica si esta pendiente la ejecución de una ruta por parte del dispatcher 'controller_path' => 'index' ); /** * Toma $url y la descompone en (modulo), controlador, accion y argumentos * * @param string $url */ public static function rewrite($url) { //Valor por defecto self::$_vars['route'] = $url; // Se miran los parametros por seguridad str_replace(array( '\\', '/../','//'), '', $url, $errors); // Si hay intento de hack TODO: añadir la ip y referer en el log if($errors) throw new KumbiaException("Posible intento de hack en URL: '$url'"); //Si config.ini tiene routes activados, mira si esta routed if(Config::get('config.application.routes')){ $url = self::ifRouted($url); } if($url == '/'){ return self::$_vars; } //Se limpia la url, en caso de que la hallan escrito con el último parámetro sin valor, es decir controller/action/ // Obtiene y asigna todos los parámetros de la url $url_items = explode ('/', trim($url,'/')); // El primer parametro de la url es un módulo? if(is_dir(APP_PATH . "controllers/$url_items[0]")) { self::$_vars['module'] = $url_items[0]; // Si no hay mas parametros sale if (next($url_items) === FALSE) { self::$_vars['controller_path'] = "$url_items[0]/index"; return self::$_vars; } } // Controlador self::$_vars['controller'] = current($url_items); self::$_vars['controller_path'] = (self::$_vars['module']) ? "$url_items[0]/$url_items[1]" : current($url_items); // Si no hay mas parametros sale if (next($url_items) === FALSE) { return self::$_vars; } // Acción self::$_vars['action'] = current($url_items); // Si no hay mas parametros sale if (next($url_items) === FALSE) { return self::$_vars; } // Crea los parámetros y los pasa self::$_vars['parameters'] = array_slice($url_items, key($url_items)); return self::$_vars; } /** * Busca en la tabla de entutamiento si hay una ruta en config/routes.ini * para el controlador, accion, id actual * */ private static function ifRouted($url) { $routes = Config::read('routes'); $routes = $routes['routes']; // Si existe una ruta exacta la devuelve if(isset($routes[$url])){ return $routes[$url]; } // Si existe una ruta con el comodin * crea la nueva ruta foreach ($routes as $key => $val) { if (strripos($key,'*',-1)){ $key = rtrim($key, '*'); if(strncmp($url, $key, strlen($key)) == 0) return str_replace($key, rtrim($val,'*'), $url); } } return $url; } /** * Devuelve el estado del router * * @return boolean */ public static function getRouted() { return self::$_vars['routed']; } /** * Establece el estado del Router * */ public static function setRouted($value) { self::$_vars['routed'] = $value; } /** * Enruta el controlador actual a otro módulo, controlador, o a otra acción * Ej: * Router::route_to(["module: modulo"], "controller: nombre", ["action: accion"], ["parameters: xxx/xxx/..."]) * */ public static function route_to() { static $cyclic = 0; self::$_vars['routed'] = TRUE; $url = Util::getParams(func_get_args()); if(isset($url['module'])){ self::$_vars['module'] = $url['module']; self::$_vars['controller'] = 'index'; self::$_vars['action'] = 'index'; self::$_vars['parameters'] = array(); self::$_vars['controller_path'] = $url['module']. '/index'; } if(isset($url['controller'])){ self::$_vars['controller'] = $url['controller']; self::$_vars['action'] = 'index'; self::$_vars['parameters'] = array(); self::$_vars['controller_path'] = (isset($url['module'])) ? $url['module'].'/'.$url['controller'] : $url['controller']; } if(isset($url['action'])){ self::$_vars['action'] = $url['action']; self::$_vars['parameters'] = array(); } if(isset($url['parameters'])){ self::$_vars['parameters'] = explode('/',$url['parameters']); }elseif (isset($url['id'])){ // Deprecated self::$_vars['parameters'] = array($url['id']); } else { self::$_vars['parameters'] = array(); } if(++$cyclic > 1000) throw new KumbiaException('Se ha detectado un enrutamiento cíclico. Esto puede causar problemas de estabilidad'); } /** * Envia el valor de un atributo o el array con todos los atributos y sus valores del router * Mirar el atributo vars del router * ej. * Router::get() * * @param ninguno * @return array con todas los atributos y sus valores * * ej. * Router::get('controller') * * @param string un atributo: route, module, controller, action, parameters o routed * @return string con el valor del atributo **/ public static function get($var = NULL) { if($var){ return self::$_vars[$var]; } else { return self::$_vars; } } /** * Redirecciona la ejecución a otro controlador en un * tiempo de ejecución determinado * * @param string $route * @param integer $seconds */ public static function redirect($route = NULL, $seconds = NULL) { if(!$route) $route = self::$_vars['controller_path'].'/'; $route = PUBLIC_PATH . ltrim($route,'/'); if($seconds){ header("Refresh: $seconds; url=$route"); } else { header("Location: $route"); $_SESSION['KUMBIA.CONTENT'] = ob_get_clean(); View::select(NULL, NULL); } } /** * Redirecciona la ejecución a una accion del controlador actual en un * tiempo de ejecución determinado * * @param string $action * @param integer $seconds */ public static function toAction($action, $seconds = NULL) { self::redirect(self::$_vars['controller_path'] . "/$action", $seconds); } }