方维二次开发

wangtongphp

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
   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 ?>

 

posted on 2013-04-04 17:55  方维二次开发  阅读(2702)  评论(0编辑  收藏  举报