00001 <?php
00022 final class Router
00023 {
00027 static private $vars = array(
00028 'route' => '',
00029 'module' => '',
00030 'controller' => '',
00031 'action' => 'index',
00032 'id' => '',
00033 'parameters' => array(),
00034 'all_parameters' => array(),
00035 'routed' => false
00036 );
00040 static private $routed_cyclic;
00041
00047 static function rewrite($url){
00051 self::$vars['route'] = $url;
00052
00053 if (!$url) { $url = '/'; }
00054
00055
00056 $url=self::ifRouted($url);
00057
00058
00059 $clean = array( '\\', '/../','//');
00060 $url_sanitize = str_replace($clean, '', $url, $errors);
00061
00062 if($errors) throw new KumbiaException("Posible intento de hack en URL: '$url'");
00063
00068 $url = trim($url,'/');
00069
00073 $url_items = explode ('/', $url);
00077 self::$vars['all_parameters'] = $url_items;
00078
00082 $item = current($url_items);
00083 if(is_dir(APP_PATH . "controllers/$item")) {
00084 self::$vars['module'] = current($url_items);
00085
00086
00087 if (next($url_items) === FALSE) {
00088 self::$vars['controller'] = 'index';
00089 return;
00090 }
00091 }
00092
00096 self::$vars['controller'] = current($url_items);
00097
00098 if (next($url_items) === FALSE) {
00099 return;
00100 }
00101
00105 self::$vars['action'] = current($url_items);
00106
00107 if (next($url_items) === FALSE) {
00108 return;
00109 }
00110
00114 self::$vars['id'] = current($url_items);
00115
00119 $key = key($url_items);
00120 $rest = count($url_items) - $key;
00121 $parameters = array_slice($url_items, $key, $rest);
00122
00123 self::$vars['parameters'] = $parameters;
00124 unset ($url_items);
00125 }
00126
00132 static function ifRouted($url){
00133 $routes = Config::read('routes.ini');
00134 $routes = $routes['routes'];
00135
00139 if(isset($routes[$url])){
00140 return $routes[$url];
00141 }
00142
00146 foreach ($routes as $key => $val) {
00147 if (strripos($key,'*',-1)){
00148 $key = substr($key, 0, -1);
00149 $key = str_replace('/','\/',$key);
00150 $pattern = '/^'.$key.'(.*)/';
00151 if (preg_match($pattern, $url, $match)){
00152 $url = str_replace('*', $match[1], $val);
00153
00154 return $url ;
00155 }
00156 }
00157 }
00158 return $url;
00159 }
00160
00166 public static function getRouted(){
00167 return self::$vars['routed'];
00168 }
00169
00174 public static function setRouted($value){
00175 self::$vars['routed'] = $value;
00176 }
00177
00187 static public function route_to(){
00188 self::$vars['routed'] = false;
00189 $cyclic_routing = false;
00190 $url = Util::getParams(func_get_args());
00191
00192 if(isset($url['module'])){
00193 if(self::$vars['module']==$url['module']){
00194 $cyclic_routing = true;
00195 }
00200 if(self::$vars['module']) {
00201 self::$vars['all_parameters'][0] = $url['module'];
00202 } else {
00203 array_unshift(self::$vars['all_parameters'], $url['module']);
00204 }
00205
00206 self::$vars['module'] = $url['module'];
00207 self::$vars['controller'] = 'index';
00208 self::$vars['action'] = "index";
00209 self::$vars['routed'] = true;
00210 }
00211 if(isset($url['controller'])){
00212 if(self::$vars['controller']==$url['controller']){
00213 $cyclic_routing = true;
00214 }
00215 self::$vars['controller'] = $url['controller'];
00216
00221 if(self::$vars['module']) {
00222 self::$vars['all_parameters'][1] = $url['controller'];
00223 } else {
00224 self::$vars['all_parameters'][0] = $url['controller'];
00225 }
00226
00227 self::$vars['action'] = "index";
00228 self::$vars['routed'] = true;
00229
00230 $app_controller = util::camelcase($url['controller'])."Controller";
00231 }
00232 if(isset($url['action'])){
00233 if(self::$vars['action']==$url['action']){
00234 $cyclic_routing = true;
00235 }
00236 self::$vars['action'] = $url['action'];
00241 if(self::$vars['module']) {
00242 self::$vars['all_parameters'][2] = $url['action'];
00243 } else {
00244 self::$vars['all_parameters'][1] = $url['action'];
00245 }
00246
00247 self::$vars['routed'] = true;
00248 }
00249 if(isset($url['id'])){
00250 if(self::$vars['id']==$url['id']){
00251 $cyclic_routing = true;
00252 }
00253 self::$vars['id'] = $url['id'];
00258 if(self::$vars['module']) {
00259 self::$vars['all_parameters'][3] = $url['action'];
00260 } else {
00261 self::$vars['all_parameters'][2] = $url['action'];
00262 }
00263
00264 self::$vars['parameters'][0] = $url['id'];
00265 self::$vars['routed'] = true;
00266 }
00267
00268 if($cyclic_routing){
00269 self::$routed_cyclic++;
00270 if(self::$routed_cyclic>=1000){
00271 throw new KumbiaException("Se ha detectado un enrutamiento ciclico. Esto puede causar problemas de estabilidad", 1000);
00272 }
00273 } else {
00274 self::$routed_cyclic = 0;
00275 }
00276 return null;
00277 }
00278
00284 static public function get($var=null) {
00285 if($var){
00286 return self::$vars[$var];
00287 } else {
00288 return self::$vars;
00289 }
00290 }
00291 }