TP's module supports Chinese

巴扎黑
Release: 2016-11-11 09:56:08
Original
1482 people have browsed it

In order for the URL to support Chinese, such as www.xxx.com/Guangzhou/xx, the captured Guangzhou/xxxx needs to be processed in emptyAction. However, the default module name of TP does not support Chinese. Therefore, you need to modify the PHP core file of the TP framework:
App.class.php
Modified code:

Java code

/** 
     * 执行应用程序 
     * @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 ;  
    }
Copy after login



Add the Chinese module name that needs to be supported to the config.php CHINESE_MODULE_NAME configuration array

This will support Chinese URL parsing.


Related labels:
php
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template