zoukankan      html  css  js  c++  java
  • PHP的常用的公共函数_方维购物分享系统的内置函数

       1 <?php
       2 // +----------------------------------------------------------------------
       3 // | 方维购物分享网站系统 (Build on ThinkPHP)
       4 // +----------------------------------------------------------------------
       5 // | Copyright (c) 2011 http://fanwe.com All rights reserved.
       6 // +----------------------------------------------------------------------
       7 
       8 /**
       9  * global.func
      10  *
      11  * 公共函数
      12  *
      13  * @package function
      14  * @author awfigq <awfigq@qq.com>
      15  */
      16 function getPhpSelf()
      17 {
      18     $php_self = '';
      19     $script_name = basename($_SERVER['SCRIPT_FILENAME']);
      20     if(basename($_SERVER['SCRIPT_NAME']) === $script_name)
      21         $php_self = $_SERVER['SCRIPT_NAME'];
      22     else if(basename($_SERVER['PHP_SELF']) === $script_name)
      23         $php_self = $_SERVER['PHP_SELF'];
      24     else if(isset($_SERVER['ORIG_SCRIPT_NAME']) && basename($_SERVER['ORIG_SCRIPT_NAME']) === $script_name)
      25         $php_self = $_SERVER['ORIG_SCRIPT_NAME'];
      26     else if(($pos = strpos($_SERVER['PHP_SELF'],'/'.$script_name)) !== false)
      27         $php_self = substr($_SERVER['SCRIPT_NAME'],0,$pos).'/'.$script_name;
      28     else if(isset($_SERVER['DOCUMENT_ROOT']) && strpos($_SERVER['SCRIPT_FILENAME'],$_SERVER['DOCUMENT_ROOT']) === 0)
      29         $php_self = str_replace('\\','/',str_replace($_SERVER['DOCUMENT_ROOT'],'',$_SERVER['SCRIPT_FILENAME']));
      30     else
      31         return false;
      32     return $php_self;
      33 }
      34 
      35 /**
      36  * 获取引用文件路径
      37  * @param string $file_name 文件名称
      38  * @param string $folder 所在目录(默认为空)
      39  * @return string
      40  */
      41 function fimport($file_name, $folder = '')
      42 {
      43     global $_FANWE;
      44     static $sufix = array(
      45         'module'=>'.module',
      46         'service'=>'.service',
      47         'class'=>'.class',
      48         'function' => '.func',
      49         'include' => '.inc',
      50         'language' => '.lang',
      51         'cache' => '.cache',
      52         'dynamic'=>'.dynamic',
      53     );
      54 
      55     $file_name = strtolower($file_name);
      56     $file_path = FANWE_ROOT.'./core';
      57     if(strstr($file_name, '/'))
      58     {
      59         list($pre, $name) = explode('/', $file_name);
      60 
      61         $insert = '';
      62         if($pre == 'language')
      63             $insert = $_FANWE['config']['default_lang'].'/';
      64 
      65         return "{$file_path}/{$pre}/".$insert.(empty($folder) ? "" : $folder . "/")."{$name}".$sufix[$pre].".php";
      66     }
      67     else
      68     {
      69         return "{$file_path}/".(empty($folder) ? "" : $folder . "/")."{$file_name}.php";
      70     }
      71 }
      72 
      73 /**
      74  * 获取页面显示操作类
      75  * @param string $module 类名
      76  * @return object
      77  */
      78 function FM($module)
      79 {
      80     static $modules = array();
      81     if($modules[$module] === NULL)
      82     {
      83         require fimport("module/".strtolower($module));
      84         $m = ucfirst($module)."Module";
      85         $modules[$module] = new $m();
      86         unset($m);
      87     }
      88     return $modules[$module];
      89 }
      90 
      91 /**
      92  * 获取服务类
      93  * @param string $service 类名
      94  * @return object
      95  */
      96 function FS($service)
      97 {
      98     static $services = array();
      99     if($services[$service] === NULL)
     100     {
     101         require_once fimport("service/".strtolower($service));
     102         $s = ucfirst($service)."Service";
     103         $services[$service] = new $s();
     104         unset($s);
     105     }
     106 
     107     return $services[$service];
     108 }
     109 
     110 /**
     111  * 页面路径处理
     112  * @param string $type 页面
     113  * @param array $args 参数
     114  * @return string
     115  */
     116 function FU($type,$args = array(),$is_full = false)
     117 {
     118     global $_FANWE;
     119     static $is_rewrite = NULL,$site_url = NULL,$url_lists = array(),$url_flists = array(),$seo_modules = NULL;
     120     
     121     if ($is_rewrite === NULL)
     122         $is_rewrite = intval($_FANWE['setting']['url_model']);
     123 
     124     if ($site_url === NULL)
     125         $site_url = $_FANWE['site_root'];
     126         
     127     if ($seo_modules === NULL)
     128     {
     129         if(!isset($_FANWE['cache']['seos']))
     130             Cache::getInstance()->loadCache('seos');
     131             
     132         $seo_modules = $_FANWE['cache']['seos'];
     133     }
     134     
     135     $depr = '/';
     136 
     137     $url = $site_url;
     138     if($is_full)
     139     {
     140         $url = $_FANWE['site_url'];
     141         $site_url = $_FANWE['site_url'];
     142     }
     143 
     144     $apps = explode('/',$type);
     145     $module = $apps[0];
     146     $action = isset($apps[1]) ? $apps[1] : 'index';
     147     $type = $module.'/'.$action;
     148 
     149     $url_key = $type.'_'.md5(http_build_query($args));
     150     if($is_full)
     151     {
     152         if(isset($url_flists[$url_key]))
     153             return $url_flists[$url_key];
     154     }
     155     else
     156     {
     157         if(isset($url_lists[$url_key]))
     158             return $url_lists[$url_key];
     159     }
     160     
     161     $query = '';
     162     if($is_rewrite == 0 || $module == 'search')
     163     {
     164         $query = http_build_query($args);
     165         if(!empty($query))
     166             $query = '&'.$query;
     167     }
     168     
     169     $is_url_app = true;
     170     if($is_rewrite == 0 || $module == 'search')
     171     {
     172         $url .= $module.'.php?action='.$action.$query;
     173     }
     174     else
     175     {
     176         $params = array();
     177         switch($module)
     178         {
     179             case 'index':
     180                 $is_url_app = false;
     181                 $url = $site_url;
     182             break;
     183             
     184             case 'book':
     185                 $params = array('cate' => '','gid' => '','sid' => '','price'=>'','color'=>'','sort'=>'','tag' => '','page' => 0);
     186                 $search = array('cate/','gid/','sid/','price/','color/','sort/','tag/','page/');
     187                 $replace = array('','g','s','p','c','','','');
     188                 if($action == 'shopping')
     189                     $action = $seo_modules[$module][$action]['action'];
     190                 
     191                 $module = $seo_modules[$module]['module'];
     192             break;
     193             
     194             case 'note':
     195                 $is_url_app = false;
     196                 $module = $seo_modules[$module]['module'];
     197                 if($action == 'index')
     198                     $url = $site_url.$module.$depr.$args['sid'];
     199                 else
     200                     $url = $site_url.$module.$depr.$args['sid'].$depr.$action.$depr.$args['id'];
     201 
     202                 if(isset($args['page']) && $args['page'] != '0')
     203                     $url.= $depr.$args['page'];
     204             break;
     205             
     206             case 'album':
     207                 switch($action)
     208                 {
     209                     case 'index':
     210                         $params = array('sort'=>'','page' => 0);
     211                         $search = array('/index','sort/','page/');
     212                         $replace = array('','','');
     213                     break;
     214                     
     215                     case 'category':
     216                         $action = $seo_modules[$module][$action]['action'];
     217                         $params = array('id'=>0,'sort'=>'','page' => 0);
     218                         $search = array('id/','sort/','page/');
     219                         $replace = array('c','','');
     220                     break;
     221                     
     222                     case 'show':
     223                         $action = $seo_modules[$module][$action]['action'];
     224                         $args['aid'] = $args['id'];
     225                         unset($args['id']);
     226                         $params = array('aid'=>0,'sid'=>0,'type' => 0,'page' => 0);
     227                         $search = array('aid/','sid/','type/','page/');
     228                         $replace = array('a','s','t','');
     229                     break;
     230         
     231                     case 'edit':
     232                         $params = array('id'=>0);
     233                         $search = array('id/');
     234                         $replace = array('');
     235                     break;    
     236                 }
     237                 $module = $seo_modules[$module]['module'];
     238             break;
     239             
     240             case 'look':
     241             case 'dapei':
     242                 $params = array('type' => '','sort' => '','page' => 0);
     243                 $search = array('/index','/type','/sort','/page');
     244                 $replace = array('','','','');
     245                 $module = $seo_modules[$module]['module'];
     246             break;
     247             
     248             case 'group':
     249                 switch($action)
     250                 {
     251                     case 'index':
     252                         $search = array('/index');
     253                         $replace = array('');
     254                     break;
     255                     
     256                     case 'detail':
     257                         $params = array('type' => '','fid' => 0,'sort' => '','page' => 0);
     258                         $search = array('detail/','type/','fid/','sort/','page/');
     259                         $replace = array('','','','','');
     260                     break;
     261         
     262                     case 'users':
     263                     case 'apply':
     264                         $params = array('fid' => 0,'page' => 0);
     265                         $search = array('fid/','page/');
     266                         $replace = array('','');
     267                     break;
     268                     
     269                     case "edit":
     270                         $params = array('fid' => 0);
     271                         $search = array('fid/');
     272                         $replace = array('');
     273                     break;
     274                 }
     275                 $module = $seo_modules[$module]['module'];
     276             break;
     277             
     278             case 'daren':
     279                 switch($action)
     280                 {
     281                     case 'index':
     282                         $search = array('/index');
     283                         $replace = array('');
     284                     break;
     285                     
     286                     case 'cate':
     287                         $params = array('id' => 0,'page' => 0);
     288                         $search = array('cate/','id/','page/');
     289                         $replace = array('','','');
     290                     break;
     291                 }
     292                 $module = $seo_modules[$module]['module'];
     293             break;
     294             
     295             case 'shop':
     296                 switch($action)
     297                 {
     298                     case 'index':
     299                         if(empty($args['cid']))
     300                         {
     301                             unset($args['cid']);
     302                             $search = array('/index','/page');
     303                             $replace = array('','');
     304                         }
     305                         else
     306                         {
     307                             $params = array('cid' => 0,'page' => 0);
     308                             $search = array('index/','cid/','page/');
     309                             $replace = array('','c','');
     310                         }
     311                     break;
     312                     
     313                     case 'show':
     314                         $params = array('id' => 0,'page' => 0);
     315                         $search = array('id/','page/');
     316                         $replace = array('s','');
     317                         $action = $seo_modules[$module][$action]['action'];
     318                     break;
     319                 }
     320                 $module = $seo_modules[$module]['module'];
     321                 
     322             break;
     323 
     324             
     325             case 'topic':
     326                 switch($action)
     327                 {
     328                     case 'detail':
     329                         $params = array('tid' => 0,'page' => 0);
     330                         $search = array('tid/','page/');
     331                         $replace = array('','');
     332                         $action = $seo_modules[$module][$action]['action'];
     333                     break;
     334                     
     335                     case 'create':
     336                         $params = array('fid' => 0);
     337                         $search = array('fid/');
     338                         $replace = array('');
     339                     break;
     340                     
     341                     case 'edit':
     342                         $params = array('tid' => 0);
     343                         $search = array('tid/');
     344                         $replace = array('');
     345                     break;
     346                 }
     347                 $module = $seo_modules[$module]['module'];
     348             break;
     349 
     350             case 'activity':
     351                 switch($action)
     352                 {
     353                     case 'detail':
     354                         $params = array('id' => 0,'page' => 0);
     355                         $search = array('id/','page/');
     356                         $replace = array('','');
     357                     break;
     358                     
     359                     case 'edit':
     360                         $params = array('id' => 0);
     361                         $search = array('id/');
     362                         $replace = array('');
     363                     break;
     364                     
     365                     case 'manage':
     366                         $params = array('id' => 0);
     367                         $search = array('id/');
     368                         $replace = array('');
     369                     break;
     370                 }
     371             break;
     372 
     373             case 'vote':
     374                 switch($action)
     375                 {
     376                     case 'detail':
     377                         $params = array('id' => 0,'page' => 0);
     378                         $search = array('id/','page/');
     379                         $replace = array('','');
     380                     break;
     381                     
     382                     case 'edit':
     383                         $params = array('id' => 0);
     384                         $search = array('id/');
     385                         $replace = array('');
     386                     break;
     387                 }
     388             break;
     389             
     390             case 'exchange':
     391                 switch($action)
     392                 {
     393                     case 'index':
     394                         $search = array('/index','/page');
     395                         $replace = array('','');
     396                     break;
     397                     
     398                     case 'info':
     399                         $params = array('id' => 0,'page' => 0);
     400                         $search = array('id/','page/');
     401                         $replace = array('','');
     402                         $action = $seo_modules[$module][$action]['action'];
     403                     break;
     404                 }
     405                 $module = $seo_modules[$module]['module'];
     406                 
     407             break;
     408 
     409             case 'mailrss':
     410                 switch($action)
     411                 {
     412                     case 'index':
     413                         $search = array('/index',);
     414                         $replace = array('','');
     415                     break;
     416                     
     417                     case 'show':
     418                         $params = array('id' => 0);
     419                         $search = array('id/');
     420                         $replace = array('');
     421                     break;
     422                 }
     423             break;
     424             
     425             case 'u':
     426                 $is_url_app = false;
     427                                 
     428                 if(!isset($args['uid']))
     429                     $args['uid'] = $_FANWE['uid'];
     430 
     431                 if($action == 'all')
     432                     $url = $site_url.$module.$depr.$action;
     433                 elseif($action == 'msgview')
     434                                 {
     435                                     $url = $site_url.$module.$depr.$action;
     436                                     if($args['lid'] > 0)
     437                                         $url .= $depr.'lid'.$depr.$args['lid'];
     438                                     
     439                                     if($args['mid'] > 0)
     440                                         $url .= $depr.'mid'.$depr.$args['mid'];
     441                                      
     442                                     if($args['page'] != '' || $args['page'] > 0 )
     443                                         $url .= $depr.$args['page'];
     444                 }
     445                 else
     446                 {
     447                     if($action == 'index')
     448                     {
     449                         if($args['uid'] == $_FANWE['uid'])
     450                             $url = $site_url.'me';
     451                         else
     452                             $url = $site_url.$module.$depr.$args['uid'];
     453                     }
     454                     elseif($action == 'me')
     455                         $url = $site_url.$module.'/me';
     456                     else
     457                         $url = $site_url.$module.$depr.$args['uid'].$depr.$action;
     458                     
     459                     if($action == 'album')
     460                     {
     461                         if(isset($args['type']) && $args['type'] != '')
     462                         {
     463                             $url.= $depr.'t'.$args['type'];
     464                         }
     465                     }
     466                     elseif($action == 'exchange')
     467                     {
     468                         if(isset($args['status']) && $args['status'] != '')
     469                             $url.= $depr.'s'.$args['status'];
     470                     }
     471                     elseif($action == 'commission')
     472                     {
     473                         if(isset($args['type']) && $args['type'] != '')
     474                             $url.= $depr.'t'.$args['type'];
     475                     }
     476                     elseif($action == 'group')
     477                     {
     478                         if(isset($args['sort']) && $args['sort'] != '')
     479                             $url.= $depr.'s'.$args['sort'];
     480                     }
     481                     else
     482                     {
     483                         if(isset($args['type']) && $args['type'] != '')
     484                             $url.= $depr.$args['type'];
     485     
     486                         if(isset($args['sort']) && $args['sort'] != '')
     487                             $url.= $depr.$args['sort'];
     488                     }
     489                     
     490                     if(isset($args['page']) && $args['page'] != '0')
     491                         $url.= $depr.$args['page'];
     492                 }
     493             break;
     494             
     495             default:
     496                 switch($type)
     497                 {
     498                     case 'event/index':
     499                     case 'invite/index':
     500                         $search = array('/index');
     501                         $replace = array('');
     502                     break;
     503                     
     504                     case 'link/index':
     505                         $module = "links";
     506                         $search = array('/index');
     507                         $replace = array('');
     508                     break;
     509         
     510                     case 'event/detail':
     511                         $params = array('detail'=>'','id'=>'','page' => 0);
     512                         $search = array('/detail','/id','/page');
     513                         $replace = array('','','');
     514                     break;
     515                     
     516                     case 'event/list':
     517                         $params = array('type'=>'','order'=>'','page' => 0);
     518                         $search = array('/type','/order','/page');
     519                         $replace = array('','','');
     520                     break;
     521         
     522                     case 'adv/show':
     523                         $params = array('id'=>'');
     524                         $search = array('/show','/id');
     525                         $replace = array('','');
     526                     break;
     527                 }
     528             break;
     529         }
     530         
     531         if(!empty($params))
     532             $args = array_merge($params, $args);
     533 
     534         foreach($args as $var=>$val)
     535         {
     536             if($var == 'page' && $val == '0')
     537                 $val = '';
     538 
     539             if($val !== '')
     540                 $query .= $depr.$var.$depr.$val;
     541         }
     542         
     543         if($is_url_app)
     544             $url .= $module.(empty($action) ? '' : $depr.$action).$query;
     545         
     546         if(!empty($search))
     547             $url = str_replace($search,$replace,$url);
     548     }
     549 
     550     if($type == 'tgo/index')
     551     {
     552         $url = $site_url.'tgo.php?url='.base64_encode($args['url']);
     553         $tk = array();
     554         if(isset($args['uid']) && (int)$args['uid'] > 0)
     555             $tk['uid'] = (int)$args['uid']; 
     556 
     557         if(isset($args['sid']) && (int)$args['sid'] > 0)
     558             $tk['sid'] = (int)$args['sid']; 
     559 
     560         if(isset($args['gid']) && (int)$args['gid'] > 0)
     561             $tk['gid'] = (int)$args['gid'];
     562 
     563         if(isset($args['kid']))
     564             $tk['kid'] = $args['kid'];
     565 
     566         if(count($tk) > 0)
     567             $url .= '&args='.base64_encode(serialize($tk));
     568     }
     569     
     570     if($is_full)
     571         $url_flists[$url_key] = $url;
     572     else
     573         $url_lists[$url_key] = $url;
     574     return $url;
     575 }
     576 
     577 /**
     578  * 页面重写参数处理
     579  * @param array $keys 键值对
     580  * @return void
     581  */
     582 function getRewriteArgs($keys)
     583 {
     584     global $_FANWE;
     585     $args = trim($_FANWE['request']['args']);
     586     foreach($keys as $key)
     587     {
     588         preg_match("/$key-(.+?)(?:$|-)/is",$args,$value);
     589         if(count($value) > 1)
     590         {
     591             $_FANWE['request'][$key] = $value[1];
     592             if($key == 'page')
     593                 $_FANWE['page'] = $value[1];
     594         }
     595     }
     596     unset($_FANWE['request']['args']);
     597 }
     598 
     599 /**
     600  * 分页处理
     601  * @param string $type 所在页面
     602  * @param array  $args 参数
     603  * @param int $total_count 总数
     604  * @param int $page 当前页
     605  * @param int $page_size 分页大小
     606  * @param string $url 自定义路径
     607  * @param int $offset 偏移量
     608  * @return array
     609  */
     610 function buildPage($type,$args,$total_count,$page = 1,$page_size = 0,$url='',$offset = 5)
     611 {
     612     global $_FANWE;
     613 
     614     $pager['total_count'] = intval($total_count);
     615     $pager['page'] = $page;
     616     $pager['page_size'] = ($page_size == 0) ? ($_FANWE['setting']['page_listrows'] > 0 ? $_FANWE['setting']['page_listrows'] : 20) : $page_size;
     617     /* page 总数 */
     618     $pager['page_count'] = ($pager['total_count'] > 0) ? ceil($pager['total_count'] / $pager['page_size']) : 1;
     619 
     620     /* 边界处理 */
     621     if ($pager['page'] > $pager['page_count'])
     622         $pager['page'] = $pager['page_count'];
     623 
     624     $pager['limit'] = ($pager['page'] - 1) * $pager['page_size'] . "," . $pager['page_size'];
     625 
     626     $page_prev  = ($pager['page'] > 1) ? $pager['page'] - 1 : 1;
     627     $page_next  = ($pager['page'] < $pager['page_count']) ? $pager['page'] + 1 : $pager['page_count'];
     628     $pager['prev_page'] = $page_prev;
     629     $pager['next_page'] = $page_next;
     630 
     631     if (!empty($url))
     632     {
     633         $pager['page_first'] = $url . 1;
     634         $pager['page_prev']  = $url . $page_prev;
     635         $pager['page_next']  = $url . $page_next;
     636         $pager['page_last']  = $url . $pager['page_count'];
     637     }
     638     else
     639     {
     640         $args['page'] = '_page_';
     641         if(!empty($type))
     642             $page_url = FU($type,$args);
     643         else
     644             $page_url = 'javascript:;';
     645 
     646         $pager['page_first'] = str_replace('_page_',1,$page_url);
     647         $pager['page_prev']  = str_replace('_page_',$page_prev,$page_url);
     648         $pager['page_next']  = str_replace('_page_',$page_next,$page_url);
     649         $pager['page_last']  = str_replace('_page_',$pager['page_count'],$page_url);
     650     }
     651 
     652     $pager['page_nums'] = array();
     653 
     654     if($pager['page_count'] <= $offset * 2)
     655     {
     656         for ($i=1; $i <= $pager['page_count']; $i++)
     657         {
     658             $pager['page_nums'][] = array('name' => $i,'url' => empty($url) ? str_replace('_page_',$i,$page_url) : $url . $i);
     659         }
     660     }
     661     else
     662     {
     663         if($pager['page'] - $offset < 2)
     664         {
     665             $temp = $offset * 2;
     666 
     667             for ($i=1; $i<=$temp; $i++)
     668             {
     669                 $pager['page_nums'][] = array('name' => $i,'url' => empty($url) ? str_replace('_page_',$i,$page_url) : $url . $i);
     670             }
     671 
     672             $pager['page_nums'][] = array('name'=>'...');
     673             $pager['page_nums'][] = array('name' => $pager['page_count'],'url' => empty($url) ? str_replace('_page_',$pager['page_count'],$page_url) : $url . $pager['page_count']);
     674         }
     675         else
     676         {
     677             $pager['page_nums'][] = array('name' => 1,'url' => empty($url) ? str_replace('_page_',1,$page_url) : $url . 1);
     678             $pager['page_nums'][] = array('name'=>'...');
     679             $start = $pager['page'] - $offset + 1;
     680             $end = $pager['page'] + $offset - 1;
     681 
     682             if($pager['page_count'] - $end > 1)
     683             {
     684                 for ($i=$start;$i<=$end;$i++)
     685                 {
     686                     $pager['page_nums'][] = array('name' => $i,'url' => empty($url) ? str_replace('_page_',$i,$page_url) : $url . $i);
     687                 }
     688 
     689                 $pager['page_nums'][] = array('name'=>'...');
     690                 $pager['page_nums'][] = array('name' => $pager['page_count'],'url' => empty($url) ? str_replace('_page_',$pager['page_count'],$page_url) : $url . $pager['page_count']);
     691             }
     692             else
     693             {
     694                 $start = $pager['page_count'] - $offset * 2 + 1;
     695                 $end = $pager['page_count'];
     696                 for ($i=$start;$i<=$end;$i++)
     697                 {
     698                     $pager['page_nums'][] = array('name' => $i,'url' => empty($url) ? str_replace('_page_',$i,$page_url) : $url . $i);
     699                 }
     700             }
     701         }
     702     }
     703 
     704     return $pager;
     705 }
     706 
     707 /**
     708  * 分页处理
     709  * @param int $total_count 总数
     710  * @param int $page 当前页
     711  * @param int $page_size 分页大小
     712  * @return array
     713  */
     714 function buildPageMini($total_count,$page = 1,$page_size = 0)
     715 {
     716     $pager['total_count'] = intval($total_count);
     717     $pager['page'] = $page;
     718     $pager['page_size'] = ($page_size == 0) ? ($_FANWE['setting']['page_listrows'] > 0 ? $_FANWE['setting']['page_listrows'] : 20) : $page_size;
     719     /* page 总数 */
     720     $pager['page_count'] = ($pager['total_count'] > 0) ? ceil($pager['total_count'] / $pager['page_size']) : 1;
     721 
     722     /* 边界处理 */
     723     if ($pager['page'] > $pager['page_count'])
     724         $pager['page'] = $pager['page_count'];
     725 
     726     $pager['limit'] = ($pager['page'] - 1) * $pager['page_size'] . "," . $pager['page_size'];
     727 
     728     $page_prev  = ($pager['page'] > 1) ? $pager['page'] - 1 : 1;
     729     $page_next  = ($pager['page'] < $pager['page_count']) ? $pager['page'] + 1 : $pager['page_count'];
     730     $pager['prev_page'] = $page_prev;
     731     $pager['next_page'] = $page_next;
     732     return $pager;
     733 }
     734 
     735 /**
     736  * 用于检测当前用户IP的可操作性,time_span为验证的时间间隔 秒
     737  *
     738  * @param string $ip_str  IP地址
     739  * @param string $module  操作的模块     *
     740  * @param integer $time_span 间隔
     741  * @param integer $id   操作的数据
     742  *
     743  * @return boolean
     744  */
     745 function checkIpOperation($module,$time_span = 0,$id = 0)
     746 {
     747     global $_FANWE;
     748     @session_start();
     749     $key = $_FANWE['client_ip'].'_'.$_FANWE['uid'].'_check_'.$module.($id > 0 ? '_'.$id : '');
     750 
     751     if(!isset($_SESSION[$key]))
     752     {
     753         $_SESSION[$key] = TIME_UTC;
     754         return true;
     755     }
     756     else
     757     {
     758         $time = (int)$_SESSION[$key];
     759         if(TIME_UTC - $time < $time_span)
     760         {
     761             return false;
     762         }
     763         else
     764         {
     765             $_SESSION[$key] = TIME_UTC;
     766             return true;
     767         }
     768     }
     769 }
     770 
     771 /**
     772  * 字符串截断处理
     773  * @param string $string 要处理的字符串
     774  * @param int  $length 指定长度
     775  * @param string $dot 超出指定长度时显示
     776  * @return array
     777  */
     778 function cutStr($string, $length, $dot = '...')
     779 {
     780     if(getStrLen($string) <= $length)
     781         return $string;
     782 
     783     $pre = '{%';
     784     $end = '%}';
     785     $string = str_replace(array('&amp;', '&quot;', '&lt;', '&gt;'), array($pre.'&'.$end, $pre.'"'.$end, $pre.'<'.$end, $pre.'>'.$end), $string);
     786 
     787     $strcut = '';
     788     if(strtolower(CHARSET) == 'utf-8')
     789     {
     790         $n = $tn = $noc = 0;
     791         while($n < strlen($string))
     792         {
     793             $t = ord($string[$n]);
     794             if($t == 9 || $t == 10 || (32 <= $t && $t <= 126))
     795             {
     796                 $tn = 1; $n++; $noc++;
     797             }
     798             elseif(194 <= $t && $t <= 223)
     799             {
     800                 $tn = 2; $n += 2; $noc += 2;
     801             }
     802             elseif(224 <= $t && $t <= 239)
     803             {
     804                 $tn = 3; $n += 3; $noc += 2;
     805             }
     806             elseif(240 <= $t && $t <= 247)
     807             {
     808                 $tn = 4; $n += 4; $noc += 2;
     809             }
     810             elseif(248 <= $t && $t <= 251)
     811             {
     812                 $tn = 5; $n += 5; $noc += 2;
     813             }
     814             elseif($t == 252 || $t == 253)
     815             {
     816                 $tn = 6; $n += 6; $noc += 2;
     817             }
     818             else
     819             {
     820                 $n++;
     821             }
     822 
     823             if($noc >= $length)
     824                 break;
     825         }
     826 
     827         if($noc > $length)
     828             $n -= $tn;
     829 
     830         $strcut = substr($string,0,$n);
     831     }
     832     else
     833     {
     834         for($i = 0; $i < $length; $i++)
     835         {
     836             $strcut .= ord($string[$i]) > 127 ? $string[$i].$string[++$i] : $string[$i];
     837         }
     838     }
     839 
     840     $strcut = str_replace(array($pre.'&'.$end, $pre.'"'.$end, $pre.'<'.$end, $pre.'>'.$end), array('&amp;', '&quot;', '&lt;', '&gt;'), $strcut);
     841 
     842     return $strcut.$dot;
     843 }
     844 
     845 /**
     846  * 获取字符串长度
     847  * @param string $str 要获取长度的字符串
     848  * @return int
     849  */
     850 function getStrLen($str)
     851 {
     852     $length = strlen(preg_replace('/[\x00-\x7F]/', '', $str));
     853 
     854     if ($length)
     855     {
     856         return strlen($str) - $length + intval($length / 3) * 2;
     857     }
     858     else
     859     {
     860         return strlen($str);
     861     }
     862 }
     863 
     864 /**
     865  * 获取字节数
     866  * @param string $val 要获取字节数的字符串
     867  * @return int
     868  */
     869 function getBytes($val)
     870 {
     871     $val = trim($val);
     872     $last = strtolower($val{strlen($val)-1});
     873     switch($last)
     874     {
     875         case 'g': $val *= 1024;
     876         case 'm': $val *= 1024;
     877         case 'k': $val *= 1024;
     878     }
     879 
     880     return $val;
     881 }
     882 
     883 /**
     884  * 错误处理
     885  * @param string $message 错误信息
     886  * @param bool $show 是否显示
     887  * @param bool $save 是否保存
     888  * @param bool $halt 是否停止
     889  * @return void
     890  */
     891 function systemError($message, $show = true, $save = true, $halt = true)
     892 {
     893     require_once fimport('class/error');
     894     FanweError::systemError($message, $show, $save, $halt);
     895 }
     896 
     897 /**
     898  * 显示成功信息
     899  * @param string $title 标题
     900  * @param string $message 成功信息
     901  * @param string $jump_url 跳转地址
     902  * @param int $wait 等待时间
     903  * @return void
     904  */
     905 function showSuccess($title, $message,$jump_url,$wait = 3)
     906 {
     907     global $_FANWE;
     908     include template('page/success');
     909     display();
     910     exit;
     911 }
     912 
     913 /**
     914  * 显示错误信息
     915  * @param string $title 标题
     916  * @param string $message 错误信息
     917  * @param string $jump_url 跳转地址
     918  * @param int $wait 等待时间
     919  * @param bool $is_close 是否显示网站关闭
     920  * @return void
     921  */
     922 function showError($title, $message,$jump_url,$wait = 3,$is_close = false)
     923 {
     924     global $_FANWE;
     925 
     926     if($is_close)
     927         include template('page/close');
     928     else
     929         include template('page/error');
     930 
     931     display();
     932     exit;
     933 }
     934 
     935 /**
     936  * 查询字符串是否存在
     937  * @param string $string
     938  * @param string $find
     939  * @return bool
     940  */
     941 function strExists($string, $find)
     942 {
     943     return !(strpos($string, $find) === FALSE);
     944 }
     945 
     946 /**
     947  * 获取是否为搜索引擎爬虫
     948  * @param string $userAgent 用户信息
     949  * @return bool
     950  */
     951 function checkRobot($userAgent = '')
     952 {
     953     static $kwSpiders = 'Bot|Crawl|Spider|slurp|sohu-search|lycos|robozilla';
     954     static $kwBrowsers = 'MSIE|Netscape|Opera|Konqueror|Mozilla';
     955 
     956     $userAgent = empty($userAgent) ? $_SERVER['HTTP_USER_AGENT'] : $userAgent;
     957 
     958     if(!strExists($userAgent, 'http://') && preg_match("/($kwBrowsers)/i", $userAgent))
     959         return false;
     960     elseif(preg_match("/($kwSpiders)/i", $userAgent))
     961         return true;
     962     else
     963         return false;
     964 }
     965 
     966 /**
     967  * 获取链接格式是否正确
     968  * @param string $url 链接
     969  * @return bool
     970  */
     971 function parseUrl($url)
     972 {
     973     $parse_url = parse_url($url);
     974     return (!empty($parse_url['scheme']) && !empty($parse_url['host']));
     975 }
     976 
     977 
     978 /**
     979  * 获取客户端IP
     980  * @return string
     981  */
     982 function getFClientIp()
     983 {
     984     $ip = $_SERVER['REMOTE_ADDR'];
     985     if (isset($_SERVER['HTTP_CLIENT_IP']) && preg_match('/^([0-9]{1,3}\.){3}[0-9]{1,3}$/', $_SERVER['HTTP_CLIENT_IP']))
     986     {
     987         $ip = $_SERVER['HTTP_CLIENT_IP'];
     988     }
     989     elseif(isset($_SERVER['HTTP_X_FORWARDED_FOR']) && preg_match_all('#\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}#s', $_SERVER['HTTP_X_FORWARDED_FOR'], $matches))
     990     {
     991         foreach ($matches[0] AS $xip)
     992         {
     993             if (!preg_match('#^(10|172\.16|192\.168)\.#', $xip))
     994             {
     995                 $ip = $xip;
     996                 break;
     997             }
     998         }
     999     }
    1000     return $ip;
    1001 }
    1002 
    1003 /**
    1004  * 字符转义
    1005  * @return string
    1006  */
    1007 function fAddslashes($string)
    1008 {
    1009     if(empty($string))
    1010         return $string;
    1011     
    1012     if(is_array($string))
    1013     {
    1014         $keys = array_keys($string);
    1015         foreach($keys as $key)
    1016         {
    1017             $val = $string[$key];
    1018             unset($string[$key]);
    1019             $string[addslashes($key)] = fAddslashes($val);
    1020         }
    1021     }
    1022     else
    1023     {
    1024         $string = addslashes($string);
    1025     }
    1026     return $string;
    1027 }
    1028 
    1029 /**
    1030  * 字符转义
    1031  * @return string
    1032  */
    1033 function fStripslashes($string)
    1034 {
    1035     if(empty($string))
    1036         return $string;
    1037     
    1038     if(is_array($string))
    1039     {
    1040         foreach($string as $key => $val)
    1041         {
    1042             $string[$key] = fStripslashes($val);
    1043         }
    1044     }
    1045     else
    1046     {
    1047         $string = stripslashes($string);
    1048     }
    1049     return $string;
    1050 }
    1051 
    1052 /**
    1053  * 生成随机数
    1054  * @param int $length 随机数长度
    1055  * @param int $numeric 是否只生成数字
    1056  * @return string
    1057  */
    1058 function random($length, $numeric = 0)
    1059 {
    1060     $seed = base_convert(md5(microtime().$_SERVER['DOCUMENT_ROOT']), 16, $numeric ? 10 : 35);
    1061     $seed = $numeric ? (str_replace('0', '', $seed).'012340567890') : ($seed.'zZ'.strtoupper($seed));
    1062     $hash = '';
    1063     $max = strlen($seed) - 1;
    1064     for($i = 0; $i < $length; $i++)
    1065     {
    1066         $hash .= $seed{mt_rand(0, $max)};
    1067     }
    1068     return $hash;
    1069 }
    1070 
    1071 /**
    1072  * 生成cookie
    1073  * @param string $var 键名
    1074  * @param string $value 值
    1075  * @param int $life 过期时间
    1076  * @param bool $prefix 是否加入前缘
    1077  * @param bool $http_only
    1078  * @return void
    1079  */
    1080 function fSetCookie($var, $value = '', $life = 0, $prefix = true, $http_only = false)
    1081 {
    1082     global $_FANWE;
    1083     $config = $_FANWE['config']['cookie'];
    1084     $_FANWE['cookie'][$var] = $value;
    1085     $var = ($prefix ? $config['cookie_pre'] : '').$var;
    1086     $_COOKIE[$var] = $value;
    1087 
    1088     if($value == '' || $life < 0)
    1089     {
    1090         $value = '';
    1091         $life = -1;
    1092     }
    1093 
    1094     $life = $life > 0 ? TIME_UTC + $life : ($life < 0 ? TIME_UTC - 31536000 : 0);
    1095     $path = $http_only && PHP_VERSION < '5.2.0' ? $config['cookie_path'].'; HttpOnly' : $config['cookie_path'];
    1096 
    1097     $secure = $_SERVER['SERVER_PORT'] == 443 ? 1 : 0;
    1098     if(PHP_VERSION < '5.2.0')
    1099     {
    1100         setcookie($var, $value, $life, $path, $config['cookie_domain'], $secure);
    1101     }
    1102     else
    1103     {
    1104         setcookie($var, $value, $life, $path, $config['cookie_domain'], $secure, $http_only);
    1105     }
    1106 }
    1107 
    1108 /**
    1109  * 更新session
    1110  * @param bool $force 强制更新
    1111  * @return bool
    1112  */
    1113 function updateSession($force = false) {
    1114 
    1115     global $_FANWE;
    1116     static $updated = false;
    1117 
    1118     if(!$updated)
    1119     {
    1120         $fanwe = & FanweService::instance();
    1121         foreach($fanwe->session->var as $k => $v)
    1122         {
    1123             if(isset($_FANWE['user'][$k]) && $k != 'last_activity')
    1124                 $fanwe->session->set($k, $_FANWE['user'][$k]);
    1125         }
    1126 
    1127         $fanwe->session->update();
    1128 
    1129         $updated = true;
    1130     }
    1131 
    1132     return $updated;
    1133 }
    1134 
    1135 /**
    1136  * 获取cookie
    1137  * @param string $key 键名
    1138  * @return bool
    1139  */
    1140 function getCookie($key)
    1141 {
    1142     global $_FANWE;
    1143     return isset($_FANWE['cookie'][$key]) ? $_FANWE['cookie'][$key] : '';
    1144 }
    1145 
    1146 /**
    1147  * 生成表单随机数
    1148  * @param string $specialadd 增加文本
    1149  * @return string
    1150  */
    1151 function formHash($specialadd = '')
    1152 {
    1153     global $_FANWE;
    1154     return substr(md5(substr(TIME_UTC, 0, -7).$_FANWE['user_name'].$_FANWE['uid'].$_FANWE['authkey'].$specialadd), 8, 8);
    1155 }
    1156 
    1157 /**
    1158  * 安全代码处理
    1159  * @param string $string 要处理的文本
    1160  * @param string $operation 处理方式(DECODE:解码,ENCODE:编码)
    1161  * @param string $key 密匙
    1162  * @param int $expiry 过期时间
    1163  * @return string
    1164  */
    1165 function authcode($string, $operation = 'DECODE', $key = '', $expiry = 0)
    1166 {
    1167     global $_FANWE;
    1168     $ckey_length = 4;
    1169     $key = md5($key != '' ? $key : $_FANWE['authkey']);
    1170     $keya = md5(substr($key, 0, 16));
    1171     $keyb = md5(substr($key, 16, 16));
    1172     $keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length): substr(md5(microtime()), -$ckey_length)) : '';
    1173 
    1174     $cryptkey = $keya.md5($keya.$keyc);
    1175     $key_length = strlen($cryptkey);
    1176 
    1177     $string = $operation == 'DECODE' ? base64_decode(substr($string, $ckey_length)) : sprintf('%010d', $expiry ? $expiry + time() : 0).substr(md5($string.$keyb), 0, 16).$string;
    1178     $string_length = strlen($string);
    1179 
    1180     $result = '';
    1181     $box = range(0, 255);
    1182 
    1183     $rndkey = array();
    1184     for($i = 0; $i <= 255; $i++)
    1185     {
    1186         $rndkey[$i] = ord($cryptkey[$i % $key_length]);
    1187     }
    1188 
    1189     for($j = $i = 0; $i < 256; $i++)
    1190     {
    1191         $j = ($j + $box[$i] + $rndkey[$i]) % 256;
    1192         $tmp = $box[$i];
    1193         $box[$i] = $box[$j];
    1194         $box[$j] = $tmp;
    1195     }
    1196 
    1197     for($a = $j = $i = 0; $i < $string_length; $i++)
    1198     {
    1199         $a = ($a + 1) % 256;
    1200         $j = ($j + $box[$a]) % 256;
    1201         $tmp = $box[$a];
    1202         $box[$a] = $box[$j];
    1203         $box[$j] = $tmp;
    1204         $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
    1205     }
    1206 
    1207     if($operation == 'DECODE')
    1208     {
    1209         if((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16))
    1210         {
    1211             return substr($result, 26);
    1212         } else {
    1213             return '';
    1214         }
    1215     }
    1216     else
    1217     {
    1218         return $keyc.str_replace('=', '', base64_encode($result));
    1219     }
    1220 
    1221 }
    1222 
    1223 /**
    1224  * 获取语言文本
    1225  * @param string $file 所在文件
    1226  * @param string $var 键
    1227  * @param string $default 默认值
    1228  * @return mixed
    1229  */
    1230 function lang($file, $var = NULL, $default = NULL)
    1231 {
    1232     global $_FANWE;
    1233 
    1234     $key = $file."_lang";
    1235 
    1236     if(!isset($_FANWE['lang'][$key]))
    1237     {
    1238         include fimport("language/$file");
    1239         $_FANWE['lang'][$key] = $lang;
    1240     }
    1241 
    1242     $return = $var !== NULL ? (isset($_FANWE['lang'][$key][$var]) ? $_FANWE['lang'][$key][$var] : NULL) : $_FANWE['lang'][$key];
    1243 
    1244     $return = $return === NULL ? ($default !== NULL ? $default : $var) : $return;
    1245 
    1246     return $return;
    1247 }
    1248 
    1249 /**
    1250  * 获取IP列表中是否存在指定的IP
    1251  * @param string $ip ip
    1252  * @param string $access_list ip列表
    1253  * @return bool
    1254  */
    1255 function ipAccess($ip, $access_list)
    1256 {
    1257     return preg_match("/^(".str_replace(array("\r\n", ' '), array('|', ''), preg_quote($access_list, '/')).")/", $ip);
    1258 }
    1259 
    1260 /**
    1261  * 获取IP是否充许访问
    1262  * @param string $ip ip
    1263  * @return bool
    1264  */
    1265 function ipBanned($ip)
    1266 {
    1267     global $_FANWE;
    1268 
    1269     if($_FANWE['setting']['ip_access'] && !ipAccess($ip, $_FANWE['setting']['ip_access']))
    1270     {
    1271         return true;
    1272     }
    1273 
    1274     FanweService::instance()->cache->loadCache('ipbanned');
    1275 
    1276     if(empty($_FANWE['cache']['ipbanned']))
    1277         return false;
    1278     else
    1279     {
    1280         if($_FANWE['cache']['ipbanned']['expiration'] < TIME_UTC)
    1281         {
    1282             FanweService::instance()->cache->updateCache('ipbanned');
    1283         }
    1284 
    1285         return preg_match("/^(".$_FANWE['cache']['ipbanned']['regexp'].")$/", $ip);
    1286     }
    1287 }
    1288 
    1289 /**
    1290  * 获取模板cache文件路径
    1291  * @param string $file 模板文件
    1292  * @param array $args 参数
    1293  * @param int $is_dynamic 是否为动态缓存(动态缓存页面在清空缓存,不删除)
    1294  * @param string $dir 缓存目录
    1295  * @return string
    1296  */
    1297 function getTplCache($file, $args = array(), $is_dynamic = 0,$dir = '')
    1298 {
    1299     global $_FANWE;
    1300     $tpl_dir = './tpl/'.$_FANWE['setting']['site_tmpl'];
    1301     $tpl_file = $tpl_dir.'/'.$file.'.htm';
    1302 
    1303     if(!empty($dir))
    1304         $dir .= '/';
    1305     
    1306     switch($is_dynamic)
    1307     {
    1308         case 1:
    1309             $dir = 'dynamic/'.$dir;
    1310         break;
    1311         
    1312         case 2:
    1313             $dir = 'page/'.$dir;
    1314         break;
    1315         
    1316         default:
    1317             $dir = 'static/'.$dir;
    1318         break;
    1319     }
    1320     
    1321     if(!empty($args))
    1322     {
    1323         $tpl_file .= http_build_query($args);
    1324     }
    1325     $filename = md5($tpl_file);
    1326     return PUBLIC_ROOT.'./data/tpl/caches/'.$dir.str_replace('/', '_', $file).'/'.substr($filename,0,2)."/".substr($filename,2,2)."/".$filename.".htm";
    1327 }
    1328 
    1329 /**
    1330  * 检测模板是否需要更新
    1331  * @param string $main_tpl
    1332  * @param string $sub_tpl
    1333  * @param int $time_compare
    1334  * @param string $cache_file
    1335  * @param string $tpl_dir
    1336  * @param string $file
    1337  * @return bool
    1338  */
    1339 function checkTplRefresh($main_tpl, $sub_tpl, $time_compare, $cache_file, $tpl_dir, $file)
    1340 {
    1341     global $_FANWE;
    1342     static $tpl_refresh = NULL;
    1343     if($tpl_refresh === NULL)
    1344     {
    1345         $tpl_refresh = $_FANWE['config']['output']['tpl_refresh'];
    1346     }
    1347 
    1348     if(empty($time_compare) || $tpl_refresh == 1 || ($tpl_refresh > 1 && !(TIMESTAMP % $tpl_refresh)))
    1349     {
    1350         if(empty($time_compare) || @filemtime(FANWE_ROOT.$sub_tpl) > $time_compare)
    1351         {
    1352             require_once fimport('class/template');
    1353             $template = new Template();
    1354             $template->parseTemplate($main_tpl, $tpl_dir, $file, $cache_file);
    1355             return TRUE;
    1356         }
    1357     }
    1358     return FALSE;
    1359 }
    1360 
    1361 /**
    1362  * 模板处理
    1363  * @param string $file
    1364  * @param string $tpl_dir
    1365  * @param bool $get_tpl_file
    1366  * @return string
    1367  */
    1368 function template($file, $tpl_dir = '', $get_tpl_file = 0)
    1369 {
    1370     global $_FANWE;
    1371 
    1372     $tpl_dir = $tpl_dir ? $tpl_dir : './tpl/'.$_FANWE['setting']['site_tmpl'];
    1373     $tpl_file = $tpl_dir.'/'.$file.'.htm';
    1374     $cache_file = './data/tpl/compiled/'.str_replace('/', '_', $file).'.tpl.php';
    1375 
    1376     if($get_tpl_file)
    1377         return $tpl_file;
    1378 
    1379     checkTplRefresh($tpl_file, $tpl_file, @filemtime(PUBLIC_ROOT.$cache_file), $cache_file, $tpl_dir, $file);
    1380     return PUBLIC_ROOT.$cache_file;
    1381 }
    1382 
    1383 /**
    1384  * 获取模板编译后内容
    1385  * @param string $file
    1386  * @param array $args
    1387  * @param string $tpl_dir
    1388  * @return string
    1389  */
    1390 function tplFetch($file,&$args = array(), $tpl_dir = '',$cache_file = '')
    1391 {
    1392     global $_FANWE;
    1393 
    1394     if(!empty($args))
    1395     {
    1396         foreach($args as $key=>$val)
    1397         {
    1398             $$key = &$args[$key];
    1399         }
    1400     }
    1401 
    1402     ob_start();
    1403     if(!empty($cache_file) && file_exists($cache_file))
    1404         include $cache_file;
    1405     else
    1406         include template($file,$tpl_dir);
    1407     $content = ob_get_contents();
    1408     ob_end_clean();
    1409     
    1410     if(empty($cache_file))
    1411         express($content);
    1412     
    1413     
    1414     if(!empty($cache_file) && !file_exists($cache_file))
    1415     {
    1416         express($content);
    1417         $dynamic_php = '';
    1418         if(isset($_FANWE['tpl_image_formats']))
    1419             $dynamic_php .= "<?php\n".' setTplFormats(\'tpl_image_formats\','.var_export($_FANWE['tpl_image_formats'], true).");\n?>";
    1420         
    1421         if(makeDir(preg_replace("/^(.*)\/.*?\.htm$/is", "\\1", $cache_file)))
    1422             writeFile($cache_file,$dynamic_php.$content);
    1423     }
    1424 
    1425     require_once fimport('dynamic/common');
    1426     $module_dynamic = '';
    1427     if(defined('MODULE_NAME') && MODULE_NAME != '')
    1428         $module_dynamic = fimport('dynamic/'.MODULE_NAME);
    1429 
    1430     if(!empty($module_dynamic) && file_exists($module_dynamic))
    1431         require_once $module_dynamic;
    1432 
    1433     $content = preg_replace('/<!--dynamic\s+(.+?)(?:|\sargs=(.*?))-->/ies', "\\1('\\2');", $content);
    1434     
    1435     //格式化会员关注
    1436     formatUserFollowTags($content);
    1437     formatImageTags($content);
    1438     contentParse($content);
    1439     
    1440     return $content;
    1441 }
    1442 
    1443 /**
    1444  * 处理模板字符串,并返回编译后内容
    1445  * @param string $string
    1446  * @param string $cache_key
    1447  * @param array $args
    1448  * @return string
    1449  */
    1450 function tplString($string,$cache_key,&$args = array())
    1451 {
    1452     global $_FANWE;
    1453 
    1454     if(!empty($args))
    1455     {
    1456         foreach($args as $key=>$val)
    1457         {
    1458             $$key = &$args[$key];
    1459         }
    1460     }
    1461 
    1462     if(empty($cache_key))
    1463         $cache_key = md5($string);
    1464 
    1465     $cache_file = PUBLIC_ROOT.'./data/tpl/caches/'.$cache_key.'.htm';
    1466     
    1467     if(!file_exists($cache_file))
    1468     {
    1469         if(makeDir(preg_replace("/^(.*)\/.*?\.htm$/is", "\\1", $cache_file)))
    1470         {
    1471             require_once fimport('class/template');
    1472             $template = new Template();
    1473             $string = $template->parseString($string);
    1474             writeFile($cache_file,$string);
    1475         }
    1476     }
    1477 
    1478     ob_start();
    1479     include $cache_file;
    1480     $content = ob_get_contents();
    1481     ob_end_clean();
    1482 
    1483     require_once fimport('dynamic/common');
    1484     $module_dynamic = '';
    1485     if(defined('MODULE_NAME') && MODULE_NAME != '')
    1486         $module_dynamic = fimport('dynamic/'.MODULE_NAME);
    1487 
    1488     if(!empty($module_dynamic) && file_exists($module_dynamic))
    1489         require_once $module_dynamic;
    1490     
    1491     $content = preg_replace('/<!--dynamic\s+(.+?)(?:|\sargs=(.*?))-->/ies', "\\1('\\2');", $content);
    1492     //格式化会员关注
    1493     express($content);
    1494     formatUserFollowTags($content);
    1495     formatImageTags($content);
    1496     contentParse($content);
    1497     return $content;
    1498 }
    1499 
    1500 /**
    1501  * 显示页面
    1502  * @param string $cache_file 缓存路径
    1503  * @param bool $is_session 是否更新session
    1504  * @param bool $is_return 是否返回页面内容
    1505  * @return mixed
    1506  */
    1507 function display($cache_file = '',$is_session = true,$is_return = false)
    1508 {
    1509     global $_FANWE;
    1510     $content = NULL;
    1511     if(!empty($cache_file) && !file_exists($cache_file))
    1512     {
    1513         if(makeDir(preg_replace("/^(.*)\/.*?\.htm$/is", "\\1", $cache_file)))
    1514         {
    1515             $dynamic_php = '';
    1516             if(isset($_FANWE['page_parses']))
    1517                 $dynamic_php = "<?php\n".' $_FANWE[\'CACHE_CSS_SCRIPT_PHP\']'." = ".var_export($_FANWE['page_parses'], true).";\n?>";
    1518             
    1519             $content = ob_get_contents();
    1520             express($content);
    1521             
    1522             if(isset($_FANWE['tpl_image_formats']))
    1523                 $dynamic_php .= "<?php\n".' setTplFormats(\'tpl_image_formats\','.var_export($_FANWE['tpl_image_formats'], true).");\n?>";
    1524 
    1525             writeFile($cache_file,$dynamic_php.$content);
    1526         }
    1527     }
    1528 
    1529     require_once fimport('dynamic/common');
    1530     $module_dynamic = '';
    1531     if(defined('MODULE_NAME') && MODULE_NAME != '')
    1532         $module_dynamic = fimport('dynamic/'.MODULE_NAME);
    1533     
    1534     if(!empty($module_dynamic) && file_exists($module_dynamic))
    1535         require_once $module_dynamic;
    1536 
    1537     if($content === NULL)
    1538     {
    1539         $content = ob_get_contents();
    1540         express($content);
    1541     }
    1542     ob_end_clean();
    1543     
    1544     $content = preg_replace('/<!--dynamic\s+(.+?)(?:|\sargs=(.*?))-->/ies', "\\1('\\2');", $content);
    1545 
    1546     if(isset($_FANWE['CACHE_CSS_SCRIPT_PHP']))
    1547     {
    1548         if(isset($_FANWE['CACHE_CSS_SCRIPT_PHP']['css']))
    1549         {
    1550             foreach($_FANWE['CACHE_CSS_SCRIPT_PHP']['css'] as $url)
    1551             {
    1552                 cssParse($url);
    1553             }
    1554         }
    1555         
    1556         if(isset($_FANWE['CACHE_CSS_SCRIPT_PHP']['script']))
    1557         {
    1558             foreach($_FANWE['CACHE_CSS_SCRIPT_PHP']['script'] as $url)
    1559             {
    1560                 scriptParse($url);
    1561             }
    1562         }
    1563     }
    1564     
    1565     //格式化会员关注
    1566     formatUserFollowTags($content);
    1567     formatImageTags($content);
    1568     contentParse($content);
    1569     
    1570     if($is_session)
    1571         updateSession();
    1572 
    1573     if($is_return)
    1574         return $content;
    1575 
    1576     $_FANWE['config']['gzip_compress'] ? ob_start('ob_gzhandler') : ob_start();
    1577     echo $content;
    1578 }
    1579 
    1580 function contentParse(&$content)
    1581 {
    1582     global $_FANWE;
    1583     $patterns = array (
    1584         "/\.\/public\/js\//i",
    1585         "/\.\/public\/upload\//i",
    1586         "/\.\/public\//i",
    1587         //"/\.\/tpl\/(.*?)\/css\//i",
    1588         //"/\.\/tpl\/(.*?)\/js\//i",
    1589         //"/\.\/tpl\/(.*?)\/images\//i",
    1590         "/\.\/tpl\/css\//i",
    1591         "/\.\/tpl\/images\//i",
    1592         "/\.\/tpl\/js\//i",
    1593         "/\.\/tpl\/(.*?)\//i",
    1594     );
    1595 
    1596     $image_url = !empty($_FANWE['config']['cdn']['image']) ? $_FANWE['config']['cdn']['image'] : $_FANWE['site_root'];
    1597     $css_url = !empty($_FANWE['config']['cdn']['css']) ? $_FANWE['config']['cdn']['css'] : $_FANWE['site_root'];
    1598     $js_url = !empty($_FANWE['config']['cdn']['js']) ? $_FANWE['config']['cdn']['js'] : $_FANWE['site_root'];
    1599 
    1600     $replace = array (
    1601         $js_url.'public/js/',
    1602         $image_url.'public/upload/',
    1603         $_FANWE['site_root'].'public/',
    1604         //$css_url.'tpl/\\1/css/',
    1605         //$js_url.'tpl/\\1/js/',
    1606         //$image_url.'tpl/\\1/images/',
    1607         $_FANWE['site_root'].'public/data/tpl/css/',
    1608         $_FANWE['site_root'].'tpl/'.TMPL.'/images/',
    1609         $_FANWE['site_root'].'tpl/'.TMPL.'/js/',
    1610         $_FANWE['site_root'].'tpl/\\1/',
    1611     );
    1612 
    1613     if(FS('Image')->getIsServer())
    1614     {
    1615         if(!isset($_FANWE['cache']['image_servers']))
    1616             FanweService::instance()->cache->loadCache('image_servers');
    1617         foreach($_FANWE['cache']['image_servers']['all'] as $server)
    1618         {
    1619             $patterns[] = "/\.\/".$server['code']."\//i";
    1620             $replace[] = $server['url'];
    1621         }
    1622     }
    1623 
    1624     if(isset($_FANWE['UPYUN_SETTING']))
    1625     {
    1626         $patterns[] = "/\.\/upyun\//i";
    1627         $replace[] = $_FANWE['UPYUN_SETTING']['url'].'/';
    1628     }
    1629 
    1630     $content = preg_replace($patterns,$replace, $content);
    1631 }
    1632 
    1633 function clearExpress($content)
    1634 {
    1635     return preg_replace("/\[[^\]]+\]/i",'',$content);
    1636 }
    1637 
    1638 function express(&$content)
    1639 {
    1640     global $_FANWE;
    1641 
    1642     $express = getCache('emotion_express_cache'); //缓存过的表情hash
    1643     if(!$express)
    1644     {
    1645         $express_rs = FDB::fetchAll("select `emotion`,concat('".$_FANWE['site_root']."public/expression/',`type`,'/',`filename`) as fname from ".FDB::table('expression'));
    1646         foreach($express_rs as $k=>$row)
    1647         {
    1648             $express[0][] = $row['emotion'];
    1649             $express[1][] = "<img src='".$row['fname']."' title='".preg_replace("/[\[\]]/",'',$row['emotion'])."' />";
    1650         }
    1651         setCache('emotion_express_cache',$express);
    1652     }
    1653     
    1654     preg_match("/(<html.*?>.*?<\/head>)/s",$content,$data);
    1655     $head_html = $data[1];
    1656     $content = str_replace($head_html,'<!--TAG_HEADER-->',$content);
    1657 
    1658     preg_match_all("/(<textarea.*?>.*?<\/textarea>)/s",$content,$data);
    1659     $textareas = $data[1];
    1660     if(count($textareas) > 0)
    1661     {
    1662         foreach($textareas as $key => $textarea)
    1663         {
    1664             $content = str_replace($textarea,'<!--TAG_TEXTAREA_'.$key.'-->',$content);
    1665         }
    1666     }
    1667     
    1668     preg_match_all("/#([^\f\n\r\t\v]{1,80}?)#/",$content,$events);
    1669     if(!empty($events[1]))
    1670     {
    1671         $patterns = array();
    1672         $replace = array();
    1673         $events = array_unique($events[1]);
    1674         $arr = array();
    1675         foreach($events as $event)
    1676         {
    1677             if(!empty($event))
    1678             {
    1679                 if(substr($event,0,3) != '35;' && substr($event,0,3) != '64;')
    1680                     $arr[] = addslashes($event);
    1681             }
    1682         }
    1683 
    1684         $res = FDB::query('SELECT id,title
    1685             FROM '.FDB::table('event').'
    1686             WHERE title '.FDB::createIN($arr));
    1687         while($data = FDB::fetch($res))
    1688         {
    1689             $patterns[] = '#'.$data['title'].'#';
    1690             $replace[] = '<a href="'.FU("event/detail",array("id"=>$data['id'])).'" target="_blank">&#35;'.str_replace('@','&#64;',$data['title']).'&#35;</a>';
    1691         }
    1692 
    1693         $content = str_replace($patterns,$replace,$content);
    1694     }
    1695 
    1696     preg_match_all("/@([^\f\n\r\t\v@<> ]{2,20}?)(?:\:| )/",$content,$users);
    1697     if(!empty($users[1]))
    1698     {
    1699         $patterns = array();
    1700         $replace = array();
    1701         $users = array_unique($users[1]);
    1702         $arr = array();
    1703         foreach($users as $user)
    1704         {
    1705             if(!empty($user))
    1706             {
    1707                 $arr[] = addslashes($user);
    1708             }
    1709         }
    1710 
    1711         $res = FDB::query('SELECT uid,user_name
    1712             FROM '.FDB::table('user').'
    1713             WHERE user_name '.FDB::createIN($arr));
    1714         while($data = FDB::fetch($res))
    1715         {
    1716             $patterns[] = '/@'.preg_quote($data['user_name']).'(\:| )/';
    1717             $replace[] = '<a class="u_name GUID" uid="'.$data['uid'].'" href="'.FU('u/index',array('uid'=>$data['uid'])).'">&#64;'.$data['user_name']."</a>\$1";
    1718         }
    1719 
    1720         $content = preg_replace($patterns,$replace,$content);
    1721     }
    1722     
    1723     if(count($_FANWE['tpl_user_formats']) > 0)
    1724     {
    1725         $patterns = array();
    1726         $replace = array();
    1727         
    1728         $user_ids = array_keys($_FANWE['tpl_user_formats']);
    1729         $user_ids = implode(',',$user_ids);
    1730         $user_ids = str_replace(',,',',',$user_ids);
    1731         if(!empty($user_ids))
    1732         {
    1733             $res = FDB::query("SELECT u.uid,u.gid,u.user_name,u.avatar,u.reg_time,u.credits,u.is_daren,u.is_buyer,uc.* FROM ".FDB::table('user').' AS u 
    1734                 INNER JOIN '.FDB::table('user_count').' AS uc USING(uid) 
    1735                 WHERE u.uid IN ('.$user_ids.')');
    1736             while($user = FDB::fetch($res))
    1737             {
    1738                 $uid = $user['uid'];
    1739                 $user['url'] = FU('u/index',array('uid'=>$uid));
    1740                 foreach($_FANWE['tpl_user_formats'][$uid] as $tuf_key => $tuf_val)
    1741                 {
    1742                     $patterns[] = "<!--USER_".$uid."_".$tuf_key."-->";
    1743                     $replace[] = getUserFormatHtml($user,$tuf_val);
    1744                 }
    1745                 unset($_FANWE['tpl_user_formats'][$uid]);
    1746             }
    1747             $content = str_replace($patterns,$replace,$content);
    1748         }
    1749     }
    1750     
    1751     $content = str_replace($express[0],$express[1],$content);
    1752     $content = str_replace('<!--TAG_HEADER-->',$head_html,$content);
    1753 
    1754     if(count($textareas) > 0)
    1755     {
    1756         foreach($textareas as $key => $textarea)
    1757         {
    1758             $content = str_replace('<!--TAG_TEXTAREA_'.$key.'-->',$textarea,$content);
    1759         }
    1760     }
    1761     return $content;
    1762 }
    1763 
    1764 function setTplFormats($format_key,$format_list)
    1765 {
    1766     global $_FANWE;
    1767     foreach($format_list as $rkey => $rformats)
    1768     {
    1769         if(is_array($rformats))
    1770         {
    1771             foreach($rformats as $ckey => $cformats)
    1772             {
    1773                 if(!isset($_FANWE[$format_key][$rkey][$ckey]))
    1774                     $_FANWE[$format_key][$rkey][$ckey] = $cformats;
    1775             }
    1776         }
    1777     }
    1778 }
    1779 
    1780 //加入会员格式化
    1781 function setTplUserFormat($uid,$type,$is_mark,$img_type,$img_size,$link_class,$img_class,$tpl)
    1782 {
    1783     global $_FANWE;
    1784     $uid = (int)$uid;
    1785     $key = md5($type.'_'.$is_mark.'_'.$img_type.'_'.$img_size.'_'.$link_class.'_'.$img_class.'_'.$tpl);
    1786     $_FANWE['tpl_user_formats'][$uid][$key] = array(
    1787         'type' => $type,
    1788         'is_mark'=>$is_mark,
    1789         'img_type' => $img_type,
    1790         'img_size' => $img_size,
    1791         'link_class' => $link_class,
    1792         'img_class' => $img_class,
    1793         'tpl' => $tpl
    1794     );
    1795     return "<!--USER_".$uid."_".$key."-->";
    1796 }
    1797 
    1798 //获取会员格式化html
    1799 function getUserFormatHtml($user,$format)
    1800 {
    1801     global $_FANWE;
    1802     static $templates = array(),$daren_name = NULL;
    1803     $html = '';
    1804     $mark_html = '';
    1805     if($format['is_mark'] == 1)
    1806     {
    1807         $group = $_FANWE['cache']['user_group'][$user['gid']];
    1808         if(!empty($group['icon']))
    1809         {
    1810             $mark_html .= '<img alt="'.$group['name'].'" src="./public/icons/'.$group['icon'].'" class="v">';
    1811         }
    1812         elseif($user['is_daren'] == 1)
    1813         {
    1814             if($daren_name === NULL)
    1815                 $daren_name = sprintf(lang('user','daren_alt'),$_FANWE['setting']['site_name']);
    1816             $mark_html .= '<a href="'.FU('daren/apply').'" class="v" target="_blank"><img title="'.$daren_name.'" src="./tpl/images/daren_icon.png" class="v"></a>';
    1817         }
    1818         elseif($user['is_buyer'] == 1)
    1819             $mark_html .= '<a href="'.FU('settings/buyerverifier').'" class="v" target="_blank"><img title="'.lang('user','buyer_alt').'" src="./tpl/images/buyer_icon.png" class="v"></a>';
    1820     }
    1821     
    1822     if(!empty($format['tpl']))
    1823     {
    1824         if(!isset($templates[$format['tpl']]))
    1825             $templates[$format['tpl']] = template($format['tpl']);
    1826         
    1827         if($templates[$format['tpl']])
    1828         {
    1829             ob_start();
    1830             include $templates[$format['tpl']];
    1831             $html = ob_get_contents();
    1832             ob_end_clean();
    1833         }
    1834     }
    1835     else
    1836     {
    1837         $uid = $user['uid'];
    1838         $user_name = htmlspecialchars($user['user_name']);
    1839         if($format['type'] == 0)
    1840             $html = '<a class="GUID '.$format['link_class'].'" uid="'.$uid.'" title="'.$user_name.'" href="'.$user['url'].'" target="_blank">'.$user_name.'</a>';
    1841         elseif($format['type'] == 2)
    1842         {
    1843             $html = '<a href="javascript:;" onclick="$.AtMe_Share(this);" class="home_at_ta bc" toname="'.$user_name.'" >@'.$user_name.'</a>';
    1844         }
    1845         else
    1846         {
    1847             $width = '';
    1848             if($format['img_size'] > 0)
    1849                 $width = 'width="'.$format['img_size'].'" ';
    1850             
    1851             $is_lazyload = FALSE;
    1852             $img_class = $format['img_class'];
    1853             if(!empty($img_class))
    1854                 $is_lazyload = strpos($img_class,'lazyload');
    1855             
    1856             $link_class = '';
    1857             if(!empty($format['link_class']))
    1858                 $link_class = 'class="'.$format['link_class'].'" ';
    1859             
    1860             if($format['type'] == 3)
    1861             {
    1862                 if($is_lazyload === FALSE)
    1863                     $html = '<img class="'.$img_class.'" src="'.setTplAvatarFormat($user['avatar'],$format['img_type']).'" '.$width.' />';
    1864                 else
    1865                     $html = '<img class="'.$img_class.'" original="'.setTplAvatarFormat($user['avatar'],$format['img_type']).'" src="./tpl/images/lazyload.gif" '.$width.'/>';
    1866             }
    1867             elseif($format['type'] == 4)
    1868             {
    1869                 $html = '<a '.$link_class.'title="'.$user_name.'" href="'.$user['url'].'" target="_blank">@'.$user_name.'</a>';
    1870             }
    1871             else
    1872             {
    1873                 if($is_lazyload === FALSE)
    1874                     $html = '<a '.$link_class.'title="'.$user_name.'" href="'.$user['url'].'" target="_blank"><img class="GUID '.$img_class.'" uid="'.$uid.'" src="'.setTplAvatarFormat($user['avatar'],$format['img_type']).'" '.$width.' alt="'.$user_name.'"/></a>';
    1875                 else
    1876                     $html = '<a '.$link_class.'title="'.$user_name.'" href="'.$user['url'].'" target="_blank"><img class="GUID '.$img_class.'" uid="'.$uid.'" original="'.setTplAvatarFormat($user['avatar'],$format['img_type']).'" src="./tpl/images/lazyload.gif" '.$width.' alt="'.$user_name.'"/></a>';
    1877             }
    1878         }
    1879         $html .= $mark_html;
    1880     }
    1881     return $html;
    1882 }
    1883 
    1884 function formatUserFollowTags(&$content)
    1885 {
    1886     global $_FANWE;
    1887     
    1888     preg_match_all("/<!--getfollow\s(\d+?)\s(.+?)-->/",$content,$follows);
    1889     if(!empty($follows[1]))
    1890     {
    1891         $patterns = array();
    1892         $replace = array();
    1893         $user_ids = array();
    1894         
    1895         foreach($follows[1] as $key => $uid)
    1896         {
    1897             $uid = (int)$uid;
    1898             $tpl = $follows[2][$key];
    1899             if($_FANWE['uid'] == $uid)
    1900             {
    1901                 if(!isset($user_ids[$uid][$tpl]))
    1902                 {
    1903                     $patterns[] = "<!--getfollow ".$uid." ".$tpl."-->";
    1904                     $replace[] = getUserFollowFormatHtml($uid,-1,$tpl);
    1905                     $user_ids[$uid][$tpl] = -1;
    1906                 }
    1907             }
    1908             else
    1909             {
    1910                 $user_ids[$uid]['is_follow'] = 0;
    1911                 $user_ids[$uid]['tpls'][$tpl] = 0;
    1912             }
    1913         }
    1914         unset($user_ids[$_FANWE['uid']]);
    1915 
    1916         if($_FANWE['uid'] > 0)
    1917         {
    1918             $follow_ids = array_keys($user_ids);
    1919             if(count($follow_ids) > 0)
    1920             {
    1921                 $follow_ids = implode(',',$follow_ids);
    1922                 $follow_ids = str_replace(',,',',',$follow_ids);
    1923                 if(!empty($follow_ids))
    1924                 {
    1925                     $res = FDB::query("SELECT uid FROM ".FDB::table('user_follow').' 
    1926                         WHERE f_uid = '.$_FANWE['uid'].' AND uid IN ('.$follow_ids.')');
    1927                     while($item = FDB::fetch($res))
    1928                     {
    1929                         $user_ids[$item['uid']]['is_follow'] = 1;
    1930                     }
    1931                 }
    1932             }
    1933         }
    1934         
    1935         foreach($user_ids as $uid => $user)
    1936         {
    1937             $is_follow = $user['is_follow'];
    1938             foreach($user['tpls'] as $tpl => $temp)
    1939             {
    1940                 $patterns[] = "<!--getfollow ".$uid." ".$tpl."-->";
    1941                 $replace[] = getUserFollowFormatHtml($uid,$is_follow,$tpl);
    1942             }
    1943         }
    1944         
    1945         $content = str_replace($patterns,$replace,$content);
    1946     }
    1947 }
    1948 
    1949 //获取会员关注格式化html
    1950 function getUserFollowFormatHtml($uid,$is_follow,$tpl)
    1951 {
    1952     static $templates = array();
    1953     $html = '';
    1954     
    1955     if(!isset($templates[$tpl]))
    1956         $templates[$tpl] = template($tpl);
    1957     
    1958     if($templates[$tpl])
    1959     {
    1960         ob_start();
    1961         include $templates[$tpl];
    1962         $html = ob_get_contents();
    1963         ob_end_clean();
    1964     }
    1965     
    1966     return $html;
    1967 }
    1968 
    1969 //加入图片格式化
    1970 function setTplImageFormat($id,$width,$height,$gen,$is_full)
    1971 {
    1972     global $_FANWE;
    1973     $id = (int)$id;
    1974     $width = (int)$width;
    1975     $height = (int)$height;
    1976     $gen = (int)$gen;
    1977     $is_full = (int)$is_full;
    1978 
    1979     $key = md5($width.'_'.$height.'_'.$gen.'_'.$is_full);
    1980     $_FANWE['tpl_image_formats'][$id][$key] = array(
    1981         'width' => $width,
    1982         'height'=>$height,
    1983         'gen' => $gen,
    1984         'is_full' => $is_full
    1985     );
    1986     return "<!--IMAGE_".$id."_".$key."-->";
    1987 }
    1988 
    1989 function setTplAvatarFormat($id,$type)
    1990 {
    1991     global $_FANWE;
    1992     $id = (int)$id;
    1993     $type = trim($type);
    1994     
    1995     if($id == 0)
    1996     {
    1997         switch($type)
    1998         {
    1999             case 'm':
    2000                 return './public/upload/avatar/noavatar_middle.jpg';
    2001             break;
    2002             case 'b':
    2003                 return './public/upload/avatar/noavatar_big.jpg';
    2004             break;
    2005             default:
    2006                 return './public/upload/avatar/noavatar_small.jpg';
    2007             break;
    2008         }
    2009     }
    2010     
    2011     static $types = NULL;
    2012     if($types === NULL)
    2013     {
    2014         FS("Image")->getImageArgs($types,'avatar');
    2015         $types = $types['types'];
    2016     }
    2017         
    2018     $size = $types['s'];
    2019     if(array_key_exists($type,$types))
    2020         $size = $types[$type];
    2021     
    2022     return setTplImageFormat($id,$size,$size,1,0);
    2023 }
    2024 
    2025 function formatImageTags(&$content)
    2026 {
    2027     global $_FANWE;
    2028     if(isset($_FANWE['tpl_image_formats']) && count($_FANWE['tpl_image_formats']) > 0)
    2029     {
    2030         $patterns = array();
    2031         $replace = array();
    2032         
    2033         $img_ids = array_keys($_FANWE['tpl_image_formats']);
    2034         $img_list = FS('Image')->getImageListByIds($img_ids);
    2035         if(count($img_list) > 0)
    2036         {
    2037             foreach($img_list as $img_id => $img)
    2038             {
    2039                 foreach($_FANWE['tpl_image_formats'][$img_id] as $img_key => $img_val)
    2040                 {
    2041                     $patterns[] = "<!--IMAGE_".$img_id."_".$img_key."-->";
    2042                     $replace[] = formatImage($img,$img_val['width'],$img_val['height'],$img_val['gen'],$img_val['is_full']);
    2043                 }
    2044             }
    2045             $content = str_replace($patterns,$replace,$content);
    2046         }
    2047     }
    2048 }
    2049 
    2050 /**
    2051  * 清除缓存目录
    2052  * @param string $file 缓存模板目录
    2053  * @param int $is_dynamic 是否为动态缓存
    2054  * @param string $dir 缓存目录
    2055  * @return void
    2056  */
    2057 function clearTplCache($file,$is_dynamic = 0,$dir='')
    2058 {
    2059     if(!empty($dir))
    2060         $dir .= '/';
    2061     $dir = ($is_dynamic == 1 ? 'dynamic/' : 'static/').$dir;
    2062     clearDir(PUBLIC_ROOT.'./data/tpl/caches/'.$dir.str_replace('/', '_', $file));
    2063 }
    2064 
    2065 /**
    2066  * 检测缓存文件是否需要更新
    2067  * @param string $cache_file 缓存文件路径
    2068  * @param int $time_out 缓存时间(秒)
    2069  * @param int $is_clear 清除缓存
    2070  * @return bool 需要更新返回 true
    2071  */
    2072 function getCacheIsUpdate($cache_file,$time_out,$is_clear = 0)
    2073 {
    2074     if (!file_exists($cache_file))
    2075         return true;
    2076     
    2077     $time_clear = 0;
    2078     if($is_clear == 1)
    2079     {
    2080         $clear_path = FANWE_ROOT.'./public/data/is_clear.lock';
    2081         if(file_exists($clear_path))
    2082             $time_clear = (int)@file_get_contents($clear_path);
    2083     }
    2084 
    2085     $mtime = filemtime($cache_file);
    2086     if($time_clear > 0 && $mtime < $time_clear)
    2087     {
    2088         removeFile($cache_file);
    2089         return true;
    2090     }
    2091     elseif(TIMESTAMP - $mtime > $time_out)
    2092     {
    2093         removeFile($cache_file);
    2094         return true;
    2095     }
    2096     else
    2097         return false;
    2098 }
    2099 
    2100 /**
    2101  * 输出json信息
    2102  * @param mixed $result 要输出的信息
    2103  * @return void
    2104  */
    2105 function outputJson($result,$is_die = true)
    2106 {
    2107     static $json = NULL;
    2108     if($json === NULL)
    2109     {
    2110         require fimport('class/json');
    2111         $json = new Json();
    2112     }
    2113     
    2114     if($is_die)
    2115         die($json->encode($result));
    2116     else
    2117         return $json->encode($result);
    2118 }
    2119 
    2120 /**
    2121  * 返回json信息
    2122  * @param mixed $result
    2123  * @return string
    2124  */
    2125 function getJson($result)
    2126 {
    2127     static $json = NULL;
    2128     if($json === NULL)
    2129     {
    2130         require fimport('class/json');
    2131         $json = new Json();
    2132     }
    2133     return $json->encode($result);
    2134 }
    2135 
    2136 /**
    2137  * 清除指定目录下的文件
    2138  * @param string $dir 目录路径
    2139  * @return void
    2140  */
    2141 function clearDir($dir,$is_del_dir = false)
    2142 {
    2143     if(!file_exists($dir))
    2144         return;
    2145 
    2146     $directory = dir($dir);
    2147 
    2148     while($entry = $directory->read())
    2149     {
    2150         if($entry != '.' && $entry != '..')
    2151         {
    2152             $filename = $dir.'/'.$entry;
    2153             if(is_dir($filename))
    2154                 clearDir($filename,$is_del_dir);
    2155 
    2156             if(is_file($filename))
    2157                 removeFile($filename);
    2158         }
    2159     }
    2160 
    2161     $directory->close();
    2162     if($is_del_dir)
    2163         @rmdir($dir);
    2164 }
    2165 
    2166 /**
    2167  * 检查目标文件夹是否存在,如果不存在则自动创建该目录
    2168  *
    2169  * @access      public
    2170  * @param       string      folder     目录路径。不能使用相对于网站根目录的URL
    2171  *
    2172  * @return      bool
    2173  */
    2174 function makeDir($folder)
    2175 {
    2176     $reval = false;
    2177     if (!file_exists($folder))
    2178     {
    2179         $folder = str_replace(FANWE_ROOT,'',$folder);
    2180         /* 如果目录不存在则尝试创建该目录 */
    2181         @umask(0);
    2182         /* 将目录路径拆分成数组 */
    2183         preg_match_all('/([^\/]*)\/?/i', $folder, $atmp);
    2184         /* 如果第一个字符为/则当作物理路径处理 */
    2185         $base = FANWE_ROOT.(($atmp[0][0] == '/') ? '/' : '');
    2186 
    2187         /* 遍历包含路径信息的数组 */
    2188         foreach ($atmp[1] AS $val)
    2189         {
    2190             if ('' != $val)
    2191             {
    2192                 $base .= $val;
    2193                 if ('..' == $val || '.' == $val)
    2194                 {
    2195                     /* 如果目录为.或者..则直接补/继续下一个循环 */
    2196                     $base .= '/';
    2197                     continue;
    2198                 }
    2199             }
    2200             else
    2201             {
    2202                 continue;
    2203             }
    2204             $base .= '/';
    2205 
    2206             if (!file_exists($base))
    2207             {
    2208                 /* 尝试创建目录,如果创建失败则继续循环 */
    2209                 if (@mkdir(rtrim($base, '/'), 0777))
    2210                 {
    2211                     @chmod($base, 0777);
    2212                     $reval = true;
    2213                 }
    2214             }
    2215         }
    2216     }
    2217     else
    2218     {
    2219         /* 路径已经存在。返回该路径是不是一个目录 */
    2220         $reval = is_dir($folder);
    2221     }
    2222 
    2223     clearstatcache();
    2224     return $reval;
    2225 }
    2226 
    2227 /**
    2228  * utf8字符串转为GBK字符串
    2229  * @param string $str 要转换的字符串
    2230  * @return void
    2231  */
    2232 function utf8ToGB($str)
    2233 {
    2234     static $chinese = NULL;
    2235     if($chinese === NULL)
    2236     {
    2237         require_once fimport('class/chinese');
    2238         $chinese = new Chinese('UTF-8','GBK');
    2239     }
    2240     return $chinese->convert($str);
    2241 }
    2242 
    2243 /**
    2244  * GBK字符串转utf8为字符串
    2245  * @param string $str 要转换的字符串
    2246  * @return void
    2247  */
    2248 function gbToUTF8($str)
    2249 {
    2250     static $chinese = NULL;
    2251     if($chinese === NULL)
    2252     {
    2253         require_once fimport('class/chinese');
    2254         $chinese = new Chinese('GBK','UTF-8');
    2255     }
    2256     return $chinese->convert($str);
    2257 }
    2258 
    2259 /**
    2260  * utf8字符转Unicode字符
    2261  * @param string $char 要转换的单字符
    2262  * @return void
    2263  */
    2264 function utf8ToUnicode($char)
    2265 {
    2266     switch(strlen($char))
    2267     {
    2268         case 1:
    2269             return ord($char);
    2270         case 2:
    2271             $n = (ord($char[0]) & 0x3f) << 6;
    2272             $n += ord($char[1]) & 0x3f;
    2273             return $n;
    2274         case 3:
    2275             $n = (ord($char[0]) & 0x1f) << 12;
    2276             $n += (ord($char[1]) & 0x3f) << 6;
    2277             $n += ord($char[2]) & 0x3f;
    2278             return $n;
    2279         case 4:
    2280             $n = (ord($char[0]) & 0x0f) << 18;
    2281             $n += (ord($char[1]) & 0x3f) << 12;
    2282             $n += (ord($char[2]) & 0x3f) << 6;
    2283             $n += ord($char[3]) & 0x3f;
    2284             return $n;
    2285     }
    2286 }
    2287 
    2288 /**
    2289  * utf8字符串分隔为unicode字符串
    2290  * @param string $str 要转换的字符串
    2291  * @param string $pre
    2292  * @return string
    2293  */
    2294 function segmentToUnicode($str,$pre = '')
    2295 {
    2296     $arr = array();
    2297     $str_len = mb_strlen($str,'UTF-8');
    2298     for($i = 0;$i < $str_len;$i++)
    2299     {
    2300         $s = mb_substr($str,$i,1,'UTF-8');
    2301         if($s != ' ' && $s != ' ')
    2302         {
    2303             $arr[] = $pre.'ux'.utf8ToUnicode($s);
    2304         }
    2305     }
    2306 
    2307     $arr = array_unique($arr);
    2308 
    2309     return implode(' ',$arr);
    2310 }
    2311 
    2312 /**
    2313  * 将标签数组转换为unicode字符串
    2314  * @param array $tags 要转换的标签
    2315  * @param string $pre
    2316  * @return string
    2317  */
    2318 function tagToUnicode($tags,$pre = '')
    2319 {
    2320     $tags = array_unique($tags);
    2321 
    2322     $arr = array();
    2323     foreach($tags as $tag)
    2324     {
    2325         $tmp = '';
    2326         $str_len = mb_strlen($tag,'UTF-8');
    2327         for($i = 0;$i < $str_len;$i++)
    2328         {
    2329             $s = mb_substr($tag,$i,1,'UTF-8');
    2330             if($s != ' ' && $s != ' ')
    2331             {
    2332                 $tmp.= 'ux'.utf8ToUnicode($s);
    2333             }
    2334         }
    2335 
    2336         if($tmp != '')
    2337             $arr[] = $pre.$tmp;
    2338     }
    2339 
    2340     $arr = array_unique($arr);
    2341     return implode(' ',$arr);
    2342 }
    2343 
    2344 /**
    2345  * 清除符号
    2346  * @param string $str 要清除符号的字符串
    2347  * @return string
    2348  */
    2349 function clearSymbol($str)
    2350 {
    2351     static $symbols = NULL;
    2352     if($symbols === NULL)
    2353     {
    2354         $symbols = file_get_contents(PUBLIC_ROOT.'./table/symbol.table');
    2355         $symbols = explode("\r\n",$symbols);
    2356     }
    2357 
    2358     return str_replace($symbols,"",$str);
    2359 }
    2360 
    2361 /**
    2362  * 对 MYSQL LIKE 的内容进行转义
    2363  *
    2364  * @access      public
    2365  * @param       string      string  内容
    2366  * @return      string
    2367  */
    2368 function fMysqlLikeQuote($str)
    2369 {
    2370     return strtr($str, array("\\\\" => "\\\\\\\\", '_' => '\_', '%' => '\%', "\'" => "\\\\\'"));
    2371 }
    2372 
    2373 /**
    2374  * 页面跳转
    2375  * @param string $string
    2376  * @param bool $replace
    2377  * @param int $http_response_code
    2378  * @return void
    2379  */
    2380 function fHeader($string, $replace = true, $http_response_code = 0)
    2381 {
    2382     global $_FANWE;
    2383     
    2384     $string = str_replace(array("\r", "\n"), array('', ''), $string);
    2385     $reg = '/location:\s?'.preg_quote($_FANWE['site_root'], '/').'/i';
    2386     $string = preg_replace($reg,'Location: '.$_FANWE['site_url'], $string);
    2387     
    2388     if(strpos($string,$_FANWE['site_url']))
    2389     {
    2390         fSetCookie('from_heade',authcode(TIME_UTC,'ENCODE'));
    2391     }
    2392     
    2393     if(empty($http_response_code) || PHP_VERSION < '4.3' )
    2394     {
    2395         @header($string, $replace);
    2396     }
    2397     else
    2398     {
    2399         @header($string, $replace, $http_response_code);
    2400     }
    2401 
    2402     if(preg_match('/^\s*location:/is', $string))
    2403     {
    2404         exit();
    2405     }
    2406 }
    2407 
    2408 /**
    2409  * 显示指定名称的广告位布局
    2410  * @param string $id 布局编号
    2411  * @param int $count 显示数量
    2412  * @param string $target 关键字
    2413  * @return array
    2414  */
    2415 function getAdvLayout($id,$count = '',$target='')
    2416 {
    2417     global $_FANWE;
    2418     $layout = FDB::fetchFirst('SELECT rec_id AS pid,item_limit AS acount,target_id AS target FROM '.FDB::table('layout')." WHERE layout_id ='$id' AND tmpl = '".$_FANWE['setting']['site_tmpl']."' AND rec_module = 'AdvPosition'");
    2419 
    2420     if(!$layout)
    2421         return '';
    2422 
    2423     if($count != '')
    2424         $layout['acount'] = intval($count);
    2425 
    2426     if($target != '')
    2427         $layout['target'] = explode(',',$target);
    2428 
    2429     return getAdvPosition($layout['pid'],$layout['acount'],$layout['target']);
    2430 }
    2431 
    2432 /**
    2433  * 显示指定ID的广告位ID
    2434  * @param string $id 广告位
    2435  * @param int $count 显示数量
    2436  * @param string $target 关键字
    2437  * @return array
    2438  */
    2439 function getAdvPosition($id,$count = '',$target='')
    2440 {
    2441     global $_FANWE;
    2442     
    2443     if(is_numeric($id))
    2444         $ap = FDB::fetchFirst('SELECT * FROM '.FDB::table('adv_position').' WHERE id ='.$id);
    2445     else
    2446         $ap = FDB::fetchFirst('SELECT * FROM '.FDB::table('adv_position')." WHERE code ='".$id."'");
    2447     
    2448     if(!$ap)
    2449         return '';
    2450 
    2451     if($target != '')
    2452         $target = explode(',',$target);
    2453 
    2454     $where = "status = 1 AND position_id = '".$ap['id']."'";
    2455     if($target != '')
    2456         $where .= ' AND target_key'.FDB::createIN($target);
    2457 
    2458     $sql = 'SELECT * FROM '.FDB::table('adv').' WHERE '.$where.' ORDER BY sort ASC,id DESC';
    2459 
    2460     if($count > 0)
    2461         $sql .= ' LIMIT 0,'.$count;
    2462 
    2463     $adv_res = FDB::query($sql);
    2464 
    2465     $adv_list = array();
    2466 
    2467     while($adv = FDB::fetch($adv_res))
    2468     {
    2469         $adv['html'] = getAdvHTML($adv,$ap);
    2470         $adv['durl'] = FU("adv/show",array("id"=>$adv['id']));
    2471         $adv['turl'] = $adv['url'];
    2472         $adv['url'] = urlencode(FU("adv/show",array("id"=>$adv['id'])));
    2473         $adv_list[] = $adv;
    2474     }
    2475 
    2476     $ap['adv_list'] = $adv_list;
    2477     return $ap;
    2478 }
    2479 
    2480 /**
    2481  * 获取广告的html代码
    2482  * @param array $adv 广告
    2483  * @param array $ap 广告位
    2484  * @return string
    2485  */
    2486 function getAdvHTML($adv,$ap)
    2487 {
    2488     if($ap['width'] == 0)
    2489         $ap['width']="";
    2490     else
    2491         $ap['width']=" width='".$ap['width']."'";
    2492 
    2493     if($ap['height'] == 0)
    2494         $ap['height']="";
    2495     else
    2496         $ap['height']=" height='".$ap['height']."'";
    2497 
    2498     switch($adv['type'])
    2499     {
    2500         case '1':
    2501             if($adv['url']=='')
    2502                 $adv_str = "<img src='".$adv['code']."'".$ap['width'].$ap['height']."/>";
    2503             else
    2504                 $adv_str = "<a href='".FU("adv/show",array("id"=>$adv['id']))."' target='_blank'><img src='".$adv['code']."'".$ap['width'].$ap['height']."/></a>";
    2505             break;
    2506         case '2':
    2507             $adv_str = "<object classid='clsid:D27CDB6E-AE6D-11cf-96B8-444553540000' codebase='http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,19,0'".$ap['width'].$ap['height'].">".
    2508                        "<param name='movie' value='".$adv['code']."' />".
    2509                        "<param name='quality' value='high' />".
    2510                        "<param name='menu' value='false' />".
    2511                        "<embed src='".$adv['code']."' quality='high' pluginspage='http://www.macromedia.com/go/getflashplayer' type='application/x-shockwave-flash'".$ap['width'].$ap['height']."></embed>".
    2512                        "</object>";
    2513             break;
    2514         case '3':
    2515             $adv_str = $adv['code'];
    2516             break;
    2517     }
    2518 
    2519     return $adv_str;
    2520 }
    2521 
    2522 /**
    2523  * 写入文件内容
    2524  * @param string $filepat 文件路径
    2525  * @param string $content 写入内容
    2526  * @param string $type 写入方式 w:将文件指针指向文件头并将文件大小截为零 a:将文件指针指向文件末尾
    2527  * @return string
    2528  */
    2529 function writeFile($filepath,$content,$type='w')
    2530 {
    2531     $is_success = false;
    2532 
    2533     if($fp = fopen($filepath,$type))
    2534     {
    2535         /*$start_time = microtime();
    2536         do
    2537         {
    2538             $is_write = flock($fp, LOCK_EX);
    2539             if(!$is_write)
    2540                 usleep(round(rand(0,100) * 1000));
    2541         }
    2542         while(!$is_write && ((microtime() - $start_time) < 10000));
    2543 
    2544         if ($is_write && fwrite($fp, $content))
    2545               $is_success = true;*/
    2546         @flock($fp, LOCK_EX);
    2547         if (fwrite($fp, $content))
    2548               $is_success = true;
    2549         @flock($fp,LOCK_UN);
    2550         @fclose($fp);
    2551         @chmod($filepath, 0777);
    2552     }
    2553 
    2554     return $is_success;
    2555 }
    2556 
    2557 /**
    2558  * 删除文件
    2559  * @param string $filepat 文件路径
    2560  * @return bool
    2561  */
    2562 function removeFile($filepath)
    2563 {
    2564     $is_success = false;
    2565     /*do
    2566     {
    2567         @unlink($filepath);
    2568         $is_exists = file_exists($filepath);
    2569         if($is_exists)
    2570             usleep(round(rand(0,100) * 1000));
    2571         else
    2572             $is_success = true;
    2573     }
    2574     while($is_exists && ((microtime() - $start_time) < 10000));*/
    2575     @unlink($filepath);
    2576     if(!file_exists($filepath))
    2577         $is_success = true;
    2578     return $is_success;
    2579 }
    2580 
    2581 /**
    2582  * 获取缓存的数据
    2583  * @param string $key 缓存键名 如果有目录 格式为 目录1/目录2/.../键名
    2584  * @return mixed
    2585  */
    2586 function getCache($key)
    2587 {
    2588     static $caches = array();
    2589     if(!isset($caches[$key]))
    2590     {
    2591         if(!file_exists(PUBLIC_ROOT.'./data/caches/custom/'.$key.'.cache.php'))
    2592             return NULL;
    2593         else
    2594         {
    2595             include(PUBLIC_ROOT.'./data/caches/custom/'.$key.'.cache.php');
    2596             $list = explode('/',$key);
    2597             $key = end($list);
    2598             $cache_data = $data[$key];
    2599             
    2600             if((int)$cache_data['expired_time'] > 0 && TIMESTAMP > (int)$cache_data['expired_time'])
    2601                 return NULL;
    2602             
    2603             $time_clear = 0;
    2604             $clear_path = FANWE_ROOT.'./public/data/is_clear.lock';
    2605             if(file_exists($clear_path))
    2606                 $time_clear = (int)@file_get_contents($clear_path);
    2607 
    2608             if(($time_clear > 0 && $cache_data['time'] < $time_clear))
    2609                 return NULL;
    2610 
    2611             $caches[$key] = $cache_data['data'];
    2612         }
    2613     }
    2614     return $caches[$key];
    2615 }
    2616 
    2617 /**
    2618  * 设置缓存数据
    2619  * @param string $key 缓存键名 可设置所在目录 格式为 目录1/目录2/.../键名
    2620  * @param string $data 缓存的数据
    2621  * @param string $expired_time 有效时长(秒),0 为不过期
    2622  * @return bool
    2623  */
    2624 function setCache($key,$data,$expired_time = 0)
    2625 {
    2626     $cache_path = PUBLIC_ROOT.'./data/caches/custom/'.$key.'.cache.php';
    2627     $phth = dirname($cache_path);
    2628     makeDir($phth);
    2629     $list = explode('/',$key);
    2630     $key = end($list);
    2631     
    2632     $cache_data = array();
    2633     $cache_data['time'] = TIMESTAMP;
    2634     $cache_data['expired_time'] = 0;
    2635     if($expired_time > 0)
    2636         $cache_data['expired_time'] = TIMESTAMP + $expired_time;
    2637     $cache_data['data'] = $data;
    2638     
    2639     $cache_content = var_export($cache_data, true);
    2640     if(strpos($cache_content,'SimpleXMLElement') !== FALSE)
    2641         return;
    2642     
    2643     $cache_data = "<?php\n".'$data[\''.$key."'] = ".$cache_content.";\n\n?>";
    2644     return writeFile($cache_path,$cache_data);
    2645 }
    2646 
    2647 /**
    2648  * 生成临时缓存 (2小时后清除)
    2649  */
    2650 function setTempCache($key,$data)
    2651 {
    2652     $dir = './public/upload/temp/'.fToDate(NULL,'Y/m/d/H');
    2653     if(empty($key))
    2654         $key = md5(microtime(true)).random('6');
    2655     $file_name = $key.'.cache.php';
    2656     makeDir(FANWE_ROOT.$dir);
    2657     $cache_path = FANWE_ROOT.$dir."/".$file_name;
    2658     $cache_content = var_export($data, true);
    2659     $cache_data = "<?php\n".'return'." ".$cache_content.";\n?>";
    2660     writeFile($cache_path,$cache_data);
    2661     return $dir."/".$file_name;
    2662 }
    2663 
    2664 /**
    2665  * 获取临时缓存 (当前小时内)
    2666  */
    2667 function getTempCache($key)
    2668 {
    2669     $dir = './public/upload/temp/'.fToDate(NULL,'Y/m/d/H');
    2670     $cache_path = FANWE_ROOT.$dir."/".$key.'.cache.php';
    2671     if(!file_exists($cache_path))
    2672         return NULL;
    2673             
    2674     $data = @include $cache_path;
    2675     return $data;
    2676 }
    2677 
    2678 /**
    2679  * 删除缓存
    2680  * @param string $key 缓存键名 如果有目录 格式为 目录1/目录2/.../键名
    2681  * @return bool
    2682  */
    2683 function deleteCache($key)
    2684 {
    2685     return removeFile(PUBLIC_ROOT.'./data/caches/custom/'.$key.'.cache.php');
    2686 }
    2687 
    2688 /**
    2689  * 清空缓存目录
    2690  * @param string $dir 缓存目录
    2691  * @return void
    2692  */
    2693 function clearCacheDir($dir)
    2694 {
    2695     clearDir(PUBLIC_ROOT.'./data/caches/custom/'.$dir,true);
    2696 }
    2697 
    2698 function avatar($img_id, $type = 'm',$is_full = false)
    2699 {
    2700     $img_id = (int)$img_id;
    2701     if($img_id == 0)
    2702     {
    2703         $src = '';
    2704         switch($type)
    2705         {
    2706             case 'm':
    2707                 $src = './public/upload/avatar/noavatar_middle.jpg';
    2708             break;
    2709             case 'b':
    2710                 $src = './public/upload/avatar/noavatar_big.jpg';
    2711             break;
    2712             default:
    2713                 $src = './public/upload/avatar/noavatar_small.jpg';
    2714             break;
    2715         }
    2716 
    2717         if($is_full)
    2718             return FS("Image")->getImageUrl($src,2);
    2719         else
    2720             return $src;
    2721     }
    2722     
    2723     static $avatars = array();
    2724     static $types = NULL;
    2725     if($types === NULL)
    2726     {
    2727         FS("Image")->getImageArgs($types,'avatar');
    2728         $types = $types['types'];
    2729     }
    2730 
    2731     $size = $types['s'];
    2732     if(array_key_exists($type,$types))
    2733         $size = $types[$type];
    2734     
    2735     return getImgById($img_id,$size,$size,1,$is_full);
    2736 }
    2737 
    2738 /**
    2739  * 根据图片原图地址。 获取规格图片的地址,如果没有该规则动态生成。
    2740  * by fzmatthew
    2741  */
    2742 function getImgName($img_url,$width=0,$height=0,$gen = 0,$is_full = false)
    2743 {
    2744     $img['src'] = $img_url;
    2745     return formatImage($img,$width,$height,$gen,$is_full);
    2746 }
    2747 
    2748 /**
    2749  * 根据图片编号。 获取规格图片的地址,如果没有返回动态生成路径。
    2750  * by fzmatthew
    2751  */
    2752 function getImgById($id,$width=0,$height=0,$gen = 0,$is_full = 0)
    2753 {
    2754     static $imgs = array();
    2755     if(!isset($imgs[$id]))
    2756     {
    2757         $imgs[$id] = FS("Image")->getImageById($id);
    2758     }
    2759     return formatImage($imgs[$id],$width,$height,$gen,$is_full);
    2760 }
    2761 
    2762 function formatImage($img,$width=0,$height=0,$gen = 0,$is_full = 0)
    2763 {
    2764     if(!$img)
    2765         return '';
    2766         
    2767     if(parseUrl($img['src']))
    2768         return $img['src'];
    2769         
    2770     global $_FANWE;
    2771     
    2772     if($width == 0 && $height == 0)
    2773     {
    2774         if($is_full)
    2775             $img_url = FS("Image")->getImageUrl($img['src'],2);
    2776         else
    2777             $img_url = $img['src'];
    2778         return $img_url;
    2779     }
    2780 
    2781     $img_url_arr[0] = substr($img['src'],0,-4);
    2782     $img_url_arr[1] = substr($img['src'],-3,3);
    2783     $img_url = $img_url_arr[0]."_".$width."x".$height.".".$img_url_arr[1];
    2784     if(strpos($img['src'],'./public/') === FALSE)
    2785     {
    2786         if(strpos($img['src'],'./upyun/') !== FALSE)
    2787         {
    2788             $img_url = $img['src'].'!'.$width."x".$height;
    2789             if($is_full)
    2790                 $img_url = str_replace('./upyun/',$_FANWE['UPYUN_SETTING']['url'].'/',$img_url);
    2791         }
    2792         else
    2793         {
    2794             $server = FS("Image")->getServerByUrl($img['src']);
    2795             if($server['url_rewrite'] == 1)
    2796             {
    2797                 if($is_full)
    2798                     $img_url = FS("Image")->getImageUrl($img_url,2);
    2799                 return $img_url;
    2800             }
    2801             
    2802             $img_url = $server['url'].'getimg.php?img='.str_replace('./'.$server['code'].'/','',$img_url)."&gen=".$gen;
    2803         }
    2804     }
    2805     else
    2806     {
    2807         if(!file_exists(FANWE_ROOT.$img_url))
    2808         {
    2809             $img_url = str_replace('./','',$img_url);
    2810             if($is_full)
    2811                 $img_url = $_FANWE['site_url']."getimg.php?img=".$img_url."&gen=".$gen;
    2812             else
    2813                 $img_url = $_FANWE['site_root']."getimg.php?img=".$img_url."&gen=".$gen;
    2814         }
    2815         elseif($is_full)
    2816             $img_url = FS("Image")->getImageUrl($img_url,2);
    2817     }
    2818     return $img_url;
    2819 }
    2820 
    2821 /**
    2822  *
    2823  * @param $origin_path 原始物理图片地址
    2824  * @param $path 存储的路径
    2825  * @param $file_name 保存的文件名
    2826  * @param $del_temp 是否删除临时文件
    2827  * @param $id 关联编号,将根据编号生成目录
    2828  *
    2829  * 返回 复制成功的信息,如为false则复制失败
    2830  * array(
    2831  *     'path'    =>    xxx  //物理路径
    2832  *  'url'    =>    xxx  //相对路径
    2833  * );
    2834  *
    2835  * by fzmatthew
    2836  */
    2837 function copyFile($origin_path, $path = 'share',$del_temp = true,$id = 0)
    2838 {
    2839     static $image = NULL;
    2840     if($image === NULL)
    2841     {
    2842         include_once fimport('class/image');
    2843         $image = new Image();
    2844     }
    2845     
    2846     if($path == 'temp')
    2847         $dir = './public/upload/temp/'.fToDate(NULL,'Y/m/d/H');
    2848     else
    2849     {
    2850         if($id > 0)
    2851             $dir = './public/upload/'.$path.'/'.getDirsById($id);
    2852         else
    2853             $dir = './public/upload/'.$path.'/'.fToDate(NULL,'Y/m/d');
    2854     }
    2855 
    2856     $file_name = md5(microtime(true)).random('6').'.jpg';
    2857     makeDir(FANWE_ROOT.$dir);
    2858     $file_path = FANWE_ROOT.$dir."/".$file_name;
    2859 
    2860     if(file_exists($origin_path) && @copy($origin_path,$file_path))
    2861     {
    2862         if($del_temp)
    2863             @unlink($origin_path);
    2864     }
    2865     else
    2866     {
    2867         $data = getUrlContent($origin_path);
    2868         if(!empty($data) && @file_put_contents($file_path,$data) > 0)
    2869         {
    2870             if($del_temp)
    2871                 @unlink($origin_path);
    2872         }
    2873         else
    2874             return false;
    2875     }
    2876 
    2877     $info  = $image->getImageInfo($file_path);
    2878     if($info['type'] != 'jpg' && $info['type'] != 'jpeg')
    2879     {
    2880         $file_name = md5(microtime(true)).random('6').'.jpg';
    2881         $file_path1 = FANWE_ROOT.$dir."/".$file_name;
    2882 
    2883         if(!$image->convertType($file_path,$file_path1))
    2884             return false;
    2885         else
    2886         {
    2887             @unlink($file_path);
    2888             $file_path = $file_path1;
    2889         }
    2890     }
    2891 
    2892     return array(
    2893         'path' => $file_path,
    2894         'url' => $dir."/".$file_name,
    2895         'width' => $info[0],
    2896         'height' => $info[1],
    2897     );
    2898 }
    2899 
    2900 /**
    2901  *
    2902  * @param $origin_path 原始物理图片地址
    2903  * @param array $sizes 缩略图大小信息 为空则取后台设置
    2904          可生成多个缩略图
    2905         数组 参数1 为宽度,
    2906              参数2为高度,
    2907              参数3为处理方式:0(缩放,默认),1(剪裁),
    2908              参数4为是否水印 默认为 0(不生成水印)
    2909          array(
    2910             array(300,300,0,0),
    2911             array(100,100,0,0),
    2912             ...
    2913         ),
    2914  * @param $path 存储的路径
    2915  * @param $file_name 保存的文件名
    2916  * @param $del_temp 是否删除临时文件
    2917  * @param $id 关联编号,将根据编号生成目录
    2918  *
    2919  * 返回 复制成功的信息,如为false则复制失败
    2920  * array(
    2921  *     'path'    =>    xxx  //物理路径
    2922  *  'url'    =>    xxx  //相对路径
    2923  * );
    2924  *
    2925  * by fzmatthew
    2926  */
    2927 function copyImage($origin_path,$sizes = array(),$path = 'photos', $del_temp = true,$id = 0)
    2928 {
    2929     global $_FANWE;
    2930     static $size_setting = NULL,$image = NULL;
    2931     if($image === NULL)
    2932     {
    2933         include_once fimport('class/image');
    2934         $image = new Image();
    2935     }
    2936 
    2937     if($path == 'temp')
    2938         $dir = './public/upload/temp/'.fToDate(NULL,'Y/m/d/H');
    2939     else
    2940     {
    2941         if($id > 0)
    2942             $dir = './public/upload/'.$path.'/'.getDirsById($id);
    2943         else
    2944             $dir = './public/upload/'.$path.'/'.fToDate(NULL,'Y/m/d');
    2945     }
    2946 
    2947     makeDir(FANWE_ROOT.$dir);
    2948 
    2949     $file_name = md5(microtime(true)).random('6').'.jpg';
    2950     $file_path = FANWE_ROOT.$dir."/".$file_name;
    2951 
    2952     $bln = false;
    2953     if(file_exists($origin_path) && @copy($origin_path,$file_path))
    2954         $bln = true;
    2955     else
    2956     {
    2957         $data = getUrlContent($origin_path);
    2958         if(!empty($data) && @file_put_contents($file_path,$data) > 0)
    2959             $bln = true;
    2960     }
    2961 
    2962     if($bln)
    2963     {
    2964         $info  = $image->getImageInfo($file_path);
    2965         if($info['type'] != 'jpg' && $info['type'] != 'jpeg')
    2966         {
    2967             $file_name = md5(microtime(true)).random('6').'.jpg';
    2968             $file_path1 = FANWE_ROOT.$dir."/".$file_name;
    2969 
    2970             if(!$image->convertType($file_path,$file_path1))
    2971                 return false;
    2972             else
    2973             {
    2974                 @unlink($file_path);
    2975                 $file_path = $file_path1;
    2976             }
    2977         }
    2978 
    2979         $water_image = $_FANWE['setting']['water_image'];
    2980         if(!empty($water_image))
    2981             $water_image = FANWE_ROOT.$water_image;
    2982         
    2983         $water_mark = intval($_FANWE['setting']['water_mark']);
    2984         $alpha = intval($_FANWE['setting']['water_alpha']);
    2985         $place = intval($_FANWE['setting']['water_position']);
    2986 
    2987         if($sizes !== false && empty($sizes))
    2988         {
    2989             if($size_setting === NULL)
    2990             {
    2991                 if(!isset($_FANWE['cache']['image_sizes']))
    2992                     FanweService::instance()->cache->loadCache('image_sizes');
    2993                 $size_setting = $_FANWE['cache']['image_sizes'];
    2994             }
    2995 
    2996             $sizes = $size_setting;
    2997         }
    2998         
    2999         if($sizes === false)
    3000             $sizes = array();
    3001 
    3002         foreach($sizes as $size)
    3003         {
    3004             if($size[0] > 0 || $size[1] > 0)
    3005             {
    3006                 $thumb_bln = false;
    3007                 $thumb_type = isset($size[2]) ? intval($size[2]) : 0;
    3008                 if($thumb = $image->thumb($file_path,$size[0],$size[1],$thumb_type))
    3009                 {
    3010                     if(isset($size[3]) && intval($size[3]) > 0)
    3011                         $image->water($thumb['path'],$water_image,$alpha, $place);
    3012                 }
    3013             }
    3014         }
    3015 
    3016         if($del_temp)
    3017             @unlink($origin_path);
    3018 
    3019         return array(
    3020             'path' => $file_path,
    3021             'url' => $dir."/".$file_name,
    3022             'width' => $info[0],
    3023             'height' => $info[1],
    3024         );
    3025     }
    3026     else
    3027         return false;
    3028 }
    3029 
    3030 //获取url的内容
    3031 function getUrlContent($url,$is_location = false,$referer = '')
    3032 {
    3033     $content = '';
    3034     if(!parseUrl($url))
    3035     {
    3036         $content = @file_get_contents($url);
    3037     }
    3038     else
    3039     {
    3040         if(function_exists('curl_init'))
    3041         {
    3042             $ch = curl_init();
    3043             curl_setopt($ch, CURLOPT_URL,$url);
    3044             curl_setopt($ch, CURLOPT_TIMEOUT,60);
    3045             if(!empty($referer))
    3046                 curl_setopt ($ch, CURLOPT_REFERER,$referer);
    3047             
    3048             curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.168 Safari/535.19");
    3049             if($is_location)
    3050             {
    3051                 curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    3052                 curl_setopt($ch, CURLOPT_MAXREDIRS,11);
    3053             }
    3054             curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    3055             $content = curl_exec($ch);
    3056             curl_close($ch);
    3057         }
    3058         else
    3059         {
    3060             $content = @file_get_contents($url);
    3061         }
    3062     }
    3063 
    3064     return $content;
    3065 }
    3066 
    3067 //获取图片大小
    3068 function getImageLength($url)
    3069 {
    3070     $size = 0;
    3071     if(parseUrl($url))
    3072     {
    3073         $ch = curl_init($url);
    3074         curl_setopt($ch, CURLOPT_TIMEOUT,3);
    3075         curl_setopt($ch, CURLOPT_HEADER, 1);
    3076         curl_setopt($ch, CURLOPT_NOBODY, 1);
    3077         curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    3078         $head = curl_exec($ch);
    3079         curl_close($ch);
    3080         preg_match("/Content-Length:\s*(\d+)\s/m",$head,$size);
    3081         if($size)
    3082             $size = floatval($size[1]);
    3083     }
    3084     else
    3085     {
    3086         if(strpos($url,FANWE_ROOT) === FALSE)
    3087             $url = FANWE_ROOT.$url;
    3088         $size = floatval(@filesize($url));
    3089     }
    3090     
    3091     if($size > 0)
    3092         $size = $size / 1024;
    3093     return $size;
    3094 }
    3095 
    3096 /**
    3097  * 搜索Club的分类
    3098  *
    3099  * @param 父类ID $pid
    3100  * @return 数组
    3101  */
    3102 
    3103 function getForumClass($pid = 0)
    3104 {
    3105     global $_FANWE;
    3106     FanweService::instance()->cache->loadCache('forums');
    3107     $list = $_FANWE['cache']['forums'];
    3108     if($pid > 0){
    3109         foreach($list as $k => $v)
    3110         {
    3111             if(intval($pid)==$v['fid'])
    3112                 return $v;
    3113         }
    3114     }
    3115     else {
    3116         return $list;
    3117     }
    3118 }
    3119 
    3120 function getAskClass($pid = 0)
    3121 {
    3122     global $_FANWE;
    3123     FanweService::instance()->cache->loadCache('asks');
    3124     $list = $_FANWE['cache']['asks'];
    3125     if($pid > 0){
    3126         foreach($list as $k => $v)
    3127         {
    3128             if(intval($pid)==$v['aid'])
    3129                 return $v;
    3130         }
    3131     }
    3132     else {
    3133         return $list;
    3134     }
    3135 }
    3136 /**
    3137  * 获取CDN链接
    3138  * @param string $url 链接
    3139  * @param string $type (image:图片,css:样式,js:脚本),为空则根据后缀获取
    3140  * @return string
    3141  */
    3142 
    3143 function getCDNUrl($url,$type='')
    3144 {
    3145     global $_FANWE;
    3146     static $img_exts = array('jpg', 'jpeg', 'png', 'bmp','gif','giff'),
    3147            $types = array('image','css','js');
    3148 
    3149     if(empty($type))
    3150     {
    3151         $ext = fileExt($url);
    3152         if(in_array($ext,$img_exts))
    3153             $type = 'image';
    3154         elseif($ext == 'css')
    3155             $type = 'css';
    3156         elseif($ext == 'js')
    3157             $type = 'js';
    3158     }
    3159 
    3160     $url_pre = $_FANWE['site_root'];
    3161     if(in_array($type,$types))
    3162     {
    3163         switch($type)
    3164         {
    3165             case 'image':
    3166                 if(!empty($_FANWE['config']['cdn']['image']))
    3167                     $url_pre = $_FANWE['config']['cdn']['image'];
    3168             break;
    3169 
    3170             case 'css':
    3171                 if(!empty($_FANWE['config']['cdn']['css']))
    3172                     $url_pre = $_FANWE['config']['cdn']['css'];
    3173             break;
    3174 
    3175             case 'js':
    3176                 if(!empty($_FANWE['config']['cdn']['js']))
    3177                     $url_pre = $_FANWE['config']['cdn']['js'];
    3178             break;
    3179         }
    3180     }
    3181 
    3182     return $url_pre.$url;
    3183 }
    3184 
    3185 /**
    3186  * 获取文件扩展名
    3187  * @return string
    3188  */
    3189 function fileExt($file)
    3190 {
    3191     return addslashes(strtolower(substr(strrchr($file, '.'), 1, 10)));
    3192 }
    3193 
    3194 function priceFormat($price)
    3195 {
    3196     return '¥'.number_format(round($price,2),2);
    3197 }
    3198 
    3199 /**
    3200  * 根据ID划分目录
    3201  * @return string
    3202  */
    3203 function getDirsById($id)
    3204 {
    3205     $id = sprintf("%011d", $id);
    3206     $dir1 = substr($id, 0, 3);
    3207     $dir2 = substr($id, 3, 3);
    3208     $dir3 = substr($id, 6, 3);
    3209     $dir4 = substr($id, -2);
    3210     return $dir1.'/'.$dir2.'/'.$dir3.'/'.$dir4;
    3211 }
    3212 
    3213 function cssParse($urls)
    3214 {
    3215     global $_FANWE;
    3216     if(!empty($urls))
    3217         $_FANWE['page_parses']['css'][] = $urls;
    3218     
    3219     if(is_array($urls))
    3220     {
    3221         $url = md5(implode(',',$urls));
    3222         $css_url = './public/data/tpl/css/'.$url.'.css';
    3223         $url_path = FANWE_ROOT.$css_url;
    3224         if(!file_exists($url_path))
    3225         {
    3226             $css_content = '';
    3227             foreach($urls as $url)
    3228             {
    3229                 $url = str_replace('./tpl/css/','./public/data/tpl/css/',$url);
    3230                 $css_content .= @file_get_contents(FANWE_ROOT.$url);
    3231             }
    3232             $css_content = preg_replace("/[\r\n]/",'',$css_content);
    3233             @file_put_contents($url_path,$css_content);
    3234         }
    3235 
    3236         return $css_url;
    3237     }
    3238     else
    3239     {
    3240         return $urls;
    3241     }
    3242 }
    3243 
    3244 function scriptParse($urls)
    3245 {
    3246     global $_FANWE;
    3247     if(!empty($urls))
    3248         $_FANWE['page_parses']['script'][] = $urls;
    3249     
    3250     if(is_array($urls))
    3251     {
    3252         $url = md5(implode(',',$urls));
    3253         $js_url = './public/data/tpl/js/'.$url.'.js';
    3254         $url_path = FANWE_ROOT.$js_url;
    3255         if(!file_exists($url_path))
    3256         {
    3257             $js_content = '';
    3258             foreach($urls as $url)
    3259             {
    3260                 $url = str_replace('./tpl/js/','./tpl/'.TMPL.'/js/',$url);
    3261                 $js_content .= @file_get_contents(FANWE_ROOT.$url)."\r\n";
    3262             }
    3263 
    3264             @file_put_contents($url_path,$js_content);
    3265         }
    3266 
    3267         return $js_url;
    3268     }
    3269     else
    3270     {
    3271         return $urls;
    3272     }
    3273 }
    3274 
    3275 /**
    3276  * 获取是否显示前台管理
    3277  * @return bool
    3278  */
    3279 function getIsManage($module)
    3280 {
    3281     global $_FANWE;
    3282     if($_FANWE['uid'] == 0)
    3283         return false;
    3284 
    3285     $module = strtolower($module);
    3286     if(isset($_FANWE['authoritys'][$module]))
    3287         return true;
    3288     else
    3289         return false;
    3290 }
    3291 
    3292 /**
    3293  * 检测是否具有指定的前台管理权限
    3294  * @return bool
    3295  */
    3296 function checkAuthority($module,$action)
    3297 {
    3298     global $_FANWE;
    3299     if($_FANWE['uid'] == 0)
    3300         return false;
    3301 
    3302     $module = strtolower($module);
    3303     $action = strtolower($action);
    3304 
    3305     if(isset($_FANWE['authoritys'][$module]) && isset($_FANWE['authoritys'][$module][$action]))
    3306         return true;
    3307     else
    3308         return false;
    3309     return true;
    3310 }
    3311 
    3312 /**
    3313  * 检测所管理的对像是否锁定,已锁定返回锁定数据array,未锁定返回false
    3314    如果锁定30分钟以上,还未解锁,将设为未锁定
    3315  * @return
    3316  */
    3317 function checkIsManageLock($module,$id)
    3318 {
    3319     global $_FANWE;
    3320     $module = strtolower($module);
    3321     $lock_file = PUBLIC_ROOT.'./manage/'.$module.'/'.$id.'.lock';
    3322     if(file_exists($lock_file))
    3323     {
    3324         include $lock_file;
    3325 
    3326         if(TIME_UTC - $lock['time'] > 1800)
    3327         {
    3328             removeFile($lock_file);
    3329             return false;
    3330         }
    3331         if($lock['uid'] == $_FANWE['uid'])
    3332             return false;
    3333         else
    3334             return $lock;
    3335     }
    3336     else
    3337         return false;
    3338 }
    3339 
    3340 /**
    3341  * 获取前台管理锁定
    3342  * @return void
    3343  */
    3344 function getManageLock($module,$id)
    3345 {
    3346     $module = strtolower($module);
    3347     $lock_file = PUBLIC_ROOT.'./manage/'.$module.'/'.$id.'.lock';
    3348     if(file_exists($lock_file))
    3349     {
    3350         include $lock_file;
    3351         return $lock;
    3352     }
    3353     else
    3354         return false;
    3355 }
    3356 
    3357 /**
    3358  * 创建前台管理锁定
    3359  * @return void
    3360  */
    3361 function createManageLock($module,$id)
    3362 {
    3363     global $_FANWE;
    3364     $module = strtolower($module);
    3365     $phth = PUBLIC_ROOT.'./manage/'.$module;
    3366     makeDir($phth);
    3367     $lock_file = $phth.'/'.$id.'.lock';
    3368     $data = array(
    3369         'uid'=>$_FANWE['uid'],
    3370         'user_name'=>$_FANWE['user_name'],
    3371         'time'=>TIME_UTC,
    3372     );
    3373     $data = "<?php\n".'$lock = '.var_export($data, true).";\n?>";
    3374     return writeFile($lock_file,$data);
    3375 }
    3376 
    3377 /**
    3378  * 删除前台管理锁定
    3379  * @return void
    3380  */
    3381 function deleteManageLock($module,$id)
    3382 {
    3383     $module = strtolower($module);
    3384     $lock_file = PUBLIC_ROOT.'./manage/'.$module.'/'.$id.'.lock';
    3385     removeFile($lock_file);
    3386 }
    3387 
    3388 /**
    3389  * 前台管理日志
    3390  * @return void
    3391  */
    3392 function createManageLog($module,$action,$id,$content = '')
    3393 {
    3394     global $_FANWE;
    3395 
    3396     $log = array(
    3397         'rec_id'=>$id,
    3398         'module'=>$module,
    3399         'action'=>$action,
    3400         'uid'=>$_FANWE['uid'],
    3401         'user_name'=>$_FANWE['user_name'],
    3402         'content'=>$content,
    3403         'create_time'=>TIME_UTC
    3404     );
    3405 
    3406     FDB::insert('manage_log',$log);
    3407 }
    3408 
    3409 /**
    3410  * 获取分享链接
    3411  * @return string
    3412  */
    3413 function getSnsLink($types,$title,$url,$content,$pic)
    3414 {
    3415     global $_FANWE;
    3416     $links = array();
    3417     $title = urlencode($title);
    3418     $content_url = urlencode($content.' '.$url);
    3419     $content = urlencode($content);
    3420     $url = urlencode($url);
    3421     $site_url = urlencode($_FANWE['site_url']);
    3422     $pic = empty($pic) ? $pic : urlencode($pic);
    3423     foreach($types as $type)
    3424     {
    3425         switch($type)
    3426         {
    3427             case 'kaixin':
    3428                 $links[$type] = "http://www.kaixin001.com/diary/write.php?classid=0&title=$title&content=$content_url";
    3429             break;
    3430             
    3431             case 'renren':
    3432                 $links[$type] = "http://share.renren.com/share/buttonshare.do?link=$url&title=$title";
    3433             break;
    3434             
    3435             case 'sina':
    3436                 $links[$type] = "http://v.t.sina.com.cn/share/share.php?sourceUrl=$site_url&content=utf8&url=$url&title=$content";
    3437                 if(!empty($pic))
    3438                     $links[$type] .= "&pic=$pic";
    3439             break;
    3440             
    3441             case 'tqq':
    3442                 $links[$type] = "http://v.t.qq.com/share/share.php?url=$url&title=$content";
    3443                 if(!empty($pic))
    3444                     $links[$type] .= "&pic=$pic";
    3445             break;
    3446             
    3447             case 'douban':
    3448                 $links[$type] = "http://www.douban.com/recommend/?url=$url&title=$title";
    3449             break;
    3450             
    3451             case 'qzone':
    3452                 $links[$type] = "http://sns.qzone.qq.com/cgi-bin/qzshare/cgi_qzshare_onekey?url=$url&title=$title&summary=$content";
    3453                 if(!empty($pic))
    3454                     $links[$type] .= "&pics=$pic";
    3455             break;
    3456             
    3457             case 'baidu':
    3458                 $links[$type] = "http://apps.hi.baidu.com/share/?url=$url&title=$title&content=$content";
    3459             break;
    3460         }
    3461     }
    3462     
    3463     return $links;
    3464 }
    3465 
    3466 function getLoginModule($class_name)
    3467 {
    3468     global $_FANWE;
    3469     if(!isset($_FANWE['cache']['logins']))
    3470         FanweService::instance()->cache->loadCache('logins');
    3471         
    3472     if(file_exists(FANWE_ROOT."login/".$class_name.".php"))
    3473     {
    3474         require_once FANWE_ROOT."login/".$class_name.".php";
    3475         if(class_exists($class_name))
    3476         {
    3477             $module = new $class_name;
    3478             return $module->getInfo();
    3479         }
    3480     }
    3481     else
    3482         return false;
    3483 }
    3484 
    3485 function getLoginModuleList()
    3486 {
    3487     global $_FANWE;
    3488     if(!isset($_FANWE['cache']['logins']))
    3489         FanweService::instance()->cache->loadCache('logins');
    3490     
    3491     $list = array();
    3492     foreach($_FANWE['cache']['logins'] as $class_name => $val)
    3493     {
    3494         if(file_exists(FANWE_ROOT."login/".$class_name.".php"))
    3495         {
    3496             require_once FANWE_ROOT."login/".$class_name.".php";
    3497             if(class_exists($class_name))
    3498             {
    3499                 $module = new $class_name;
    3500                 $list[$class_name] = $module->getInfo();
    3501             }
    3502         }
    3503     }
    3504     return $list;
    3505 }
    3506 
    3507 function deleteShareImg($img_path,$server_code = '')
    3508 {
    3509     if(empty($server_code))
    3510     {
    3511         $img_path = FANWE_ROOT.str_replace('./','',$img_path);
    3512         $paths = pathinfo($img_path);
    3513         @unlink($img_path);
    3514         $old_img = explode('.',$img_path);
    3515         $old_img = $old_img[0];
    3516         if($dirhandle = opendir($paths['dirname']))
    3517         {
    3518             while(($file = readdir($dirhandle)) !== FALSE)
    3519             {
    3520                 if(($file!=".") && ($file!=".."))
    3521                 {
    3522                     $filename = $paths['dirname'].'/'.$file;
    3523                     if(strpos($filename,$old_img) !== FALSE)
    3524                     {
    3525                         @unlink($filename);
    3526                     }
    3527                 }
    3528             }
    3529             @closedir($dirhandle);
    3530         }
    3531     }
    3532     else
    3533     {
    3534         $server = FS("Image")->getServer($server_code);
    3535         if($server)
    3536         {
    3537             $args = array();
    3538             $args['img_path'] = $img_path;
    3539             $server = FS("Image")->getImageUrlToken($args,$server,1);
    3540             FS("Image")->sendRequest($server,'deleteshareimg');
    3541         }
    3542     }
    3543 }
    3544 
    3545 function deleteImg($img_path,$server_code = '')
    3546 {
    3547     if(empty($server_code))
    3548     {
    3549         $img_path = FANWE_ROOT.str_replace('./','',$img_path);
    3550         @unlink($img_path);
    3551     }
    3552     else
    3553     {
    3554         $server = FS("Image")->getServer($server_code);
    3555         if($server)
    3556         {
    3557             $args = array();
    3558             $args['img_path'] = $img_path;
    3559             $server = FS("Image")->getImageUrlToken($args,$server,1);
    3560             FS("Image")->sendRequest($server,'deleteimg');
    3561         }
    3562     }
    3563 }
    3564 
    3565 /**
    3566  * 清除当前2小时以前的临时图片
    3567  * @param string $dir 目录路径
    3568  * @return void
    3569  */
    3570 function clearTempImage($path = '')
    3571 {
    3572     global $_FANWE;
    3573     if($path == '')
    3574         $_FANWE['clear_image_count'] = 0;
    3575 
    3576     $max_time = mktime(date('H')-2,0,0,date('m'),date('d'),date('Y')) - date('Z');
    3577     $basepath = FANWE_ROOT.'public/upload/temp/';
    3578     $paths = array();
    3579     if($path != '')
    3580     {
    3581         $currentpath = str_replace($basepath,'',$path);
    3582         $paths = explode('/',$currentpath);
    3583         $year = (int)$paths[0];
    3584         $month = isset($paths[1]) ? (int)$paths[1] : 1;
    3585         $day = isset($paths[2]) ? (int)$paths[2] : 1;
    3586         $hours = isset($paths[3]) ? (int)$paths[3] : 0;
    3587         $day_time = mktime($hours,0,0,$month,$day,$year) - date('Z');
    3588         if($max_time <= $day_time)
    3589             return;
    3590 
    3591         $currentpath .= '/';
    3592     }
    3593     else
    3594         $currentpath = '';
    3595 
    3596     $dir = $basepath.$currentpath;
    3597     $directory = @dir($dir);
    3598     if(!$directory)
    3599         return;
    3600     
    3601     while($entry = @$directory->read())
    3602     {
    3603         if($_FANWE['clear_image_count'] >= 50)
    3604             break;
    3605 
    3606         if($entry != '.' && $entry != '..')
    3607         {
    3608             $filename = $dir.$entry;
    3609             if(is_dir($filename))
    3610             {
    3611                 clearTempImage($filename);
    3612                 @rmdir($filename);
    3613             }
    3614 
    3615             if(is_file($filename))
    3616             {
    3617                 removeFile($filename);
    3618                 $_FANWE['clear_image_count']++;
    3619             }
    3620         }
    3621     }
    3622     $directory->close();
    3623 }
    3624 
    3625 function setTimeLimit($time = 0)
    3626 {
    3627     $time = (int)$time;
    3628     @set_time_limit($time);
    3629     if(function_exists('ini_set'))
    3630         ini_set('max_execution_time',$time);
    3631 }
    3632 
    3633 function formatPageSeo()
    3634 {
    3635     global $_FANWE;
    3636     $module = strtolower(MODULE_NAME);
    3637     $action = ACTION_NAME;
    3638     
    3639     $seo_title = (empty($_FANWE['nav_title']) ? '' :  $_FANWE['nav_title']. '-') . $_FANWE['setting']['site_title'];
    3640     $seo_keywords = $_FANWE['seo_keywords'].$_FANWE['setting']['site_keywords'];
    3641     $seo_description = $_FANWE['seo_description'].$_FANWE['setting']['site_description'];
    3642     
    3643     if($module == 'note')
    3644         $action = 'all';
    3645     
    3646     $seos_cache = $_FANWE['cache']['seos'];
    3647     
    3648     if(isset($seos_cache[$module]) && (isset($seos_cache[$module][$action]) || isset($seos_cache[$module]['all'])))
    3649     {
    3650         $seos = array();
    3651         $seos['GLOBAL_NAME'] = $_FANWE['setting']['site_name'];
    3652         $seos['GLOBAL_TITLE'] = $_FANWE['setting']['site_title'];
    3653         $seos['GLOBAL_KEYWORDS'] = $_FANWE['setting']['site_keywords'];
    3654         $seos['GLOBAL_DESCRIPTION'] = $_FANWE['setting']['site_description'];
    3655         
    3656         if(isset($_FANWE['PAGE_SEO_SELF']))
    3657         {
    3658             foreach($_FANWE['PAGE_SEO_SELF'] as $name => $val)
    3659             {
    3660                 if(!is_array($val))
    3661                     $seos[strtoupper($name)] = $val;
    3662             }
    3663         }
    3664         else
    3665         {
    3666             $_FANWE['PAGE_SEO_SELF'] = array();
    3667         }
    3668         
    3669         if(isset($seos_cache[$module]['all']))
    3670             $action = 'all';
    3671         
    3672         foreach($seos_cache[$module][$action]['seo']['title'] as $item)
    3673         {
    3674             $title_rule = $item;
    3675             $bln = true;
    3676             foreach($item['args'] as $arg)
    3677             {
    3678                 if(!isset($seos[$arg]) || empty($seos[$arg]))
    3679                 {
    3680                     $bln = false;
    3681                     break;
    3682                 }
    3683             }
    3684             
    3685             if($bln)
    3686                 break;
    3687         }
    3688         $seo_title = $title_rule['content'];
    3689         $search = array();
    3690         $replace = array();
    3691         foreach($title_rule['args'] as $arg)
    3692         {
    3693             $search[] = '{'.$arg.'}';
    3694             $replace[] = $seos[$arg];
    3695         }
    3696         $seo_title = str_replace($search,$replace,$seo_title);
    3697         
    3698         foreach($seos_cache[$module][$action]['seo']['keywords'] as $item)
    3699         {
    3700             $keywords_rule = $item;
    3701             $bln = true;
    3702             foreach($item['args'] as $arg)
    3703             {
    3704                 if(!isset($seos[$arg]) || empty($seos[$arg]))
    3705                 {
    3706                     $bln = false;
    3707                     break;
    3708                 }
    3709             }
    3710             
    3711             if($bln)
    3712                 break;
    3713         }
    3714         $seo_keywords = $keywords_rule['content'];
    3715         $search = array();
    3716         $replace = array();
    3717         foreach($keywords_rule['args'] as $arg)
    3718         {
    3719             $search[] = '{'.$arg.'}';
    3720             $replace[] = $seos[$arg];
    3721         }
    3722         $seo_keywords = str_replace($search,$replace,$seo_keywords);
    3723         
    3724         foreach($seos_cache[$module][$action]['seo']['description'] as $item)
    3725         {
    3726             $description_rule = $item;
    3727             $bln = true;
    3728             foreach($item['args'] as $arg)
    3729             {
    3730                 if(!isset($seos[$arg]) || empty($seos[$arg]))
    3731                 {
    3732                     $bln = false;
    3733                     break;
    3734                 }
    3735             }
    3736             
    3737             if($bln)
    3738                 break;
    3739         }
    3740         $seo_description = $description_rule['content'];
    3741         $search = array();
    3742         $replace = array();
    3743         foreach($description_rule['args'] as $arg)
    3744         {
    3745             $search[] = '{'.$arg.'}';
    3746             $replace[] = $seos[$arg];
    3747         }
    3748         $seo_description = str_replace($search,$replace,$seo_description);
    3749     }
    3750     
    3751     return '<title>'.$seo_title.'</title>
    3752         <meta name="keywords" content="'.$seo_keywords.'" />
    3753         <meta name="description" content="'.$seo_description.'" />';
    3754 }
    3755 
    3756 function createAnchorTable()
    3757 {
    3758     $list = array();
    3759     $res = FDB::query('SELECT word,brief,url,target FROM '.FDB::table('anchor').' WHERE status = 1 ORDER BY word ASC');
    3760     while($data = FDB::fetch($res))
    3761     {
    3762         $temp = &$list;
    3763         $data['word'] = strtolower($data['word']);
    3764         $str_len = mb_strlen($data['word'],'UTF-8');
    3765         for ($i = 0; $i < $str_len; $i++)
    3766         {
    3767             $s = mb_substr($data['word'], $i, 1,'UTF-8');
    3768             if($s == ',')
    3769                 $s = ',';
    3770             
    3771             if(!isset($temp[$s]))
    3772                 $temp[$s] = array();
    3773             $temp = &$temp[$s];
    3774         }
    3775     
    3776         if(!isset($temp[',']))
    3777             $temp[','] = array('desc'=>$data['brief'],'url'=>$data['url'],'target'=>$data['target']);
    3778     }
    3779     
    3780     foreach($list as $item => $val)
    3781     {
    3782         @file_put_contents(FANWE_ROOT.'public/table/anchor/'.urlencode($item).'.table','<?php '."\nreturn ".(string)var_export($val,true).";\n".'?>');
    3783     }
    3784 }
    3785 
    3786 function formatAnchorLink($content,$length)
    3787 {
    3788     if(empty($content))
    3789         return '';
    3790     
    3791     $length = (int)$length;
    3792     if($length > 0)
    3793         $content = cutStr($content,$length);
    3794     
    3795     preg_match_all("/@([^\f\n\r\t\v@<> ]{2,20}?)(?:\:| )/",$content,$users);
    3796     if(!empty($users[1]))
    3797     {
    3798         $patterns = array();
    3799         $replace = array();
    3800         $users = array_unique($users[1]);
    3801         $arr = array();
    3802         foreach($users as $user)
    3803         {
    3804             if(!empty($user))
    3805             {
    3806                 $arr[] = addslashes($user);
    3807             }
    3808         }
    3809 
    3810         $res = FDB::query('SELECT uid,user_name
    3811             FROM '.FDB::table('user').'
    3812             WHERE user_name '.FDB::createIN($arr));
    3813         while($data = FDB::fetch($res))
    3814         {
    3815             $patterns[] = '/@'.preg_quote($data['user_name']).'(\:| )/';
    3816             $replace[] = '<a class="u_name GUID" uid="'.$data['uid'].'" href="'.FU('u/index',array('uid'=>$data['uid'])).'">&#64;'.$data['user_name']."</a>\$1";
    3817         }
    3818         $content = preg_replace($patterns,$replace,$content);
    3819     }
    3820     
    3821     preg_match_all("/#([^\f\n\r\t\v]{1,80}?)#/",$content,$events);
    3822     if(!empty($events[1]))
    3823     {
    3824         $patterns = array();
    3825         $replace = array();
    3826         $events = array_unique($events[1]);
    3827         $arr = array();
    3828         foreach($events as $event)
    3829         {
    3830             if(!empty($event))
    3831             {
    3832                 if(substr($event,0,3) != '64;')
    3833                     $arr[] = addslashes($event);
    3834             }
    3835         }
    3836 
    3837         $res = FDB::query('SELECT id,title
    3838             FROM '.FDB::table('event').'
    3839             WHERE title '.FDB::createIN($arr));
    3840         while($data = FDB::fetch($res))
    3841         {
    3842             $patterns[] = '#'.$data['title'].'#';
    3843             $replace[] = '<a href="'.FU("event/detail",array("id"=>$data['id'])).'" target="_blank">&#35;'.$data['title'].'&#35;</a>';
    3844         }
    3845 
    3846         $content = str_replace($patterns,$replace,$content);
    3847     }
    3848     
    3849     $patterns = array();
    3850     $replace = array();
    3851     preg_match_all("/<(.+?)\s.+?>(.+?)<\/\\1>/",$content,$htmls);
    3852     if(!empty($htmls[0]))
    3853     {
    3854         $htmls = array_unique($htmls[0]);
    3855         foreach($htmls as $html)
    3856         {
    3857             $patterns[] = md5($html,true);
    3858             $replace[] = $html;
    3859         }
    3860     }
    3861     
    3862     $content = str_replace(' ',' ',$content);
    3863     $content = str_replace($replace,$patterns,$content);
    3864     $strlen = mb_strlen($content, 'UTF-8');
    3865     
    3866     $newcontent = '';
    3867     $index = 0;
    3868     $bln = true;
    3869     while($bln)
    3870     {
    3871         $char = mb_substr($content,$index,1,'UTF-8');
    3872         $char1 = strtolower($char);
    3873         if($char1 == ',')
    3874             $char1 = ',';
    3875         
    3876         if(file_exists(FANWE_ROOT.'public/table/anchor/'.urlencode($char1).'.table'))
    3877         {
    3878             $charindex = $index + 1;
    3879             $words = include FANWE_ROOT.'public/table/anchor/'.urlencode($char1).'.table';
    3880             $wbln = true;
    3881             $temp = &$words;
    3882             $word = $char;
    3883             $anchor = NULL;
    3884             if(isset($words[',']))
    3885                 $anchor = $words[','];
    3886             
    3887             while($wbln)
    3888             {
    3889                 $char = mb_substr($content,$charindex,1,'UTF-8');
    3890                 $char1 = strtolower($char);
    3891                 if(isset($temp[$char1]))
    3892                 {
    3893                     $word .= $char;
    3894                     if(isset($temp[$char1][',']))
    3895                         $anchor = $temp[$char1][','];
    3896                     
    3897                     $temp = &$temp[$char1];
    3898                     $charindex++;
    3899                 }
    3900                 else
    3901                     $wbln = false;
    3902             }
    3903             
    3904             if($anchor !== NULL)
    3905                 $word = '<a href="'.$anchor['url'].'" title="'.$anchor['desc'].'" target="'.$anchor['target'].'">'.$word.'</a>';
    3906             
    3907             $newcontent .= $word;
    3908             $index = $charindex;
    3909         }
    3910         else
    3911         {
    3912             $newcontent .= $char;
    3913             $index++;
    3914         }
    3915         
    3916         if($index >= $strlen)
    3917             $bln = false; 
    3918     }
    3919     return str_replace($patterns,$replace,$newcontent);
    3920 }
    3921 ?>
  • 相关阅读:
    An AODV Tutorial
    MFC去掉单文档的"无标题-"的方法
    win32 openss 编译
    ASP.NET实现RENREN SIG计算
    std::string str.c_str() const
    fopen
    curl with ssl support for win32
    VC++ utf8 Unicode GB2312 编码转换
    编码转换
    VirtualBox uuid冲突问题
  • 原文地址:https://www.cnblogs.com/wangtongphp/p/2999634.html
Copyright © 2011-2022 走看看