static function default_dispatcher() { if (Input::$AJAX && Input::$AJAX['widget']) { $widget = Widget::factory(Input::$AJAX['widget']); $method = 'on_' . (Input::$AJAX['object'] ?: 'unknown') . '_' . (Input::$AJAX['event'] ?: 'unknown'); if (method_exists($widget, $method)) { Event::bind('system.output', 'Output::AJAX'); $widget->{$method}(); } return; } $args = Input::args(); $default_page = Config::get('system.default_page'); if (!$default_page) { $default_page = 'index'; } //从末端开始尝试 /* home/page/edit.1 home/page/index.php Index_Controller::edit(1) home/page/index.php Index_Controller::index('edit', 1) home/page.php Page_Controller::edit(1) home/page.php Page_Controller::index('edit', 1) */ $file = end($args); if (!preg_match('/[^\\\\]\\./', $file)) { //有非法字符的只能是参数 $path = implode('/', $args); // home/page/edit/index => index, NULL $candidates[($path ? $path . '/' : '') . $default_page] = array($default_page, NULL); $candidates[$path] = array($file, NULL); // home/page/edit => edit, NULL } if ($args) { $params = array_pop($args); $file = $args ? end($args) : $default_page; $path = $args ? implode('/', $args) : $default_page; $candidates[$path] = array($file, $params); // home/page.php => page, edit|1 } else { $candidates[$default_page] = array($default_page, NULL); } $class = NULL; foreach ($candidates as $path => $candidate) { if (Core::load(CONTROLLER_BASE, $path)) { $class = str_replace('/', '_', $path); $params = array(); if (preg_match_all('/(.*?[^\\\\])\\./', $candidate[1] . '.', $parts)) { foreach ($parts[1] as $part) { $params[] = strtr($part, array('\\.' => '.')); } } Config::set('system.controller_path', $path); Config::set('system.controller_class', $class); break; } } if (!$class) { URI::redirect('error/404'); } if (Input::$AJAX) { $class .= AJAX_SUFFIX; if (!class_exists($class, false)) { Core::load(CONTROLLER_BASE, 'ajax'); $class = 'AJAX' . CONTROLLER_SUFFIX; } $controller = new $class(); $object = Input::$AJAX['object']; $event = Input::$AJAX['event']; $method = $params[0]; if (!$method || $method[0] == '_') { $method = 'index_'; } $method .= '_' . ($object ? $object . '_' : '') . $event; if (method_exists($controller, $method)) { array_shift($params); } else { $method = 'index_' . ($object ? $object . '_' : '') . $event; if (!method_exists($controller, $method)) { $method = NULL; } } if ($method) { Controller::$CURRENT = $controller; Config::set('system.controller_method', $method); Config::set('system.controller_params', $params); $controller->_before_call($method, $params); call_user_func_array(array($controller, $method), $params); $controller->_after_call($method, $params); } } else { $class .= CONTROLLER_SUFFIX; $controller = new $class(); $method = $params[0]; if ($method && $method[0] != '_' && method_exists($controller, $method)) { array_shift($params); } elseif ($method && $method[0] != '_' && method_exists($controller, 'do_' . $method)) { $method = 'do_' . $method; array_shift($params); } else { $method = 'index'; } Controller::$CURRENT = $controller; Config::set('system.controller_method', $method); Config::set('system.controller_params', $params); $controller->_before_call($method, $params); call_user_func_array(array($controller, $method), $params); $controller->_after_call($method, $params); } }
static function setup() { if (function_exists("get_magic_quotes_gpc") && get_magic_quotes_gpc() || ini_get('magic_quotes_sybase') && strtolower(ini_get('magic_quotes_sybase')) != "off") { Input::stripslashes_deep($_GET); Input::stripslashes_deep($_POST); Input::stripslashes_deep($_COOKIE); } $route = $_SERVER['PATH_INFO']; if (!$route) { $route = $_SERVER['ORIG_PATH_INFO']; } $route = preg_replace('/^[\\/ ]*|[\\/ ]*$|' . preg_quote(Config::get('system.url_suffix')) . '$/iu', '', $route); Input::$route = $route; $args = array(); if (preg_match_all('/(.*?[^\\\\])\\//', $route . '/', $parts)) { foreach ($parts[1] as $part) { $args[] = strtr($part, array('\\/' => '/')); } } Input::$args = $args; Input::$get = $_GET; Input::$form = array_merge($_POST, $_GET); Input::$files = $_FILES; $query = $_GET; Input::$url = URI::url(Input::$route, $query); if ($_POST['_ajax']) { /* $data=json_decode($_POST['_data'], TRUE); if($data){ $new_data=array(); foreach($data as $k=>$v){ if(preg_match('/^(\S+?)(\[.+\])$/', $k, $p1)){ $key=$p1[1]; preg_match_all('/\[(\S+?)\]/', $p1[2], $p2); while(NULL !== ($p=array_pop($p2[1]))){ $v=array($p=>$v); } if(is_array($new_data[$key]) && is_array($v)){ Misc::array_merge_deep($new_data[$key], $v); } else { $new_data[$key]=$v; } }else{ $new_data[$k] = $v; } } Input::$form=array_merge(Input::$form, $new_data); } */ Input::$AJAX['widget'] = $_POST['_widget']; Input::$AJAX['object'] = $_POST['_object']; Input::$AJAX['event'] = $_POST['_event']; Input::$AJAX['mouse'] = $_POST['_mouse']; Input::$AJAX['view'] = $_POST['_view']; unset(Input::$form['_ajax']); unset(Input::$form['_data']); unset(Input::$form['_widget']); unset(Input::$form['_object']); unset(Input::$form['_event']); unset(Input::$form['_mouse']); unset(Input::$form['_view']); } }