/**
获取模版文件 格式 资源://模块@主题/控制器/操作
@param string $template 模版资源地址
@param string $layer 视图层(目录)名称
@return string
*/
function T( t e m p l a t e = ′ ′ , template='', template=′′,layer=’’){
// 解析模版资源地址
if(false === strpos($template,’?/’)){
t e m p l a t e = ′ h t t p : / / ′ . s t r r e p l a c e ( ′ : ′ , ′ / ′ , template = 'http://'.str_replace(':', '/', template=′http://′.strreplace(′:′,′/′,template);
}
i n f o = p a r s e u r l ( info = parse_url( info=parseurl(template);
$file = i n f o [ ′ h o s t ′ ] . ( i s s e t ( info['host'].(isset( info[′host′].(isset(info[‘path’])?$info[‘path’]:’’);
m o d u l e = i s s e t ( module = isset( module=isset(info[‘user’])?$info[‘user’].’/’:MODULE_NAME.’/’;
$extend = $info[‘scheme’];
$layer = l a y e r ? layer? layer?layer:C(‘DEFAULT_V_LAYER’);
// 获取当前主题的模版路径
a u t o = C ( ′ A U T O L O A D N A M E S P A C E ′ ) ; i f ( auto = C('AUTOLOAD_NAMESPACE'); if( auto=C(′AUTOLOADNAMESPACE′);if(auto && isset( a u t o [ auto[ auto[extend])){ // 扩展资源
$baseUrl = a u t o [ auto[ auto[extend]. m o d u l e . module. module.layer.’/’;
}elseif(C(‘VIEW_PATH’)){
// 改变模块视图目录
$baseUrl = C(‘VIEW_PATH’);
}elseif(defined(‘TMPL_PATH’)){
// 指定全局视图目录
b a s e U r l = T M P L P A T H . baseUrl = TMPL_PATH. baseUrl=TMPLPATH.module;
}else{
b a s e U r l = A P P P A T H . baseUrl = APP_PATH. baseUrl=APPPATH.module.$layer.’/’;
}
// 获取主题
t h e m e = s u b s t r c o u n t ( theme = substr_count( theme=substrcount(file,’/’)<2 ? C(‘DEFAULT_THEME’) : ‘’;
// 分析模板文件规则
$depr = C(‘TMPL_FILE_DEPR’);
if(’’ == $file) {
// 如果模板文件名为空 按照默认规则定位
$file = CONTROLLER_NAME . KaTeX parse error: Expected 'EOF', got '}' at position 22: … ACTION_NAME; }̲elseif(false ==…file, ‘/’)){
$file = CONTROLLER_NAME . $depr . $file;
}elseif(’/’ != $depr){
f i l e = s u b s t r c o u n t ( file = substr_count( file=substrcount(file,’/’)>1 ? substr_replace( f i l e , file, file,depr,strrpos($file,’/’),1) : str_replace(’/’, $depr, $file);
}
return b a s e U r l . ( baseUrl.( baseUrl.(theme? t h e m e . ′ / ′ : ′ ′ ) . theme.'/':''). theme.′/′:′′).file.C(‘TMPL_TEMPLATE_SUFFIX’);
}
/**
获取输入参数 支持过滤和默认值
使用方法:
I(‘id’,0); 获取id参数 自动判断get或者post
I(‘post.name’,’’,‘htmlspecialchars’); 获取$_POST[‘name’]
I(‘get.’); 获取$_GET
@param string $name 变量的名称 支持指定类型
@param mixed $default 不存在的时候默认值
@param mixed $filter 参数过滤方法
@param mixed $datas 要获取的额外数据源
@return mixed
*/
function I( n a m e , name, name,default=’’, f i l t e r = n u l l , filter=null, filter=null,datas=null) {
static P U T = n u l l ; i f ( s t r p o s ( _PUT = null; if(strpos( PUT=null;if(strpos(name,’/’)){ // 指定修饰符
list( n a m e , name, name,type) = explode(’/’,$name,2);
}elseif(C(‘VAR_AUTO_STRING’)){ // 默认强制转换为字符串
KaTeX parse error: Expected 'EOF', got '}' at position 18: …pe = 's'; }̲ if(strpos(name,’.’)) { // 指定参数来源
list( m e t h o d , method, method,name) = explode(’.’,$name,2);
}else{ // 默认为自动判断
KaTeX parse error: Expected 'EOF', got '}' at position 22: … = 'param'; }̲ switch(strtol…method)) {
case ‘get’ :
$input =& $_GET;
break;
case ‘post’ :
$input =& P O S T ; b r e a k ; c a s e ′ p u t ′ : i f ( i s n u l l ( _POST; break; case 'put' : if(is_null( POST;break;case′put′:if(isnull(_PUT)){
parse_str(file_get_contents(‘php://input’), $_PUT);
}
$input = P U T ; b r e a k ; c a s e ′ p a r a m ′ : s w i t c h ( _PUT; break; case 'param' : switch( PUT;break;case′param′:switch(_SERVER[‘REQUEST_METHOD’]) {
case ‘POST’:
$input = P O S T ; b r e a k ; c a s e ′ P U T ′ : i f ( i s n u l l ( _POST; break; case 'PUT': if(is_null( POST;break;case′PUT′:if(isnull(_PUT)){
parse_str(file_get_contents(‘php://input’), $_PUT);
}
$input = $_PUT;
break;
default:
$input = $_GET;
}
break;
case ‘path’ :
i n p u t = a r r a y ( ) ; i f ( ! e m p t y ( input = array(); if(!empty( input=array();if(!empty(_SERVER[‘PATH_INFO’])){
$depr = C(‘URL_PATHINFO_DEPR’);
i n p u t = e x p l o d e ( input = explode( input=explode(depr,trim( S E R V E R [ ′ P A T H I N F O ′ ] , _SERVER['PATH_INFO'], SERVER[′PATHINFO′],depr));
}
break;
case ‘request’ :
$input =& $_REQUEST;
break;
case ‘session’ :
$input =& $_SESSION;
break;
case ‘cookie’ :
$input =& $_COOKIE;
break;
case ‘server’ :
$input =& $_SERVER;
break;
case ‘globals’ :
$input =& $GLOBALS;
break;
case ‘data’ :
$input =& KaTeX parse error: Expected 'EOF', got '}' at position 64: … return null; }̲ if(''==name) { // 获取全部变量
$data = $input;
f i l t e r s = i s s e t ( filters = isset( filters=isset(filter)? f i l t e r : C ( ′ D E F A U L T F I L T E R ′ ) ; i f ( filter:C('DEFAULT_FILTER'); if( filter:C(′DEFAULTFILTER′);if(filters) {
if(is_string($filters)){
f i l t e r s = e x p l o d e ( ′ , ′ , filters = explode(',', filters=explode(′,′,filters);
}
foreach($filters as $filter){
d a t a = a r r a y m a p r e c u r s i v e ( data = array_map_recursive( data=arraymaprecursive(filter,KaTeX parse error: Expected 'EOF', got '}' at position 25: … 参数过滤 }̲ } }elsei…input[$name])) { // 取值操作
$data = i n p u t [ input[ input[name];
f i l t e r s = i s s e t ( filters = isset( filters=isset(filter)? f i l t e r : C ( ′ D E F A U L T F I L T E R ′ ) ; i f ( filter:C('DEFAULT_FILTER'); if( filter:C(′DEFAULTFILTER′);if(filters) {
if(is_string(KaTeX parse error: Expected '}', got 'EOF' at end of input: …f(0 === strpos(filters,’/’)){
if(1 !== preg_match( f i l t e r s , ( s t r i n g ) filters,(string) filters,(string)data)){
// 支持正则验证
return isset($default) ? $default : null;
}
}else{
f i l t e r s = e x p l o d e ( ′ , ′ , filters = explode(',', filters=explode(′,′,filters);
}
}elseif(is_int($filters)){
f i l t e r s = a r r a y ( filters = array( filters=array(filters);
}
if(is_array($filters)){
foreach($filters as $filter){
if(function_exists($filter)) {
$data = is_array($data) ? array_map_recursive($filter,$data) : $filter($data); // 参数过滤
}else{
$data = filter_var($data,is_int($filter) ? $filter : filter_id($filter));
if(false === $data) {
return isset($default) ? $default : null;
}
}
}
}
}
if(!empty($type)){
switch(strtolower($type)){
case 'a': // 数组
$data = (array)$data;
break;
case 'd': // 数字
$data = (int)$data;
break;
case 'f': // 浮点
$data = (float)$data;
break;
case 'b': // 布尔
$data = (boolean)$data;
break;
case 's': // 字符串
default:
$data = (string)$data;
}
}
}else{ // 变量默认值
d a t a = i s s e t ( data = isset( data=isset(default)?KaTeX parse error: Expected 'EOF', got '}' at position 16: default:null; }̲ is_array(data) && array_walk_recursive($data,‘think_filter’);
return $data;
}
function array_map_recursive($filter, $data) {
r e s u l t = a r r a y ( ) ; f o r e a c h ( result = array(); foreach ( result=array();foreach(data as $key => $val) {
r e s u l t [ result[ result[key] = is_array( v a l ) ? a r r a y m a p r e c u r s i v e ( val) ? array_map_recursive( val)?arraymaprecursive(filter, v a l ) : c a l l u s e r f u n c ( val) : call_user_func( val):calluserfunc(filter, $val);
}
return $result;
}
/**
/**
/**
/**
/**
/**
/**
/**
/**
/**
/**
/**
实例化多层控制器 格式:[资源://][模块/]控制器
@param string $name 资源地址
@param string $layer 控制层名称
@param integer $level 控制器层次
@return Think\Controller|false
*/
function A( n a m e , name, name,layer=’’,$level=0) {
static $_action = array();
$layer = $layer? : C(‘DEFAULT_C_LAYER’);
$level = l e v e l ? : ( level? : ( level?:(layer == C(‘DEFAULT_C_LAYER’)?C(‘CONTROLLER_LEVEL’):1);
if(isset( a c t i o n [ _action[ action[name.$layer]))
return a c t i o n [ _action[ action[name.$layer];
c l a s s = p a r s e r e s n a m e ( class = parse_res_name( class=parseresname(name, l a y e r , layer, layer,level);
if(class_exists($class)) {
$action = new $class();
a c t i o n [ _action[ action[name.$layer] = $action;
return $action;
}else {
return false;
}
}
/**
/**
/**
/**
/**
/**
’ .
l
a
b
e
l
.
h
t
m
l
s
p
e
c
i
a
l
c
h
a
r
s
(
label . htmlspecialchars(
label.htmlspecialchars(output, ENT_QUOTES) . ‘
’;’ .
l
a
b
e
l
.
h
t
m
l
s
p
e
c
i
a
l
c
h
a
r
s
(
label . htmlspecialchars(
label.htmlspecialchars(output, ENT_QUOTES) . ‘
’;/**
/**
URL组装 支持不同URL模式
@param string $url URL表达式,格式:’[模块/控制器/操作#锚点@域名]?参数1=值1&参数2=值2…’
@param string|array $vars 传入的参数,支持数组和字符串
@param string|boolean $suffix 伪静态后缀,默认为true表示获取配置值
@param boolean $domain 是否显示域名
@return string
*/
function U( u r l = ′ ′ , url='', url=′′,vars=’’, s u f f i x = t r u e , suffix=true, suffix=true,domain=false) {
// 解析URL
i n f o = p a r s e u r l ( info = parse_url( info=parseurl(url);
u r l = ! e m p t y ( url = !empty( url=!empty(info[‘path’])? i n f o [ ′ p a t h ′ ] : A C T I O N N A M E ; i f ( i s s e t ( info['path']:ACTION_NAME; if(isset( info[′path′]:ACTIONNAME;if(isset(info[‘fragment’])) { // 解析锚点
$anchor = i n f o [ ′ f r a g m e n t ′ ] ; i f ( f a l s e ! = = s t r p o s ( info['fragment']; if(false !== strpos( info[′fragment′];if(false!==strpos(anchor,’?’)) { // 解析参数
list( a n c h o r , anchor, anchor,info[‘query’]) = explode(’?’,KaTeX parse error: Expected 'EOF', got '}' at position 17: …nchor,2); }̲ i…anchor,’@’)) { // 解析域名
list( a n c h o r , anchor, anchor,host) = explode(’@’,KaTeX parse error: Expected 'EOF', got '}' at position 18: …chor, 2); }̲ }elseif(false…url,’@’)) { // 解析域名
list( u r l , url, url,host) = explode(’@’,KaTeX parse error: Expected 'EOF', got '}' at position 20: …['path'], 2); }̲ // 解析子域名 if(…host)) {
$domain = h o s t . ( s t r p o s ( host.(strpos( host.(strpos(host,’.’)?’’:strstr(KaTeX parse error: Expected 'EOF', got '}' at position 30: …HOST'],'.')); }̲elseif(domain===true){
$domain = $_SERVER[‘HTTP_HOST’];
if(C(‘APP_SUB_DOMAIN_DEPLOY’) ) { // 开启子域名部署
$domain = d o m a i n = = ′ l o c a l h o s t ′ ? ′ l o c a l h o s t ′ : ′ w w w ′ . s t r s t r ( domain=='localhost'?'localhost':'www'.strstr( domain==′localhost′?′localhost′:′www′.strstr(_SERVER[‘HTTP_HOST’],’.’);
// ‘子域名’=>array(‘模块[/控制器]’);
foreach (C(‘APP_SUB_DOMAIN_RULES’) as $key => $rule) {
r u l e = i s a r r a y ( rule = is_array( rule=isarray(rule)? r u l e [ 0 ] : rule[0]: rule[0]:rule;
if(false === strpos(KaTeX parse error: Expected 'EOF', got '&' at position 10: key,'*') &̲& 0=== strpos(url,$rule)) {
$domain = k e y . s t r s t r ( key.strstr( key.strstr(domain,’.’); // 生成对应子域名
u r l = s u b s t r r e p l a c e ( url = substr_replace( url=substrreplace(url,’’,0,strlen($rule));
break;
}
}
}
}
// 解析参数
if(is_string(KaTeX parse error: Expected '}', got '&' at position 18: …rs)) { // aaa=1&̲bbb=2 转换成数组 …vars,KaTeX parse error: Expected 'EOF', got '}' at position 9: vars); }̲elseif(!is_arra…vars)){
KaTeX parse error: Expected 'EOF', got '}' at position 18: …rs = array(); }̲ if(isset(info[‘query’])) { // 解析地址里面参数 合并到vars
parse_str( i n f o [ ′ q u e r y ′ ] , info['query'], info[′query′],params);
v a r s = a r r a y m e r g e ( vars = array_merge( vars=arraymerge(params,$vars);
}
// URL组装
$depr = C(‘URL_PATHINFO_DEPR’);
u r l C a s e = C ( ′ U R L C A S E I N S E N S I T I V E ′ ) ; i f ( urlCase = C('URL_CASE_INSENSITIVE'); if( urlCase=C(′URLCASEINSENSITIVE′);if(url) {
if(0=== strpos($url,’/’)) {// 定义路由
$route = true;
u r l = s u b s t r ( url = substr( url=substr(url,1);
if(’/’ != $depr) {
u r l = s t r r e p l a c e ( ′ / ′ , url = str_replace('/', url=strreplace(′/′,depr,$url);
}
}else{
if(’/’ != $depr) { // 安全替换
u r l = s t r r e p l a c e ( ′ / ′ , url = str_replace('/', url=strreplace(′/′,depr,$url);
}
// 解析模块、控制器和操作
u r l = t r i m ( url = trim( url=trim(url,$depr);
p a t h = e x p l o d e ( path = explode( path=explode(depr,$url);
$var = array();
$varModule = C(‘VAR_MODULE’);
$varController = C(‘VAR_CONTROLLER’);
$varAction = C(‘VAR_ACTION’);
v a r [ var[ var[varAction] = !empty( p a t h ) ? a r r a y p o p ( path)?array_pop( path)?arraypop(path):ACTION_NAME;
v a r [ var[ var[varController] = !empty( p a t h ) ? a r r a y p o p ( path)?array_pop( path)?arraypop(path):CONTROLLER_NAME;
if(KaTeX parse error: Expected '}', got 'EOF' at end of input: … if(isset(maps[strtolower( v a r [ var[ var[varController])])) {
$maps = m a p s [ s t r t o l o w e r ( maps[strtolower( maps[strtolower(var[ v a r C o n t r o l l e r ] ) ] ; i f ( varController])]; if( varController])];if(action = array_search(strtolower( v a r [ var[ var[varAction]),$maps)){
v a r [ var[ var[varAction] = KaTeX parse error: Expected 'EOF', got '}' at position 26: … }̲ }…maps = C(‘URL_CONTROLLER_MAP’)) {
if( c o n t r o l l e r = a r r a y s e a r c h ( s t r t o l o w e r ( controller = array_search(strtolower( controller=arraysearch(strtolower(var[ v a r C o n t r o l l e r ] ) , varController]), varController]),maps)){
v a r [ var[ var[varController] = KaTeX parse error: Expected 'EOF', got '}' at position 26: …; }̲ } …urlCase) {
v a r [ var[ var[varController] = parse_name( v a r [ var[ var[varController]);
}
$module = ‘’;
if(!empty($path)) {
$var[$varModule] = implode($depr,$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];
unset($var[$varModule]);
}
}
}
if(C(‘URL_MODEL’) == 0) { // 普通模式URL转换
KaTeX parse error: Expected group after '_' at position 16: url = _̲_APP__.'?'.C('V…module}&".http_build_query(array_reverse( v a r ) ) ; i f ( var)); if( var));if(urlCase){
u r l = s t r t o l o w e r ( url = strtolower( url=strtolower(url);
}
if(!empty($vars)) {
v a r s = h t t p b u i l d q u e r y ( vars = http_build_query( vars=httpbuildquery(vars);
KaTeX parse error: Expected 'EOF', got '&' at position 13: url .= '&̲'.vars;
}
}else{ // PATHINFO模式或者兼容URL模式
if(isset($route)) {
KaTeX parse error: Expected group after '_' at position 12: url = _̲_APP__.'/'.rtri…url,$depr);
}else{
KaTeX parse error: Expected 'EOF', got '&' at position 36: …'BIND_MODULE') &̲& BIND_MODULE==module )? ‘’ : $module;
KaTeX parse error: Expected group after '_' at position 12: url = _̲_APP__.'/'.(module? m o d u l e . M O D U L E P A T H I N F O D E P R : ′ ′ ) . i m p l o d e ( module.MODULE_PATHINFO_DEPR:'').implode( module.MODULEPATHINFODEPR:′′).implode(depr,array_reverse(KaTeX parse error: Expected 'EOF', got '}' at position 13: var)); }̲ if(urlCase){
u r l = s t r t o l o w e r ( url = strtolower( url=strtolower(url);
}
if(!empty(KaTeX parse error: Expected '}', got 'EOF' at end of input: … foreach (vars as $var => KaTeX parse error: Expected '}', got 'EOF' at end of input: …if('' !== trim(val)) $url .= $depr . $var . d e p r . u r l e n c o d e ( depr . urlencode( depr.urlencode(val);
}
}
if($suffix) {
$suffix = s u f f i x = = = t r u e ? C ( ′ U R L H T M L S U F F I X ′ ) : suffix===true?C('URL_HTML_SUFFIX'): suffix===true?C(′URLHTMLSUFFIX′):suffix;
if( p o s = s t r p o s ( pos = strpos( pos=strpos(suffix, ‘|’)){
s u f f i x = s u b s t r ( suffix = substr( suffix=substr(suffix, 0, KaTeX parse error: Expected 'EOF', got '}' at position 16: pos); }̲ if(suffix && ‘/’ != substr($url,-1)){
u r l . = ′ . ′ . l t r i m ( url .= '.'.ltrim( url.=′.′.ltrim(suffix,’.’);
}
}
}
if(isset($anchor)){
KaTeX parse error: Expected 'EOF', got '#' at position 10: url .= '#̲'.anchor;
}
if($domain) {
u r l = ( i s s s l ( ) ? ′ h t t p s : / / ′ : ′ h t t p : / / ′ ) . url = (is_ssl()?'https://':'http://'). url=(isssl()?′https://′:′http://′).domain.$url;
}
return $url;
}
/**
/**
/**
/**
/**
/**
/**
/**
/**
/**
/**
/**
/**
function think_filter(&$value){
// TODO 其他安全过滤
// 过滤查询特殊字符
if(preg_match('/^(EXP|NEQ|GT|EGT|LT|ELT|OR|XOR|LIKE|NOTLIKE|NOT BETWEEN|NOTBETWEEN|BETWEEN|NOTIN|NOT IN|IN)$/i',$value)){
$value .= ' ';
}
}
// 不区分大小写的in_array实现
function in_array_case( v a l u e , value, value,array){
return in_array(strtolower( v a l u e ) , a r r a y m a p ( ′ s t r t o l o w e r ′ , value),array_map('strtolower', value),arraymap(′strtolower′,array));
}