`
flex_莫冲
  • 浏览: 1091830 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

TP的module支持中文

阅读更多
為了讓URL支持中文,例如www.xxx.com/廣州/xx 需要在emptyAction中處理捕獲到的廣州/xxxx。但是TP默認的module名稱是不支持中文的。因此需要修改TP框架的PHP核心文件:
App.class.php
修改後的代碼:
/**
     * 执行应用程序
     * @access public
     * @return void
     */
    static public function exec() {
        if(!preg_match('/^[A-Za-z](\w)*$/',MODULE_NAME) ){ // 安全检测
            $module  =  false;
        }else{
			
            //创建Action控制器实例
            $group   =  defined('GROUP_NAME') && C('APP_GROUP_MODE')==0 ? GROUP_NAME.'/' : '';
			//$module  =  A($group.MODULE_NAME);

			
			if(preg_match("/[\x7f-\xff]/", MODULE_NAME)){//中文模式
				if(in_array(MODULE_NAME,C('CHINESE_MODULE_NAME'))){	//在指定的中文內
					$module  =  A($group.'isTheEmpty');
				}else{
					_404(L('_MODULE_NOT_EXIST_').':'.MODULE_NAME);
				}
			}else{
				$module  =  A($group.MODULE_NAME);
			}
        }

        if(!$module) {
			
            if('4e5e5d7364f443e28fbf0d3ae744a59a' == MODULE_NAME) {
                header("Content-type:image/png");
                exit(base64_decode(App::logo()));
            }
            if(function_exists('__hack_module')) {
                // hack 方式定义扩展模块 返回Action对象
                $module = __hack_module();
                if(!is_object($module)) {
                    // 不再继续执行 直接返回
                    return ;
                }
            }else{
                // 是否定义Empty模块
                $module = A($group.'Empty');
                if(!$module){
                    _404(L('_MODULE_NOT_EXIST_').':'.MODULE_NAME);
                }
            }
        }
        // 获取当前操作名 支持动态路由
        $action = C('ACTION_NAME')?C('ACTION_NAME'):ACTION_NAME;
        $action .=  C('ACTION_SUFFIX');
        try{
            if(!preg_match('/^[A-Za-z](\w)*$/',$action)){
                // 非法操作
                throw new ReflectionException();
            }
            //执行当前操作
            $method =   new ReflectionMethod($module, $action);
            if($method->isPublic()) {
                $class  =   new ReflectionClass($module);
                // 前置操作
                if($class->hasMethod('_before_'.$action)) {
                    $before =   $class->getMethod('_before_'.$action);
                    if($before->isPublic()) {
                        $before->invoke($module);
                    }
                }
                // URL参数绑定检测
                if(C('URL_PARAMS_BIND') && $method->getNumberOfParameters()>0){
                    switch($_SERVER['REQUEST_METHOD']) {
                        case 'POST':
                            $vars    =  array_merge($_GET,$_POST);
                            break;
                        case 'PUT':
                            parse_str(file_get_contents('php://input'), $vars);
                            break;
                        default:
                            $vars  =  $_GET;
                    }
                    $params =  $method->getParameters();
                    foreach ($params as $param){
                        $name = $param->getName();
                        if(isset($vars[$name])) {
                            $args[] =  $vars[$name];
                        }elseif($param->isDefaultValueAvailable()){
                            $args[] = $param->getDefaultValue();
                        }else{
                            throw_exception(L('_PARAM_ERROR_').':'.$name);
                        }
                    }
                    $method->invokeArgs($module,$args);
                }else{
                    $method->invoke($module);
                }
                // 后置操作
                if($class->hasMethod('_after_'.$action)) {
                    $after =   $class->getMethod('_after_'.$action);
                    if($after->isPublic()) {
                        $after->invoke($module);
                    }
                }
            }else{
                // 操作方法不是Public 抛出异常
                throw new ReflectionException();
            }
        } catch (ReflectionException $e) { 
            // 方法调用发生异常后 引导到__call方法处理
            $method = new ReflectionMethod($module,'__call');
            $method->invokeArgs($module,array($action,''));
        }
        return ;
    }



將需要支持的中文module名稱添加到config.php CHINESE_MODULE_NAME 配置數組中

這樣就能支持中文URL解析了。
分享到:
评论

相关推荐

    驱动读写游戏支持个大TP

    支持个大TP游戏支持个大TP游戏支持个大TP游戏支持个大TP游戏支持个大TP游戏支持个大TP游戏支持个大TP游戏支持个大TP游戏支持个大TP游戏支持个大TP游戏支持个大TP游戏支持个大TP游戏支持个大TP游戏支持个大TP游戏支持...

    tp6806_refer_osg_tp6806_

    【标题】"TP6806_refer_osg_tp6806_" 指的是一个与TP6806相关的SDK开发包,其中包含了OSG(OpenSceneGraph)的参考资料。OSG是一种开源的3D图形库,常用于构建高性能的实时三维图形应用。 【描述】"TP6806 SDK v...

    tp4056中文资料

    ### TP4056中文资料详解 #### 一、概述 TP4056是一款针对单节锂离子电池设计的完整恒流/恒压线性充电器芯片,它集成了必要的充电控制电路,使得设计简单且高效。此款芯片不仅支持USB电源,还兼容适配器电源,并...

    TP2853资料

    这款芯片属于4-in-1 HD-TVI/NTSC/PAL视频解码器系列,其中的TP2853型号是该系列中支持最高500万像素摄像头输入的芯片。 知识点一:同轴高清视频传输技术 同轴高清视频传输技术,又称AHD(Analog High Definition)...

    TP支持机型及可用原厂固件说明

    TP支持机型及可用原厂固件说明 本资源主要介绍了TP-LINK机型的U-Boot支持机型及可用原厂固件说明,涵盖了多种硬件配置、内存大小、机型等信息。 一、TP UBOOT支持机型 TP UBOOT支持机型包括: * AR2317 + 88E...

    西门子TP1200触摸屏不能显示汉字和摄氏度符号,中文字符显示异常的处理对策.docx

    首先,当发现西门子TP1200触摸屏上的中文字符显示为乱码时,首先要考虑的是字体设置问题。默认情况下,西门子推荐使用宋体作为中文文本的显示字体,因为宋体已经过西门子技术部门的严格测试,能够确保在触摸屏上正确...

    西门子 TP 170micro、TP 170A、TP 中文手册.zip

    西门子 TP 170 系列触摸屏是工业...综上所述,这份中文手册是西门子 TP 170 系列触摸屏用户的重要参考资料,不仅帮助用户掌握设备的基本操作,还能深入理解其高级功能,从而在工业自动化环境中实现高效、可靠的控制。

    TP900通讯工具_TP900驱动_tp通讯工具_TP900_

    总的来说,TP900通讯工具是为TP900设备提供全面支持的关键软件组件,它使得用户能够轻松地与设备交互,实现数据的高效传输和设备的有效管理。对于需要使用TP900设备的工程师和开发者来说,正确安装和使用这套工具是...

    过tp驱动.zip_TP_TP保护_tp驱动_过TP保护_过tp

    4. **触摸板手势控制**:过TP驱动可能支持多指手势,如两指滑动、三指切换应用等,提供更丰富的交互体验。 TP驱动的更新和优化对于提升用户体验至关重要。有时,用户可能会遇到触摸板反应不灵敏、无法识别手势或者...

    TP900S通讯工具(兼容TP900)_TP900S_TP900_

    在实际操作中,TP900S通讯工具可能会支持多种通信协议,如TCP/IP、MODBUS、CANbus等,以适应不同的网络环境和设备需求。同时,为了确保安全,它可能还包含了加密和身份验证机制,防止未经授权的数据访问。在使用过程...

    TP2825_v01.zip_TP2825_v01 tp2825_tp2825l芯片_tp2825资料_withoutzce_海

    tp2825 海思hi3516开发板驱动,集成程度高。。。。。。

    TP3064 TP3067 中文资料

    ### 关于TP3064与TP3067单片机PCM CODEC/滤波器的知识点 #### 一、概述 TP3064和TP3067是两款专为数字音频处理设计的单片机PCM CODEC(脉冲编码调制编解码器)/滤波器芯片。这两款芯片主要应用于语音通信领域,如...

    tp28xx_kdrv_tp9930.tar.gz

    【标题】"tp28xx_kdrv_tp9930.tar.gz" 提供的是与 TP2828 和 TP2831 芯片以及 TP9930 模块相关的驱动程序集合,这个压缩包很可能是针对 Linux 操作系统的一个软件包,因为 ".tar.gz" 文件格式在 Linux 环境中常见...

    TP900S工具和驱动文件2.0_TP900usb驱动_振中驱动_振中900驱动_振中900驱动_振中TP900s驱动及工具_源

    振中TP900S工具和驱动文件2.0是一个专为振中TP900S设备设计的软件包,包含了一系列重要的驱动程序和实用工具,使得用户能够顺利地进行程序烧录和设备的正常连接。这个软件包的发布旨在解决用户在与TP900S交互时可能...

    TP6800芯片资料

    对于选择使用凌越硬件解决方案的项目,TP6800提供了良好的支持,使得开发者能够快速地将摄像头模块集成到现有的系统架构中,减少开发周期和成本。 ### 3. 技术特性 #### 3.1 图像处理能力 作为一款专为USB摄像头...

    TP2830spec100218_brief.pdf

    6. TP2830还支持多种机械封装方式,包括88脚QFN封装,方便在不同的硬件平台上使用。 7. TP2830的控制寄存器包括视频输入状态寄存器、解码控制寄存器、检测状态寄存器、内部状态寄存器、复位控制寄存器、EQ控制...

    L2TP客户端

    用于WINDOWS平台下的L2TP客户端工具,支持思科,华为等主要网络设备的L2TP技术,可支持PPTP。。

    Can网络诊断15765中文全套.zip_CAN TP_CAN TP2.0协议_CAN诊断协议_ISO15765_can协议is

    这个压缩包提供了对CAN TP(传输层)和CAN TP2.0协议的详细解读,以及CAN诊断协议的相关内容,对于初学者来说,中文版的文档能更便于理解和学习。 首先,ISO15765-2是该标准的一部分,主要规定了数据链路层(DLL)...

    Hi3519A_imx377_tp2850+驱动.rar

    1. "tp2850.ko" - 这是Linux内核模块的文件扩展名,表示这是一个编译好的驱动程序模块,可以直接加载到Linux内核中,为tp2850硬件提供支持。 2. "cfg.mak" - 可能是配置文件,包含了编译或安装驱动程序时的参数和...

    tp2852_reference_v1r1.pdf

    首先,TP2852支持多种高清模拟信号的编解码,这些信号包括但不限于720P、1080P等高清格式。这种能力使得TP2852能够适应多种不同的应用场景,包括但不限于安全监控、视频会议、医疗成像等。 其次,TP2852具有高效率...

Global site tag (gtag.js) - Google Analytics