<?php
/**
* +----------------------------------------------------------------------
* | TickyPHP [ This is a freeware ]
* +----------------------------------------------------------------------
* | Copyright (c) 2015 All rights reserved.
* +----------------------------------------------------------------------
* | Author: 罗敏贵 <e-mail:minguiluo@163.com> <QQ:271391233>
* +----------------------------------------------------------------------
* | SVN: $Id: param.php 09594 2018-09-04 09:29:53 luomingui $
* +----------------------------------------------------------------------
* | 文件功能:参数处理类
* +----------------------------------------------------------------------
*/
namespace ticky;
use ticky\helper\file;
class route {
static $config = null; static $handler = null;
static public function dispatch() {
self::getconfig();
defined('MODULE_NAME') or define('MODULE_NAME', self::route_m()); defined('CONTROLLER_NAME') or define('CONTROLLER_NAME', self::route_c()); defined('ACTION_NAME') or define('ACTION_NAME', self::route_a());
define('MODULE_PATH', APP_PATH . DS . MODULE_NAME); define('CONTROLLER_PATH', MODULE_PATH . DS . 'controller'); define('MODEL_PATH', MODULE_PATH . DS . 'model'); define('VIEW_PATH', MODULE_PATH . DS . 'view'); define('CONFIG_PATH', MODULE_PATH . DS . 'config'); define('FILTER_PATH', MODULE_PATH . DS . 'filter'); $fullController = app::$namespace . '\\' . MODULE_NAME . '\\' . 'controller\\' . CONTROLLER_NAME;
if (!is_dir(APP_PATH . DS . MODULE_NAME)) {
app::halt('module does not exist : ' . MODULE_NAME);
}
if (!class_exists($fullController)) {
app::halt('Controller does not exist : ' . $fullController);
}
if (!method_exists($fullController, ACTION_NAME) && !method_exists($fullController, '__call')) {
app::halt('Action does not exist : ' . ACTION_NAME);
}
filter::globals();
filter::module();
self::load_model_resources();
if (!(self::$handler)) {
self::$handler = new $fullController();
}
runlog('route', app::$namespace . '\\' . MODULE_NAME . '\\' . 'controller\\' . CONTROLLER_NAME . '\\' . ACTION_NAME);
$ret = call_user_func([self::$handler, ACTION_NAME]);
if (APP_DEBUG) {
if (!(MODULE_NAME == "admin" && CONTROLLER_NAME == "index" && ACTION_NAME == "index")) {
debug::stop();
if (!defined('DEBUG_HIDDEN')) {
debug::message();
}
}
}
return $ret;
}
static public function route_m() {
$m = isset($_GET['m']) && !empty($_GET['m']) ? $_GET['m'] : (isset($_POST['m']) && !empty($_POST['m']) ? $_POST['m'] : '');
$m = self::safe_deal($m);
if (empty($m)) {
return self::$config['default_module'];
} else {
if (is_string($m))
return $m;
}
}
static public function route_c() {
$c = isset($_GET['c']) && !empty($_GET['c']) ? $_GET['c'] : (isset($_POST['c']) && !empty($_POST['c']) ? $_POST['c'] : '');
$c = self::safe_deal($c);
if (empty($c)) {
$c = self::$config['default_controller'];
}
return $c;
}
static public function route_a() {
$a = isset($_GET['a']) && !empty($_GET['a']) ? $_GET['a'] : (isset($_POST['a']) && !empty($_POST['a']) ? $_POST['a'] : '');
$a = self::safe_deal($a);
if (empty($a)) {
return self::$config['default_action'];
} else {
if (is_string($a))
return $a;
}
}
static public function url($url = '', $vars = '', $domain = false) {
$url = trim($url, '/');
$arr = explode('/', $url);
$num = count($arr);
$string = SITE_PATH;
if (URL_MODEL == 0) {
$string .= 'index.php?';
if ($num == 3) {
$string .= 'm=' . $arr[0] . '&c=' . $arr[1] . '&a=' . $arr[2];
} elseif ($num == 2) {
$string .= 'm=' . MODULE_NAME . '&c=' . $arr[0] . '&a=' . $arr[1];
} else {
$string .= 'm=' . MODULE_NAME . '&c=' . CONTROLLER_NAME . '&a=' . $arr[0];
}
if ($vars) {
if (is_array($vars))
$vars = http_build_query($vars);
$string .= '&' . $vars;
}
}else {
if (URL_MODEL == 1) {
$string .= 'index.php?s=';
}
if ($num == 3) {
$string .= $url;
} elseif ($num == 2) {
$string .= MODULE_NAME . '/' . $url;
} else {
$string .= MODULE_NAME . '/' . CONTROLLER_NAME . '/' . $url;
}
if ($vars) {
if (!is_array($vars)) {
parse_str($vars, $vars);
}
foreach ($vars as $var => $val) {
if (trim($val) !== '') {
$string .= '/' . urlencode($var) . '/' . urlencode($val);
}
}
}
$string .= '.' . self::$config['default_extension'];
}
if (URL_MODEL == 3 || $domain) {
$string = SERVER_PORT . HTTP_HOST . $string;
}
return $string;
}
static private function safe_deal($str) {
if (!MAGIC_QUOTES_GPC)
$str = addslashes($str);
return str_replace(array('/', '.'), '', $str);
}
static private function getconfig() {
if (is_null(self::$config)) {
self::$config = config('http');
}
if (URL_MODEL != 0) {
if (self::$config['set_pathinfo']) {
self::set_pathinfo();
}
self::pathinfo_url();
}
return true;
}
static private function set_pathinfo() {
if (isset($_GET['s']) && !empty($_GET['s']))
return;
$pathinfo = str_replace($_SERVER['SCRIPT_NAME'], '', $_SERVER['REQUEST_URI']);
if ($pathinfo) {
$pathinfo = urldecode($pathinfo);
$pos = strpos($pathinfo, '?');
if ($pos !== false)
$pathinfo = substr($pathinfo, 0, $pos);
if ($pathinfo)
$_GET['s'] = $pathinfo;
}
}
static private function pathinfo_url() {
if (!isset($_GET['s'])) {
return false;
}
$_SERVER['PATH_INFO'] = $_GET['s'];
unset($_GET['s']);
if (isset($_SERVER['PATH_INFO']) && !empty($_SERVER['PATH_INFO'])) {
$_SERVER['PATH_INFO'] = str_ireplace(array(self::$config['default_extension'], 'index.php'), '', $_SERVER['PATH_INFO']);
if (self::$config['route_mapping']) {
self::mapping(set_mapping());
}
$pathinfo = explode('/', trim($_SERVER['PATH_INFO'], '/'));
$_GET['m'] = isset($pathinfo[0]) ? $pathinfo[0] : '';
$_GET['c'] = isset($pathinfo[1]) ? $pathinfo[1] : '';
$_GET['a'] = isset($pathinfo[2]) ? $pathinfo[2] : '';
for ($i = 3; $i < count($pathinfo); $i += 2) {
if (isset($pathinfo[$i + 1])) {
$_GET[$pathinfo[$i]] = $pathinfo[$i + 1];
}
}
}
return true;
}
static private function mapping($rules) {
if (!is_array($rules))
return;
$pathinfo = trim($_SERVER['PATH_INFO'], '/');
foreach ($rules as $k => $v) {
$reg = '/' . $k . '/i';
if (preg_match($reg, $pathinfo)) {
$res = preg_replace($reg, $v, $pathinfo);
$_SERVER['PATH_INFO'] = '/' . $res;
}
}
}
static private function load_model_resources() {
Lang::load([
APP_PATH . DS . MODULE_NAME . DS . 'lang' . DS . strtolower(config::get('lang', 'default_lang')) . ".php",
]);
$configFile = [
'1' => APP_PATH . DS . MODULE_NAME . DS . 'function' . DS . 'function.php',
'2' => APP_PATH . DS . MODULE_NAME . DS . 'function' . DS . 'function_' . MODULE_NAME . '.php',
'3' => APP_PATH . DS . MODULE_NAME . DS . 'function' . DS . 'function_' . CONTROLLER_NAME . '.php',
'4' => APP_PATH . DS . MODULE_NAME . DS . 'include' . DS . 'include.php',
'5' => APP_PATH . DS . MODULE_NAME . DS . 'include' . DS . 'include_' . MODULE_NAME . '.php',
'6' => APP_PATH . DS . MODULE_NAME . DS . 'include' . DS . 'include_' . CONTROLLER_NAME . '.php',
];
foreach ($configFile as $x => $x_value) {
<br>';
if (is_file($x_value)) {
file::load($x_value);
}
}
}
}