Exemplo n.º 1
0
 function index()
 {
     $routes = $this->route_model->order("listorder asc")->select();
     sp_get_routes(true);
     $this->assign("routes", $routes);
     $this->display();
 }
Exemplo n.º 2
0
/**
 * URL组装 支持不同URL模式
 * @param string $url URL表达式,格式:'[模块/控制器/操作#锚点@域名]?参数1=值1&参数2=值2...'
 * @param string|array $vars 传入的参数,支持数组和字符串
 * @param string $suffix 伪静态后缀,默认为true表示获取配置值
 * @param boolean $domain 是否显示域名
 * @return string
 */
function leuu($url = '', $vars = '', $suffix = true, $domain = false)
{
    $routes = sp_get_routes();
    if (empty($routes)) {
        return U($url, $vars, $suffix, $domain);
    } else {
        // 解析URL
        $info = parse_url($url);
        $url = !empty($info['path']) ? $info['path'] : ACTION_NAME;
        if (isset($info['fragment'])) {
            // 解析锚点
            $anchor = $info['fragment'];
            if (false !== strpos($anchor, '?')) {
                // 解析参数
                list($anchor, $info['query']) = explode('?', $anchor, 2);
            }
            if (false !== strpos($anchor, '@')) {
                // 解析域名
                list($anchor, $host) = explode('@', $anchor, 2);
            }
        } elseif (false !== strpos($url, '@')) {
            // 解析域名
            list($url, $host) = explode('@', $info['path'], 2);
        }
        // 解析子域名
        //TODO?
        // 解析参数
        if (is_string($vars)) {
            // aaa=1&bbb=2 转换成数组
            parse_str($vars, $vars);
        } elseif (!is_array($vars)) {
            $vars = array();
        }
        if (isset($info['query'])) {
            // 解析地址里面参数 合并到vars
            parse_str($info['query'], $params);
            $vars = array_merge($params, $vars);
        }
        $vars_src = $vars;
        ksort($vars);
        // URL组装
        $depr = C('URL_PATHINFO_DEPR');
        $urlCase = C('URL_CASE_INSENSITIVE');
        if ('/' != $depr) {
            // 安全替换
            $url = str_replace('/', $depr, $url);
        }
        // 解析模块、控制器和操作
        $url = trim($url, $depr);
        $path = explode($depr, $url);
        $var = array();
        $varModule = C('VAR_MODULE');
        $varController = C('VAR_CONTROLLER');
        $varAction = C('VAR_ACTION');
        $var[$varAction] = !empty($path) ? array_pop($path) : ACTION_NAME;
        $var[$varController] = !empty($path) ? array_pop($path) : CONTROLLER_NAME;
        if ($maps = C('URL_ACTION_MAP')) {
            if (isset($maps[strtolower($var[$varController])])) {
                $maps = $maps[strtolower($var[$varController])];
                if ($action = array_search(strtolower($var[$varAction]), $maps)) {
                    $var[$varAction] = $action;
                }
            }
        }
        if ($maps = C('URL_CONTROLLER_MAP')) {
            if ($controller = array_search(strtolower($var[$varController]), $maps)) {
                $var[$varController] = $controller;
            }
        }
        if ($urlCase) {
            $var[$varController] = parse_name($var[$varController]);
        }
        $module = '';
        if (!empty($path)) {
            $var[$varModule] = array_pop($path);
        } else {
            if (C('MULTI_MODULE')) {
                if (MODULE_NAME != C('DEFAULT_MODULE') || !C('MODULE_ALLOW_LIST')) {
                    $var[$varModule] = MODULE_NAME;
                }
            }
        }
        if ($maps = C('URL_MODULE_MAP')) {
            if ($_module = array_search(strtolower($var[$varModule]), $maps)) {
                $var[$varModule] = $_module;
            }
        }
        if (isset($var[$varModule])) {
            $module = $var[$varModule];
        }
        if (C('URL_MODEL') == 0) {
            // 普通模式URL转换
            $url = __APP__ . '?' . http_build_query(array_reverse($var));
            if ($urlCase) {
                $url = strtolower($url);
            }
            if (!empty($vars)) {
                $vars = http_build_query($vars);
                $url .= '&' . $vars;
            }
        } else {
            // PATHINFO模式或者兼容URL模式
            if (empty($var[C('VAR_MODULE')])) {
                $var[C('VAR_MODULE')] = MODULE_NAME;
            }
            $module_controller_action = strtolower(implode($depr, array_reverse($var)));
            $has_route = false;
            if (isset($routes[$module_controller_action])) {
                $urlrules = $routes[$module_controller_action];
                $empty_query_urlrule = array();
                foreach ($urlrules as $ur) {
                    $intersect = array_intersect($ur['query'], $vars);
                    if ($intersect) {
                        $vars = array_diff_key($vars, $ur['query']);
                        $url = $ur['url'];
                        $has_route = true;
                        break;
                    }
                    if (empty($empty_query_urlrule) && empty($ur['query'])) {
                        $empty_query_urlrule = $ur;
                    }
                }
                if (!empty($empty_query_urlrule)) {
                    $url = $empty_query_urlrule['url'];
                    foreach ($vars as $key => $value) {
                        if (strpos($url, ":{$key}") !== false) {
                            $url = str_replace(":{$key}", $value, $url);
                            unset($vars[$key]);
                        }
                    }
                    $url = str_replace(array("\\d", "\$"), "", $url);
                    $has_route = true;
                }
                if ($has_route) {
                    if (!empty($vars)) {
                        // 添加参数
                        foreach ($vars as $var => $val) {
                            if ('' !== trim($val)) {
                                $url .= $depr . $var . $depr . urlencode($val);
                            }
                        }
                    }
                    $url = __APP__ . "/" . $url;
                }
            }
            if (!$has_route) {
                $module = defined('BIND_MODULE') ? '' : $module;
                $url = __APP__ . '/' . implode($depr, array_reverse($var));
                if ($urlCase) {
                    $url = strtolower($url);
                }
                if (!empty($vars)) {
                    // 添加参数
                    foreach ($vars as $var => $val) {
                        if ('' !== trim($val)) {
                            $url .= $depr . $var . $depr . urlencode($val);
                        }
                    }
                }
            }
            if ($suffix) {
                $suffix = $suffix === true ? C('URL_HTML_SUFFIX') : $suffix;
                if ($pos = strpos($suffix, '|')) {
                    $suffix = substr($suffix, 0, $pos);
                }
                if ($suffix && '/' != substr($url, -1)) {
                    $url .= '.' . ltrim($suffix, '.');
                }
            }
        }
        if (isset($anchor)) {
            $url .= '#' . $anchor;
        }
        if ($domain) {
            $url = (is_ssl() ? 'https://' : 'http://') . $domain . $url;
        }
        return $url;
    }
}