首页
站长论坛BBS
救助
投稿
discuz视频教程
discuz技术支持
版块
登录
快速注册

function_forum.php论坛模块通用函数集合分析

ARCHY 2015-6-14 [Discuz开发] 来自PC 复制链接
17493
discuz使用视频教程
31idc

马上注册,一起探讨正确快速的建站方法

您需要 登录 才可以下载或查看,没有帐号?快速注册

x
discuz X3/source/function/function_forum.php论坛模块通用函数集合分析
  1. <?php
  2. if(!defined('IN_DISCUZ')) {
  3.         exit('Access Denied');
  4. }

  5. /**
  6. *
  7. * @param $uid - 用户ID
  8. * @param $size - 头像大小 small/middle/big
  9. * @param $returnsrc - 是否返回头像地址
  10. */
  11. function discuz_uc_avatar($uid, $size = '', $returnsrc = FALSE) {
  12.         global $_G;
  13.         return avatar($uid, $size, $returnsrc, FALSE, $_G['setting']['avatarmethod'], $_G['setting']['ucenterurl']);
  14. }

  15. /**
  16. * 论坛附件删除
  17. * @param $attach - 单一附件数据
  18. */
  19. function dunlink($attach) {
  20.         global $_G;
  21.         $filename = $attach['attachment'];
  22.         $havethumb = $attach['thumb'];
  23.         $remote = $attach['remote'];
  24.         if($remote) {
  25.                 ftpcmd('delete', $_G['setting']['ftp']['attachdir'].'/forum/'.$filename);
  26.                 $havethumb && ftpcmd('delete', $_G['setting']['ftp']['attachdir'].'/forum/'.getimgthumbname($filename));
  27.         } else {
  28.                 @unlink($_G['setting']['attachdir'].'/forum/'.$filename);
  29.                 $havethumb && @unlink($_G['setting']['attachdir'].'/forum/'.getimgthumbname($filename));
  30.         }
  31.         if($attach['aid']) {
  32.                 @unlink($_G['setting']['attachdir'].'image/'.$attach['aid'].'_140_140.jpg');
  33.         }
  34. }

  35. /**
  36. 权限表达式
  37. * @param $formula - 权限表达式
  38. */
  39. function formulaperm($formula) {
  40.         global $_G;

  41.         $formula = unserialize($formula);
  42.         $medalperm = $formula['medal'];
  43.         $permusers = $formula['users'];
  44.         $permmessage = $formula['message'];
  45.         if($_G['setting']['medalstatus'] && $medalperm) {
  46.                 $exists = 1;
  47.                 $_G['forum_formulamessage'] = '';
  48.                 $medalpermc = $medalperm;
  49.                 if($_G['uid']) {
  50.                         $medals = explode("\t", DB::result_first("SELECT medals FROM ".DB::table('common_member_field_forum')." WHERE uid='$_G[uid]'"));
  51.                         foreach($medalperm as $k => $medal) {
  52.                                 foreach($medals as $r) {
  53.                                         list($medalid) = explode("|", $r);
  54.                                         if($medalid == $medal) {
  55.                                                 $exists = 0;
  56.                                                 unset($medalpermc[$k]);
  57.                                         }
  58.                                 }
  59.                         }
  60.                 } else {
  61.                         $exists = 0;
  62.                 }
  63.                 if($medalpermc) {
  64.                         loadcache('medals');
  65.                         foreach($medalpermc as $medal) {
  66.                                 if($_G['cache']['medals'][$medal]) {
  67.                                         $_G['forum_formulamessage'] .= '<img src="'.STATICURL.'image/common/'.$_G['cache']['medals'][$medal]['image'].'" style="vertical-align:middle;" /> '.$_G['cache']['medals'][$medal]['name'].'  ';
  68.                                 }
  69.                         }
  70.                         showmessage('forum_permforum_nomedal', NULL, array('forum_permforum_nomedal' => $_G['forum_formulamessage']), array('login' => 1));
  71.                 }
  72.         }
  73.         $formulatext = $formula[0];
  74.         $formula = $formula[1];
  75.         if($_G['adminid'] == 1 || $_G['forum']['ismoderator'] || in_array($_G['groupid'], explode("\t", $_G['forum']['spviewperm']))) {
  76.                 return FALSE;
  77.         }
  78.         if($permusers) {
  79.                 $permusers = str_replace(array("\r\n", "\r"), array("\n", "\n"), $permusers);
  80.                 $permusers = explode("\n", trim($permusers));
  81.                 if(!in_array($_G['member']['username'], $permusers)) {
  82.                         showmessage('forum_permforum_disallow', NULL, array(), array('login' => 1));
  83.                 }
  84.         }
  85.         if(!$formula) {
  86.                 return FALSE;
  87.         }
  88.         if(strexists($formula, '$memberformula[')) {
  89.                 preg_match_all("/\\\$memberformula\['(\w+?)'\]/", $formula, $a);
  90.                 $fields = $profilefields = array();
  91.                 $mfadd = array();
  92.                 foreach($a[1] as $field) {
  93.                         switch($field) {
  94.                                 case 'regdate':
  95.                                         $formula = preg_replace("/\{(\d{4})\-(\d{1,2})\-(\d{1,2})\}/e", "'\'\\1-'.sprintf('%02d', '\\2').'-'.sprintf('%02d', '\\3').'\''", $formula);
  96.                                 case 'regday':
  97.                                         $fields[] = 'm.regdate';break;
  98.                                 case 'regip':
  99.                                 case 'lastip':
  100.                                         $formula = preg_replace("/\{([\d\.]+?)\}/", "'\\1'", $formula);
  101.                                         $formula = preg_replace('/(\$memberformula\[\'(regip|lastip)\'\])\s*=+\s*\'([\d\.]+?)\'/', "strpos(\\1, '\\3')===0", $formula);
  102.                                 case 'buyercredit':
  103.                                 case 'sellercredit':
  104.                                         $mfadd['ms'] = " LEFT JOIN ".DB::table('common_member_status')." ms ON m.uid=ms.uid";
  105.                                         $fields[] = 'ms.'.$field;break;
  106.                                 case substr($field, 0, 5) == 'field':
  107.                                         $mfadd['mp'] = " LEFT JOIN ".DB::table('common_member_profile')." mp ON m.uid=mp.uid";
  108.                                         $fields[] = 'mp.field'.intval(substr($field, 5));
  109.                                         $profilefields[] = $field;break;
  110.                         }
  111.                 }
  112.                 $memberformula = array();
  113.                 if($_G['uid']) {
  114.                         $memberformula = DB::fetch_first("SELECT ".implode(',', $fields)." FROM ".DB::table('common_member')." m ".implode('', $mfadd)." WHERE m.uid='$_G[uid]'");
  115.                         if(in_array('regday', $a[1])) {
  116.                                 $memberformula['regday'] = intval((TIMESTAMP - $memberformula['regdate']) / 86400);
  117.                         }
  118.                         if(in_array('regdate', $a[1])) {
  119.                                 $memberformula['regdate'] = date('Y-m-d', $memberformula['regdate']);
  120.                         }
  121.                         $memberformula['lastip'] = $memberformula['lastip'] ? $memberformula['lastip'] : $_G['clientip'];
  122.                 } else {
  123.                         if(isset($memberformula['regip'])) {
  124.                                 $memberformula['regip'] = $_G['clientip'];
  125.                         }
  126.                         if(isset($memberformula['lastip'])) {
  127.                                 $memberformula['lastip'] = $_G['clientip'];
  128.                         }
  129.                 }
  130.         }
  131.         @eval("\$formulaperm = ($formula) ? TRUE : FALSE;");
  132.         if(!$formulaperm) {
  133.                 if(!$permmessage) {
  134.                         $language = lang('forum/misc');
  135.                         $search = array('regdate', 'regday', 'regip', 'lastip', 'buyercredit', 'sellercredit', 'digestposts', 'posts', 'threads', 'oltime');
  136.                         $replace = array($language['formulaperm_regdate'], $language['formulaperm_regday'], $language['formulaperm_regip'], $language['formulaperm_lastip'], $language['formulaperm_buyercredit'], $language['formulaperm_sellercredit'], $language['formulaperm_digestposts'], $language['formulaperm_posts'], $language['formulaperm_threads'], $language['formulaperm_oltime']);
  137.                         for($i = 1; $i <= 8; $i++) {
  138.                                 $search[] = 'extcredits'.$i;
  139.                                 $replace[] = $_G['setting']['extcredits'][$i]['title'] ? $_G['setting']['extcredits'][$i]['title'] : $language['formulaperm_extcredits'].$i;
  140.                         }
  141.                         if($profilefields) {
  142.                                 loadcache(array('fields_required', 'fields_optional'));
  143.                                 foreach($profilefields as $profilefield) {
  144.                                         $search[] = $profilefield;
  145.                                         $replace[] = !empty($_G['cache']['fields_optional']['field_'.$profilefield]) ? $_G['cache']['fields_optional']['field_'.$profilefield]['title'] : $_G['cache']['fields_required']['field_'.$profilefield]['title'];
  146.                                 }
  147.                         }
  148.                         $i = 0;$_G['forum_usermsg'] = '';
  149.                         foreach($search as $s) {
  150.                                 if(in_array($s, array('digestposts', 'posts', 'threads', 'oltime', 'extcredits1', 'extcredits2', 'extcredits3', 'extcredits4', 'extcredits5', 'extcredits6', 'extcredits7', 'extcredits8'))) {
  151.                                         $_G['forum_usermsg'] .= strexists($formulatext, $s) ? '<br />   '.$replace[$i].': '.(@eval('return intval(getuserprofile(\''.$s.'\'));')) : '';
  152.                                 } elseif(in_array($s, array('regdate', 'regip'))) {
  153.                                         $_G['forum_usermsg'] .= strexists($formulatext, $s) ? '<br />   '.$replace[$i].': '.(@eval('return $memberformula[\''.$s.'\'];')) : '';
  154.                                 }
  155.                                 $i++;
  156.                         }
  157.                         $search = array_merge($search, array('and', 'or', '>=', '<=', '=='));
  158.                         $replace = array_merge($replace, array('  <b>'.$language['formulaperm_and'].'</b>  ', '  <b>'.$language['formulaperm_or'].'</b>  ', '≥', '≤', '='));
  159.                         $_G['forum_formulamessage'] = str_replace($search, $replace, $formulatext);
  160.                 } else {
  161.                         $_G['forum_formulamessage'] = $permmessage;
  162.                 }

  163.                 if(!$permmessage) {
  164.                         showmessage('forum_permforum_nopermission', NULL, array('formulamessage' => $_G['forum_formulamessage'], 'usermsg' => $_G['forum_usermsg']), array('login' => 1));
  165.                 } else {
  166.                         showmessage('forum_permforum_nopermission_custommsg', NULL, array('formulamessage' => $_G['forum_formulamessage']), array('login' => 1));
  167.                 }
  168.         }
  169.         return TRUE;
  170. }

  171. /**
  172. 勋章权限表达式
  173. * @param $formula - 勋章权限表达式
  174. * @param $type - 1 权限验证 2 勋章字串
  175. */
  176. function medalformulaperm($formula, $type) {
  177.         global $_G;

  178.         $formula = unserialize($formula);
  179.         $permmessage = $formula['message'];
  180.         $formula = $formula['medal'];
  181.         if(!empty($formula['usergroupallow']) && is_array($formula['usergroups']) && !in_array($_G['groupid'], $formula['usergroups'])) {
  182.                 loadcache('usergroups');
  183.                 $message = array();
  184.                 foreach($formula['usergroups'] as $groupid) {
  185.                         $message[] = $_G['cache']['usergroups'][$groupid]['grouptitle'].' ';
  186.                 }
  187.                 $_G['forum_formulamessage'] = implode(', ', $message);
  188.                 $_G['forum_usermsg'] = $_G['cache']['usergroups'][$_G['groupid']]['grouptitle'];
  189.                 return FALSE;
  190.         }
  191.         $formulatext = $formula[0];
  192.         $formula = $formula[1];
  193.         if(!$formula) {
  194.                 return FALSE;
  195.         }
  196.         if(strexists($formula, '$memberformula[')) {
  197.                 preg_match_all("/\\\$memberformula\['(\w+?)'\]/", $formula, $a);
  198.                 $fields = $profilefields = array();
  199.                 $mfadd = array();
  200.                 foreach($a[1] as $field) {
  201.                         switch($field) {
  202.                                 case 'regdate':
  203.                                         $formula = preg_replace("/\{(\d{4})\-(\d{1,2})\-(\d{1,2})\}/e", "'\'\\1-'.sprintf('%02d', '\\2').'-'.sprintf('%02d', '\\3').'\''", $formula);
  204.                                 case 'regday':
  205.                                         $fields[] = 'm.regdate';break;
  206.                                 case 'regip':
  207.                                 case 'lastip':
  208.                                         $formula = preg_replace("/\{([\d\.]+?)\}/", "'\\1'", $formula);
  209.                                         $formula = preg_replace('/(\$memberformula\[\'(regip|lastip)\'\])\s*=+\s*\'([\d\.]+?)\'/', "strpos(\\1, '\\3')===0", $formula);
  210.                                 case 'buyercredit':
  211.                                 case 'sellercredit':
  212.                                         $mfadd['ms'] = " LEFT JOIN ".DB::table('common_member_status')." ms ON m.uid=ms.uid";
  213.                                         $fields[] = 'ms.'.$field;break;
  214.                                 case substr($field, 0, 5) == 'field':
  215.                                         $mfadd['mp'] = " LEFT JOIN ".DB::table('common_member_profile')." mp ON m.uid=mp.uid";
  216.                                         $fields[] = 'mp.field'.intval(substr($field, 5));
  217.                                         $profilefields[] = $field;break;
  218.                         }
  219.                 }
  220.                 $memberformula = array();
  221.                 if($_G['uid']) {
  222.                         $memberformula = DB::fetch_first("SELECT ".implode(',', $fields)." FROM ".DB::table('common_member')." m ".implode('', $mfadd)." WHERE m.uid='$_G[uid]'");
  223.                         if(in_array('regday', $a[1])) {
  224.                                 $memberformula['regday'] = intval((TIMESTAMP - $memberformula['regdate']) / 86400);
  225.                         }
  226.                         if(in_array('regdate', $a[1])) {
  227.                                 $memberformula['regdate'] = date('Y-m-d', $memberformula['regdate']);
  228.                         }
  229.                         $memberformula['lastip'] = $memberformula['lastip'] ? $memberformula['lastip'] : $_G['clientip'];
  230.                 } else {
  231.                         if(isset($memberformula['regip'])) {
  232.                                 $memberformula['regip'] = $_G['clientip'];
  233.                         }
  234.                         if(isset($memberformula['lastip'])) {
  235.                                 $memberformula['lastip'] = $_G['clientip'];
  236.                         }
  237.                 }
  238.         }
  239.         @eval("\$formulaperm = ($formula) ? TRUE : FALSE;");
  240.         if(!$formulaperm || $type == 2) {
  241.                 if(!$permmessage) {
  242.                         $language = lang('forum/misc');
  243.                         $search = array('regdate', 'regday', 'regip', 'lastip', 'buyercredit', 'sellercredit', 'digestposts', 'posts', 'threads', 'oltime');
  244.                         $replace = array($language['formulaperm_regdate'], $language['formulaperm_regday'], $language['formulaperm_regip'], $language['formulaperm_lastip'], $language['formulaperm_buyercredit'], $language['formulaperm_sellercredit'], $language['formulaperm_digestposts'], $language['formulaperm_posts'], $language['formulaperm_threads'], $language['formulaperm_oltime']);
  245.                         for($i = 1; $i <= 8; $i++) {
  246.                                 $search[] = 'extcredits'.$i;
  247.                                 $replace[] = $_G['setting']['extcredits'][$i]['title'] ? $_G['setting']['extcredits'][$i]['title'] : $language['formulaperm_extcredits'].$i;
  248.                         }
  249.                         if($profilefields) {
  250.                                 loadcache(array('fields_required', 'fields_optional'));
  251.                                 foreach($profilefields as $profilefield) {
  252.                                         $search[] = $profilefield;
  253.                                         $replace[] = !empty($_G['cache']['fields_optional']['field_'.$profilefield]) ? $_G['cache']['fields_optional']['field_'.$profilefield]['title'] : $_G['cache']['fields_required']['field_'.$profilefield]['title'];
  254.                                 }
  255.                         }
  256.                         $i = 0;$_G['forum_usermsg'] = '';
  257.                         foreach($search as $s) {
  258.                                 if(in_array($s, array('digestposts', 'posts', 'threads', 'oltime', 'extcredits1', 'extcredits2', 'extcredits3', 'extcredits4', 'extcredits5', 'extcredits6', 'extcredits7', 'extcredits8'))) {
  259.                                         $_G['forum_usermsg'] .= strexists($formulatext, $s) ? '<br />   '.$replace[$i].': '.(@eval('return intval(getuserprofile(\''.$s.'\'));')) : '';
  260.                                 } elseif(in_array($s, array('regdate', 'regip'))) {
  261.                                         $_G['forum_usermsg'] .= strexists($formulatext, $s) ? '<br />   '.$replace[$i].': '.(@eval('return $memberformula[\''.$s.'\'];')) : '';
  262.                                 }
  263.                                 $i++;
  264.                         }
  265.                         $search = array_merge($search, array('and', 'or', '>=', '<=', '=='));
  266.                         $replace = array_merge($replace, array('  <b>'.$language['formulaperm_and'].'</b>  ', '  <b>'.$language['formulaperm_or'].'</b>  ', '≥', '≤', '='));
  267.                         $_G['forum_formulamessage'] = str_replace($search, $replace, $formulatext);
  268.                 } else {
  269.                         $_G['forum_formulamessage'] = $permmessage;
  270.                 }

  271.                 return $_G['forum_formulamessage'];
  272.         } elseif($formulaperm && $type == 1) {
  273.                 return FALSE;
  274.         }
  275.         return TRUE;
  276. }

  277. /**
  278. * vip用户购买组权限是否到期
  279. * @param $terms 期限 来源于 memberfields 表的 groupterms 字段
  280. * @return 返回过期信息
  281. */
  282. function groupexpiry($terms) {
  283.         $terms = is_array($terms) ? $terms : unserialize($terms);
  284.         $groupexpiry = isset($terms['main']['time']) ? intval($terms['main']['time']) : 0;
  285.         if(is_array($terms['ext'])) {
  286.                 foreach($terms['ext'] as $expiry) {
  287.                         if((!$groupexpiry && $expiry) || $expiry < $groupexpiry) {
  288.                                 $groupexpiry = $expiry;
  289.                         }
  290.                 }
  291.         }
  292.         return $groupexpiry;
  293. }

  294. /**
  295. * 返回当前链接的域名
  296. * @return 返回域名
  297. */
  298. function site() {
  299.         return $_SERVER['HTTP_HOST'];
  300. }

  301. /**
  302. * 显示主题分类
  303. * @param $curtypeid - 当前被选择的类型id
  304. * @return 返回的HTML数据
  305. */
  306. function typeselect($curtypeid = 0) {
  307.         global $_G;
  308.         if($threadtypes = $_G['forum']['threadtypes']) {
  309.                 $html = '<select name="typeid" id="typeid"><option value="0"> </option>';
  310.                 foreach($threadtypes['types'] as $typeid => $name) {
  311.                         $html .= '<option value="'.$typeid.'" '.($curtypeid == $typeid ? 'selected' : '').'>'.strip_tags($name).'</option>';
  312.                 }
  313.                 $html .= '</select>';
  314.                 return $html;
  315.         } else {
  316.                 return '';
  317.         }
  318. }

  319. /**
  320. * 更新管理者状态
  321. * @param $modacton - 动作
  322. * @param $smcols - 执行次数
  323. */
  324. function updatemodworks($modaction, $posts = 1) {
  325.         global $_G;
  326.         $today = dgmdate(TIMESTAMP, 'Y-m-d');
  327.         if($_G['setting']['modworkstatus'] && $modaction && $posts) {
  328.                 DB::query("UPDATE ".DB::table('forum_modwork')." SET count=count+1, posts=posts+'$posts' WHERE uid='$_G[uid]' AND modaction='$modaction' AND dateline='$today'");
  329.                 if(!DB::affected_rows()) {
  330.                         DB::query("INSERT INTO ".DB::table('forum_modwork')." (uid, modaction, dateline, count, posts) VALUES ('$_G[uid]', '$modaction', '$today', 1, '$posts')");
  331.                 }
  332.         }
  333. }

  334. /**
  335. * 格式化一个sql语句,通常用于update操作
  336. *
  337. * @param string $fieldname 字段名称
  338. * @param int $position 位置
  339. * @param int $value 数值 0|1
  340. * @return string
  341. */
  342. function buildbitsql($fieldname, $position, $value) {
  343.         $t = " `$fieldname`=`$fieldname`";
  344.         if($value) {
  345.                 $t .= ' | '.setstatus($position, 1);
  346.         } else {
  347.                 $t .= ' & '.setstatus($position, 0);
  348.         }
  349.         return $t.' ';
  350. }

  351. function showmessagenoperm($type, $fid, $formula = '') {
  352.         global $_G;
  353.         loadcache('usergroups');
  354.         if($formula) {
  355.                 $formula = unserialize($formula);
  356.                 $permmessage = stripslashes($formula['message']);
  357.         }

  358.         $usergroups = $nopermgroup = $forumnoperms = array();
  359.         $nopermdefault = array(
  360.                 'viewperm' => array(),
  361.                 'getattachperm' => array(),
  362.                 'postperm' => array(7),
  363.                 'replyperm' => array(7),
  364.                 'postattachperm' => array(7),
  365.         );
  366.         $perms = array('viewperm', 'postperm', 'replyperm', 'getattachperm', 'postattachperm');

  367.         foreach($_G['cache']['usergroups'] as $gid => $usergroup) {
  368.                 $usergroups[$gid] = $usergroup['type'];
  369.                 $grouptype = $usergroup['type'] == 'member' ? 0 : 1;
  370.                 $nopermgroup[$grouptype][] = $gid;
  371.         }
  372.         if($fid == $_G['forum']['fid']) {
  373.                 $forum = $_G['forum'];
  374.         } else {
  375.                 $forum = DB::fetch_first("SELECT * FROM ".DB::table('forum_forumfield')." WHERE fid='$fid'");
  376.         }

  377.         foreach($perms as $perm) {
  378.                 $permgroups = explode("\t", $forum[$perm]);
  379.                 $membertype = $forum[$perm] ? array_intersect($nopermgroup[0], $permgroups) : TRUE;
  380.                 $forumnoperm = $forum[$perm] ? array_diff(array_keys($usergroups), $permgroups) : $nopermdefault[$perm];
  381.                 foreach($forumnoperm as $groupid) {
  382.                         $nopermtype = $membertype && $groupid == 7 ? 'login' : ($usergroups[$groupid] == 'system' || $usergroups[$groupid] == 'special' ? 'none' : ($membertype ? 'upgrade' : 'none'));
  383.                         $forumnoperms[$fid][$perm][$groupid] = array($nopermtype, $permgroups);
  384.                 }
  385.         }

  386.         $v = $forumnoperms[$fid][$type][$_G['groupid']][0];
  387.         $gids = $forumnoperms[$fid][$type][$_G['groupid']][1];
  388.         $comma = $permgroups = '';
  389.         if(is_array($gids)) {
  390.                 foreach($gids as $gid) {
  391.                         if($gid && $_G['cache']['usergroups'][$gid]) {
  392.                                 $permgroups .= $comma.$_G['cache']['usergroups'][$gid]['grouptitle'];
  393.                                 $comma = ', ';
  394.                         } elseif($_G['setting']['verify']['enabled'] && substr($gid, 0, 1) == 'v') {
  395.                                 $vid = substr($gid, 1);
  396.                                 $permgroups .= $comma.$_G['setting']['verify'][$vid]['title'];
  397.                                 $comma = ', ';
  398.                         }

  399.                 }
  400.         }

  401.         $custom = 0;
  402.         if($permmessage) {
  403.                 $message = $permmessage;
  404.                 $custom = 1;
  405.         } else {
  406.                 if($v) {
  407.                         $message = $type.'_'.$v.'_nopermission';
  408.                 } else {
  409.                         $message = 'group_nopermission';
  410.                 }
  411.         }

  412.         showmessage($message, NULL, array('fid' => $fid, 'permgroups' => $permgroups, 'grouptitle' => $_G['group']['grouptitle']), array('login' => 1), $custom);
  413. }

  414. /**
  415. * 依据 tid 或者 fid ,自动取得 $_G['forum'] 或 $_G['thread'] 数据
  416. * @global <type>
  417. */
  418. function loadforum() {
  419.         global $_G;
  420.         $tid = intval(getgpc('tid'));
  421.         $fid = getgpc('fid');
  422.         if(!$fid && getgpc('gid')) {
  423.                 $fid = intval(getgpc('gid'));
  424.         }
  425.         if(!empty($_G['gp_archiver'])) {//X1.5的Archiver兼容
  426.                 if($fid) {
  427.                         dheader('location: archiver/?fid-'.$fid.'.html');
  428.                 } elseif($tid) {
  429.                         dheader('location: archiver/?tid-'.$tid.'.html');
  430.                 } else {
  431.                         dheader('location: archiver/');
  432.                 }
  433.         }
  434.         if(defined('IN_ARCHIVER') && $_G['setting']['archiverredirect'] && !IS_ROBOT) {
  435.                 dheader('location: ../forum.php'.($_G['mod'] ? '?mod='.$_G['mod'].(!empty($_GET['fid']) ? '&fid='.$_GET['fid'] : (!empty($_GET['tid']) ? '&tid='.$_GET['tid'] : '')) : ''));
  436.         }
  437.         if($_G['setting']['forumpicstyle']) {
  438.                 $_G['setting']['forumpicstyle'] = unserialize($_G['setting']['forumpicstyle']);
  439.                 empty($_G['setting']['forumpicstyle']['thumbwidth']) && $_G['setting']['forumpicstyle']['thumbwidth'] = 214;
  440.                 empty($_G['setting']['forumpicstyle']['thumbheight']) && $_G['setting']['forumpicstyle']['thumbheight'] = 160;
  441.         } else {
  442.                 $_G['setting']['forumpicstyle'] = array('thumbwidth' => 214, 'thumbheight' => 160);
  443.         }
  444.         if($fid) {
  445.                 $fid = is_numeric($fid) ? intval($fid) : (!empty($_G['setting']['forumfids'][$fid]) ? $_G['setting']['forumfids'][$fid] : 0);
  446.         }

  447.         $modthreadkey = isset($_G['gp_modthreadkey']) && $_G['gp_modthreadkey'] == modauthkey($tid) ? $_G['gp_modthreadkey'] : '';
  448.         $_G['forum_auditstatuson'] = $modthreadkey ? true : false;

  449.         $accessadd1 = $accessadd2 = $modadd1 = $modadd2 = $metadescription = $hookscriptmessage = '';
  450.         $adminid = $_G['adminid'];
  451.         if($_G['uid']) {
  452.                 if($_G['member']['accessmasks']) {
  453.                         $accessadd1 = ', a.allowview, a.allowpost, a.allowreply, a.allowgetattach, a.allowgetimage, a.allowpostattach, a.allowpostimage';
  454.                         $accessadd2 = "LEFT JOIN ".DB::table('forum_access')." a ON a.uid='$_G[uid]' AND a.fid=f.fid";
  455.                 }

  456.                 if($adminid == 3) {
  457.                         $modadd1 = ', m.uid AS ismoderator';
  458.                         $modadd2 = "LEFT JOIN ".DB::table('forum_moderator')." m ON m.uid='$_G[uid]' AND m.fid=f.fid";
  459.                 }
  460.         }

  461.         if(!empty($tid) || !empty($fid)) {

  462.                 if(!empty ($tid)) {
  463.                         $archiveid = !empty($_G['gp_archiveid']) ? intval($_G['gp_archiveid']) : null;
  464.                         $_G['thread'] = get_thread_by_tid($tid, '*', '', $archiveid);
  465.                         if(!$_G['forum_auditstatuson'] && !empty($_G['thread'])
  466.                                         && !($_G['thread']['displayorder'] >= 0 || (in_array($_G['thread']['displayorder'], array(-4,-3,-2)) && $_G['thread']['authorid'] == $_G['uid']))) {
  467.                                 $_G['thread'] = null;
  468.                         }

  469.                         $_G['forum_thread'] = & $_G['thread'];

  470.                         if(empty($_G['thread'])) {
  471.                                 $fid = $tid = 0;
  472.                         } else {
  473.                                 $fid = $_G['thread']['fid'];
  474.                                 $tid = $_G['thread']['tid'];
  475.                         }
  476.                 }

  477.                 if($fid) {
  478.                         $forum = DB::fetch_first("SELECT f.fid, f.*, ff.* $accessadd1 $modadd1, f.fid AS fid
  479.                         FROM ".DB::table('forum_forum')." f
  480.                         LEFT JOIN ".DB::table("forum_forumfield")." ff ON ff.fid=f.fid $accessadd2 $modadd2
  481.                         WHERE f.fid='$fid'");
  482.                 }

  483.                 if($forum) {
  484.                         $forum['ismoderator'] = !empty($forum['ismoderator']) || $adminid == 1 || $adminid == 2 ? 1 : 0;
  485.                         $fid = $forum['fid'];
  486.                         $gorup_admingroupids = $_G['setting']['group_admingroupids'] ? unserialize($_G['setting']['group_admingroupids']) : array('1' => '1');

  487.                         if($forum['status'] == 3) {
  488.                                 if(!$_G['setting']['groupstatus']) {
  489.                                         showmessage('group_status_off');
  490.                                 }
  491.                                 if(!empty($forum['moderators'])) {
  492.                                         $forum['moderators'] = unserialize($forum['moderators']);
  493.                                 } else {
  494.                                         require_once libfile('function/group');
  495.                                         $forum['moderators'] = update_groupmoderators($fid);
  496.                                 }
  497.                                 if($_G['uid'] && $_G['adminid'] != 1) {
  498.                                         $forum['ismoderator'] = !empty($forum['moderators'][$_G['uid']]) ? 1 : 0;
  499.                                         $_G['adminid'] = 0;
  500.                                         if($forum['ismoderator'] || $gorup_admingroupids[$_G['groupid']]) {
  501.                                                 $_G['adminid'] = $_G['adminid'] ? $_G['adminid'] : 3;
  502.                                                 if(!empty($gorup_admingroupids[$_G['groupid']])) {
  503.                                                         $forum['ismoderator'] = 1;
  504.                                                         $_G['adminid'] = 2;
  505.                                                 }

  506.                                                 $group_userperm = unserialize($_G['setting']['group_userperm']);
  507.                                                 if(is_array($group_userperm)) {
  508.                                                         $_G['group'] = array_merge($_G['group'], $group_userperm);
  509.                                                         $_G['group']['allowmovethread'] = $_G['group']['allowcopythread'] = $_G['group']['allowedittypethread']= 0;
  510.                                                 }
  511.                                         }
  512.                                 }
  513.                         }
  514.                         foreach(array('threadtypes', 'threadsorts', 'creditspolicy', 'modrecommend') as $key) {
  515.                                 $forum[$key] = !empty($forum[$key]) ? unserialize($forum[$key]) : array();
  516.                                 if(!is_array($forum[$key])) {
  517.                                         $forum[$key] = array();
  518.                                 }
  519.                         }

  520.                         if($forum['status'] == 3) {
  521.                                 $_G['isgroupuser'] = 0;
  522.                                 $_G['basescript'] = 'group';
  523.                                 if(empty($forum['level'])) {
  524.                                         $levelid = DB::result_first("SELECT levelid FROM ".DB::table('forum_grouplevel')." WHERE creditshigher<='$forum[commoncredits]' AND '$forum[commoncredits]'<creditslower LIMIT 1");
  525.                                         $forum['level'] = $levelid;
  526.                                         DB::query("UPDATE ".DB::table('forum_forum')." SET level='$levelid' WHERE fid='$fid'");
  527.                                 }
  528.                                 loadcache('grouplevels');
  529.                                 $grouplevel = $_G['grouplevels'][$forum['level']];
  530.                                 if(!empty($grouplevel['icon'])) {
  531.                                         $valueparse = parse_url($grouplevel['icon']);
  532.                                         if(!isset($valueparse['host'])) {
  533.                                                 $grouplevel['icon'] = $_G['setting']['attachurl'].'common/'.$grouplevel['icon'];
  534.                                         }
  535.                                 }

  536.                                 $group_postpolicy = $grouplevel['postpolicy'];
  537.                                 if(is_array($group_postpolicy)) {
  538.                                         $forum = array_merge($forum, $group_postpolicy);
  539.                                 }
  540.                                 $forum['allowfeed'] = $_G['setting']['group_allowfeed'];
  541.                                 if($_G['uid']) {
  542.                                         if(!empty($forum['moderators'][$_G['uid']])) {
  543.                                                 $_G['isgroupuser'] = 1;
  544.                                         } else {
  545.                                                 $_G['isgroupuser'] = DB::result_first("SELECT level FROM ".DB::table('forum_groupuser')." WHERE fid='$fid' AND uid='$_G[uid]' LIMIT 1");
  546.                                                 if($_G['isgroupuser'] <= 0 && empty($forum['ismoderator'])) {
  547.                                                         $_G['group']['allowrecommend'] = $_G['cache']['usergroup_'.$_G['groupid']]['allowrecommend'] = 0;
  548.                                                         $_G['group']['allowcommentpost'] = $_G['cache']['usergroup_'.$_G['groupid']]['allowcommentpost'] = 0;
  549.                                                         $_G['group']['allowcommentitem'] = $_G['cache']['usergroup_'.$_G['groupid']]['allowcommentitem'] = 0;
  550.                                                         $_G['group']['raterange'] = $_G['cache']['usergroup_'.$_G['groupid']]['raterange'] = array();
  551.                                                         $_G['group']['allowvote'] = $_G['cache']['usergroup_'.$_G['groupid']]['allowvote'] = 0;
  552.                                                 } else {
  553.                                                         $_G['isgroupuser'] = 1;
  554.                                                 }
  555.                                         }
  556.                                 }
  557.                         }
  558.                 } else {
  559.                         $fid = 0;
  560.                 }
  561.         }

  562.         $_G['fid'] = $fid;
  563.         $_G['tid'] = $tid;
  564.         $_G['forum'] = &$forum;
  565.         $_G['current_grouplevel'] = &$grouplevel;

  566.         if(isset($_G['cookie']['widthauto']) && $_G['setting']['switchwidthauto'] && empty($_G['forum']['widthauto'])) {
  567.                 $_G['forum_widthauto'] = $_G['cookie']['widthauto'] > 0;
  568.         } else {
  569.                 $_G['forum_widthauto'] = empty($_G['forum']['widthauto']) ? !$_G['setting']['allowwidthauto'] : $_G['forum']['widthauto'] > 0;
  570.                 if(!empty($_G['forum']['widthauto'])) {
  571.                         $_G['setting']['switchwidthauto'] = 0;
  572.                 }
  573.         }
  574. }

  575. /**
  576. *
  577. * @param <type> $tid 主题id
  578. * @param <type> $fields 取用主题表的字段, 默认 "*"
  579. * @param <type> $addcondiction 除 tid='$tid' 以外的其他条件, 默认空
  580. * @param <type> $forcetableid 是否强制只从某个分表中取得 thread, 默认 null
  581. * @return array 当有合法数值返回的时候, 将自动追加2个key值threadtable, posttable 记录此主题使用的分表名称
  582. */
  583. function get_thread_by_tid($tid, $fields = '*', $addcondiction = '', $forcetableid = null) {
  584.         global $_G;

  585.         $ret = array();
  586.         if(!is_numeric($tid)) {
  587.                 return $ret;
  588.         }
  589.         loadcache('threadtableids');
  590.         $threadtableids = array(0);
  591.         if(!empty($_G['cache']['threadtableids'])) {
  592.                 if($forcetableid === null || ($forcetableid > 0 && !in_array($forcetableid, $_G['cache']['threadtableids']))) {
  593.                         $threadtableids = array_merge($threadtableids, $_G['cache']['threadtableids']);
  594.                 } else {
  595.                         $threadtableids = array(intval($forcetableid));
  596.                 }
  597.         }

  598.         foreach($threadtableids as $tableid) {
  599.                 $table = $tableid > 0 ? "forum_thread_{$tableid}" : 'forum_thread';
  600.                 $ret = DB::fetch_first("SELECT $fields FROM ".DB::table($table)." WHERE tid='$tid' $addcondiction LIMIT 1");
  601.                 if($ret) {
  602.                         $ret['threadtable'] = $table;
  603.                         $ret['threadtableid'] = $tableid;
  604.                         $ret['posttable'] = 'forum_post'.($ret['posttableid'] ? '_'.$ret['posttableid'] : '');
  605.                         break;
  606.                 }
  607.         }

  608.         if(!is_array($ret)) {
  609.                 $ret = array();
  610.         }

  611.         return $ret;
  612. }

  613. /**
  614. * 依据 pid 和 其他条件,从某个post数据表中取回post信息
  615. * @global <type> $_G
  616. * @param <type> $pid 帖子id
  617. * @param <type> $fields 帖子表字段,默认 *
  618. * @param <type> $addcondiction 其他条件,默认 空
  619. * @param <type> $forcetable 是否强制使用某个分表, 支持: 使用id: 0 1 2 或者 p(主表), a(副表) 或者直接制定表名 forum_post_1
  620. * @return array
  621. */
  622. function get_post_by_pid($pid, $fields = '*', $addcondiction = '', $forcetable = null) {
  623.         global $_G;

  624.         $ret = array();
  625.         if(!is_numeric($pid)) {
  626.                 return $ret;
  627.         }

  628.         loadcache('posttable_info');

  629.         $posttableids = array(0);
  630.         if($_G['cache']['posttable_info']) {
  631.                 if(isset($forcetable)) {
  632.                         if(is_numeric($forcetable) && array_key_exists($forcetable, $_G['cache']['posttable_info'])) {
  633.                                 $posttableids[] = $forcetable;
  634.                         } elseif(substr($forcetable, 0, 10) == 'forum_post') {
  635.                                 $posttableids[] = $forcetable;
  636.                         }
  637.                 } else {
  638.                         $posttableids = array_keys($_G['cache']['posttable_info']);
  639.                 }
  640.         }

  641.         foreach ($posttableids as $id) {
  642.                 $table = empty($id) ? 'forum_post' : (is_numeric($id) ? 'forum_post_'.$id : $id);
  643.                 $ret = DB::fetch_first("SELECT $fields FROM ".DB::table($table)." WHERE pid='$pid' $addcondiction LIMIT 1");
  644.                 if($ret) {
  645.                         $ret['posttable'] = $table;
  646.                         break;
  647.                 }
  648.         }

  649.         if(!is_array($ret)) {
  650.                 $ret = array();
  651.         }

  652.         return $ret;
  653. }

  654. function set_rssauth() {
  655.         global $_G;
  656.         if($_G['setting']['rssstatus'] && $_G['uid']) {
  657.                 $auth = authcode($_G['uid']."\t".($_G['fid'] ? $_G['fid'] : '').
  658.                 "\t".substr(md5($_G['member']['password']), 0, 8), 'ENCODE', md5($_G['config']['security']['authkey']));
  659.         } else {
  660.                 $auth = '0';
  661.         }
  662.         $_G['rssauth'] = rawurlencode($auth);
  663. }

  664. function my_thread_log($opt, $data) {
  665.         global $_G;
  666.     $my_search_data = $_G['setting']['my_search_data'];
  667.     if ($my_search_data && !is_array($my_search_data)) {
  668.         $my_search_data = unserialize($my_search_data);
  669.     }
  670.         if(!$_G['setting']['my_search_data']) return;
  671.         $data['action'] = $opt;
  672.         $data['dateline'] = time();
  673.         DB::insert('forum_threadlog', $data, false, true);
  674. }

  675. function my_post_log($opt, $data) {
  676.         global $_G;
  677.     $my_search_data = $_G['setting']['my_search_data'];
  678.     if ($my_search_data && !is_array($my_search_data)) {
  679.         $my_search_data = unserialize($my_search_data);
  680.     }
  681.         if(!$_G['setting']['my_search_data']) return;
  682.         $data['action'] = $opt;
  683.         $data['dateline'] = time();
  684.         DB::insert('forum_postlog', $data, false, true);
  685. }

  686. function rssforumperm($forum) {
  687.         $is_allowed = $forum['type'] != 'group' && (!$forum['viewperm'] || ($forum['viewperm'] && forumperm($forum['viewperm'], 7)));
  688.         return $is_allowed;
  689. }

  690. /**
  691. *        upload_icon_banner上传群组/版块图片
  692. *        $forum中 fid和status 必须存在,status判断是群组还是版块图片,以存入不同目录
  693. *        $file上传时的$_FILES
  694. *        $type icon 或 banner
  695. */
  696. function upload_icon_banner(&$data, $file, $type) {
  697.         global $_G;
  698.         $data['extid'] = empty($data['extid']) ? $data['fid'] : $data['extid'];
  699.         if(empty($data['extid'])) return '';

  700.         if($data['status'] == 3 && $_G['setting']['group_imgsizelimit']) {
  701.                 $file['size'] > ($_G['setting']['group_imgsizelimit'] * 1024) && showmessage('file_size_overflow', '', array('size' => $_G['setting']['group_imgsizelimit'] * 1024));
  702.         }
  703.         require_once libfile('class/upload');
  704.         $upload = new discuz_upload();
  705.         $uploadtype = $data['status'] == 3 ? 'group' : 'common';

  706.         if(!$upload->init($file, $uploadtype, $data['extid'], $type)) {
  707.                 return false;
  708.         }

  709.         if(!$upload->save()) {
  710.                 if(!defined('IN_ADMINCP')) {
  711.                         showmessage($upload->errormessage());
  712.                 } else {
  713.                         cpmsg($upload->errormessage(), '', 'error');
  714.                 }
  715.         }
  716.         if($data['status'] == 3 && $type == 'icon') {
  717.                 require_once libfile('class/image');
  718.                 $img = new image;
  719.                 $img->Thumb($upload->attach['target'], './'.$uploadtype.'/'.$upload->attach['attachment'], 48, 48, 'fixwr');
  720.         }
  721.         return $upload->attach['attachment'];
  722. }

  723. /**
  724.         用于 archiver 环境下的分页
  725. */
  726. function arch_multi($total, $perpage, $page, $link) {
  727.         $pages = @ceil($total / $perpage) + 1;
  728.         $pagelink = '';
  729.         if($pages > 1) {
  730.                 $pagelink .= lang('forum/archiver', 'page') . ": \n";
  731.                 $pagestart = $page - 10 < 1 ? 1 : $page - 10;
  732.                 $pageend = $page + 10 >= $pages ? $pages : $page + 10;
  733.                 for($i = $pagestart; $i < $pageend; $i++) {
  734.                         $pagelink .= ($i == $page ? "<strong>[$i]</strong>" : "<a href=\"$link&page=$i\">$i</a>")." \n";
  735.                 }
  736.         }
  737.         return $pagelink;
  738. }

  739. /**
  740.         archiver 模板路径
  741. */
  742. function loadarchiver($path) {
  743.         global $_G;
  744.         if(!$_G['setting']['archiver']) {
  745.                 require_once DISCUZ_ROOT . "./source/archiver/common/header.php";
  746.                 echo '<div id="content">'.lang('message', 'forum_archiver_disabled').'</div>';
  747.                 require_once DISCUZ_ROOT . "./source/archiver/common/footer.php";
  748.                 exit;
  749.         }
  750.         $filename = $path . '.php';
  751.         return DISCUZ_ROOT . "./source/archiver/$filename";
  752. }
  753. /**
  754. *        update_threadpartake 按参与人次更新主题热度
  755. */
  756. function update_threadpartake($tid) {
  757.         global $_G;
  758.         if($_G['uid'] && $tid) {
  759.                 if($_G['setting']['heatthread']['period']) {
  760.                         $partaked = DB::result_first("SELECT uid FROM ".DB::table('forum_threadpartake')." WHERE tid='$tid' AND uid='$_G[uid]'");
  761.                         if(!$partaked) {
  762.                                 DB::query("INSERT INTO ".DB::table('forum_threadpartake')." (tid, uid, dateline) VALUES ('$tid', '$_G[uid]', ".TIMESTAMP.")");
  763.                                 DB::query("UPDATE ".DB::table('forum_thread')." SET heats=heats+1 WHERE tid='$tid'", 'UNBUFFERED');
  764.                         }
  765.                 } else {
  766.                         DB::query("UPDATE ".DB::table('forum_thread')." SET heats=heats+1 WHERE tid='$tid'", 'UNBUFFERED');

  767.                 }
  768.         }
  769. }

  770. /**
  771. * 获取帖子封面地址
  772. *
  773. * @param int $tid
  774. * @param int $cover 负数时表示是远程,正数为本地 没有值表示只取filename
  775. */
  776. function getthreadcover($tid, $cover = 0, $getfilename = 0) {
  777.         global $_G;
  778.         if(empty($tid)) {
  779.                 return '';
  780.         }
  781.         $coverpath = '';
  782.         $covername = 'threadcover/'.substr(md5($tid), 0, 2).'/'.substr(md5($tid), 2, 2).'/'.$tid.'.jpg';
  783.         if($getfilename) {
  784.                 return $covername;
  785.         }
  786.         if($cover) {
  787.                 $coverpath = ($cover < 0 ? $_G['setting']['ftp']['attachurl'] : $_G['setting']['attachurl']).'forum/'.$covername;
  788.         }
  789.         return $coverpath;
  790. }

  791. /**
  792. *添加主题标签
  793. *
  794. * @param <type> $tags
  795. * @param <type> $itemid
  796. */
  797. function addthreadtag($tags, $itemid , $typeid = 'tid') {
  798.         global $_G;

  799.         if($tags == '') {
  800.                 return;
  801.         }

  802.         $tags = str_replace(array(chr(0xa3).chr(0xac), chr(0xa1).chr(0x41), chr(0xef).chr(0xbc).chr(0x8c)), ',', censor($tags));
  803.         if(strexists($tags, ',')) {
  804.                 $tagarray = array_unique(explode(',', $tags));
  805.         } else {
  806.                 $langcore = lang('core');
  807.                 $tags = str_replace($langcore['fullblankspace'], ' ', $tags);
  808.                 $tagarray = array_unique(explode(' ', $tags));
  809.         }
  810.         $tagcount = 0;
  811.         foreach($tagarray as $tagname) {
  812.                 $tagname = trim($tagname);
  813.                 if(preg_match('/^([\x7f-\xff_-]|\w|\s){3,20}$/', $tagname)) {
  814.                         $result = DB::fetch_first("SELECT tagid, status FROM ".DB::table('common_tag')." WHERE tagname='$tagname'");
  815.                         if($result['tagid']) {
  816.                                 if(!$result['status']) {
  817.                                         $tagid = $result['tagid'];
  818.                                 }
  819.                         } else {
  820.                                 DB::query("INSERT INTO ".DB::table('common_tag')." (tagname, status) VALUES ('$tagname', '0')");
  821.                                 $tagid = DB::insert_id();
  822.                         }
  823.                         if($tagid) {
  824.                                 DB::query("INSERT INTO ".DB::table('common_tagitem')." (tagid, tagname, itemid, idtype) VALUES ('$tagid', '$tagname', '$itemid', '$typeid')");
  825.                                 $tagcount++;
  826.                                 $tagstr .= $tagid.','.$tagname.'\t';
  827.                         }
  828.                         if($tagcount > 4) {
  829.                                 unset($tagarray);
  830.                                 break;
  831.                         }
  832.                 }
  833.         }
  834.         return $tagstr;
  835. }

  836. /**
  837. *修改主题标签
  838. *
  839. * @param <type> $tags
  840. * @param <type> $itemid
  841. * @return <type>
  842. */
  843. function modthreadtag($tags, $itemid) {
  844.         global $_G;

  845.         $thread = & $_G['forum_thread'];
  846.         $posttable = $thread['posttable'];
  847.         $tagstr = DB::result_first("SELECT tags FROM ".DB::table($posttable)." WHERE tid='$itemid' AND first=1");

  848.         $threadtagarray = $threadtagidarray = $threadtagarraynew = array();
  849.         $query = DB::query("SELECT tagid, tagname FROM ".DB::table('common_tagitem')." WHERE idtype='tid' AND itemid='$itemid'");
  850.         while($result = DB::fetch($query)) {
  851.                 $threadtagarray[] = $result['tagname'];
  852.                 $threadtagidarray[] = $result['tagid'];
  853.         }

  854.         $tags = str_replace(array(chr(0xa3).chr(0xac), chr(0xa1).chr(0x41), chr(0xef).chr(0xbc).chr(0x8c)), ',', censor($tags));
  855.         if(strexists($tags, ',')) {
  856.                 $tagarray = array_unique(explode(',', $tags));
  857.         } else {
  858.                 $langcore = lang('core');
  859.                 $tags = str_replace($langcore['fullblankspace'], ' ', $tags);
  860.                 $tagarray = array_unique(explode(' ', $tags));
  861.         }

  862.         $tagcount = 0;
  863.         foreach($tagarray as $tagname) {
  864.                 $tagname = trim($tagname);
  865.                 if(preg_match('/^([\x7f-\xff_-]|\w|\s){3,20}$/', $tagname)) {
  866.                         $threadtagarraynew[] = $tagname;
  867.                         if(!in_array($tagname, $threadtagarray)) {
  868.                                 $result = DB::fetch_first("SELECT tagid, status FROM ".DB::table('common_tag')." WHERE tagname='$tagname'");
  869.                                 if($result['tagid']) {
  870.                                         if(!$result['status']) {
  871.                                                 $tagid = $result['tagid'];
  872.                                         }
  873.                                 } else {
  874.                                         DB::query("INSERT INTO ".DB::table('common_tag')." (tagname, status) VALUES ('$tagname', '0')");
  875.                                         $tagid = DB::insert_id();
  876.                                 }
  877.                                 if($tagid) {
  878.                                         DB::query("INSERT INTO ".DB::table('common_tagitem')." (tagid, tagname, itemid, idtype) VALUES ('$tagid', '$tagname', '$itemid', 'tid')");
  879.                                         $tagstr = $tagstr.$tagid.','.$tagname.'\t';
  880.                                 }
  881.                         }
  882.                 }
  883.                 $tagcount++;
  884.                 if($tagcount > 4) {
  885.                         unset($tagarray);
  886.                         break;
  887.                 }
  888.         }
  889.         foreach($threadtagarray as $key => $tagname) {
  890.                 if(!in_array($tagname, $threadtagarraynew)) {
  891.                         DB::query("DELETE FROM        ".DB::table('common_tagitem')." WHERE idtype='tid' AND itemid = '$itemid' AND tagname='$tagname'");
  892.                         $tagid = $threadtagidarray[$key];
  893.                         $tagstr = str_replace("$tagid,$tagname\t", '', $tagstr);
  894.                 }
  895.         }
  896.         return $tagstr;
  897. }

  898. /**
  899. * 将未使用的附件转为已使用状态
  900. * @param <int> $aid
  901. * @param <int> $tid
  902. * @param <pid> $pid
  903. */
  904. function convertunusedattach($aid, $tid, $pid) {
  905.         if(!$aid) {
  906.                 return;
  907.         }
  908.         global $_G;
  909.         $attach = DB::fetch_first("SELECT * FROM ".DB::table('forum_attachment_unused')." WHERE aid='$aid' AND uid='$_G[uid]'");
  910.         if(!$attach) {
  911.                 return;
  912.         }
  913.         $attach = daddslashes($attach);
  914.         $attach['tid'] = $tid;
  915.         $attach['pid'] = $pid;
  916.         DB::insert(getattachtablebytid($tid), $attach, false);
  917.         DB::update('forum_attachment', array('tid' => $tid, 'pid' => $pid, 'tableid' => getattachtableid($tid)), "aid='$attach[aid]'");
  918.         DB::delete('forum_attachment_unused', "aid='$attach[aid]'");
  919. }

  920. /**
  921. * 更新附件的 TID 值
  922. * @param <string> $where 条件
  923. * @param <int> $oldtid 旧 TID
  924. * @param <int> $newtid  新 TID
  925. */
  926. function updateattachtid($where, $oldtid, $newtid) {
  927.         $oldattachtable = getattachtablebytid($oldtid);
  928.         $newattachtable = getattachtablebytid($newtid);
  929.         if($oldattachtable != $newattachtable) {
  930.                 $query = DB::query("SELECT * FROM ".DB::table($oldattachtable)." WHERE $where");
  931.                 while($attach = DB::fetch($query)) {
  932.                         $attach = daddslashes($attach);
  933.                         $attach['tid'] = $newtid;
  934.                         DB::insert($newattachtable, $attach);
  935.                 }
  936.                 DB::delete($oldattachtable, $where);
  937.         }
  938.         DB::query("UPDATE ".DB::table('forum_attachment')." SET tid='$newtid',tableid='".getattachtableid($newtid)."' WHERE $where");
  939. }

  940. /**
  941. * 更新POST
  942. * @global  $_G
  943. * @param array $data 更新的数据
  944. * @param string/array $condition 条件
  945. * @param bool $unbuffered 是否即时返回
  946. * @param int $posttableid post分表ID
  947. * @return int 返回的更新的记录数
  948. */
  949. function updatepost($data, $condition, $unbuffered = false, $posttableid = false) {
  950.         global $_G;
  951.         loadcache('posttableids');
  952.         $affected_rows = 0;
  953.         if(!empty($_G['cache']['posttableids'])) {
  954.                 $posttableids = $posttableid !== false && in_array($posttableid, $_G['cache']['posttableids']) ? array($posttableid) : $_G['cache']['posttableids'];
  955.         } else {
  956.                 $posttableids = array('0');
  957.         }
  958.         foreach($posttableids as $id) {
  959.                 DB::update(getposttable($id), $data, $condition, $unbuffered);
  960.                 $affected_rows += DB::affected_rows();
  961.         }
  962.         return $affected_rows;
  963. }

  964. /**
  965.     插入一个帖子
  966. */
  967. function insertpost($data) {
  968.         if(isset($data['tid'])) {
  969.                 $tableid = DB::result_first("SELECT posttableid FROM ".DB::table('forum_thread')." WHERE tid='{$data['tid']}'");
  970.         } else {
  971.                 $tableid = $data['tid'] = 0;
  972.         }
  973.         $pid = DB::insert('forum_post_tableid', array('pid' => null), true);

  974.         if(!$tableid) {
  975.                 $tablename = 'forum_post';
  976.         } else {
  977.                 $tablename = "forum_post_$tableid";
  978.         }

  979.         $data = array_merge($data, array('pid' => $pid));

  980.         DB::insert($tablename, $data);
  981.         if($pid % 1024 == 0) {
  982.                 DB::delete('forum_post_tableid', "pid<$pid");
  983.         }
  984.         save_syscache('max_post_id', $pid);
  985.         return $pid;
  986. }

  987. ?>
复制代码


更多Discuz二次开发相关源码分析
1、discuz核心类库class_core的函数注释
http://bbs.zb7.com/thread-514094-1-1.html
2、Discuz的forum_index.php文件的分析
http://bbs.zb7.com/thread-517467-1-1.html
3、discuz x3 与通知表有关的程序源代码分析
http://bbs.zb7.com/thread-517471-1-1.html
4、discuz x3 space_notice.php分析注释
http://bbs.zb7.com/thread-517472-1-1.html
5、discuz x3 uc_client/client.php接口文件分析
http://bbs.zb7.com/thread-517473-1-1.html
6、Discuz中session机制流程图
http://bbs.zb7.com/thread-517443-1-1.html
7、class_core.php文件中核心基础类库中discuz_core类分析
http://bbs.zb7.com/thread-517538-1-1.html
8、class_core.php文件中数据库操作类DB及db_mysql分析
http://bbs.zb7.com/thread-517539-1-1.html
9、class_core.php文件中session会话类discuz_session分析
http://bbs.zb7.com/thread-517540-1-1.html
10、class_core.php文件中核心高效缓存类discuz_memory分析
http://bbs.zb7.com/thread-517542-1-1.html
11、function_delete.php数据清理函数集合分析
http://bbs.zb7.com/thread-517543-1-1.html




上一篇:function_delete.php数据清理函数集合分析
下一篇:discuz3.x后台【管理中心】-&gt;【全局】设置中表单名汇总
UC955 发表于 2015-7-1 17:32:08 来自PC
这么好的帖子,沙发没人坐
您需要登录后才可以回帖 登录 | 快速注册

本版积分规则

快速回复 返回顶部 返回列表