【discuzX2】/source/function/function_forum.php论坛模块通用函数集合分析

来源:互联网 发布:淘宝v5会员消费多少钱 编辑:程序博客网 时间:2024/06/04 19:47
<?php/** *      [Discuz!] (C)2001-2099 Comsenz Inc. *      This is NOT a freeware, use is subject to license terms *      论坛模块通用函数集合 *      $Id: function_forum.php 24723 2011-10-09 12:50:14Z yangli $ */if(!defined('IN_DISCUZ')) {exit('Access Denied');}/*** * @param $uid - 用户ID* @param $size - 头像大小 small/middle/big* @param $returnsrc - 是否返回头像地址*/function discuz_uc_avatar($uid, $size = '', $returnsrc = FALSE) {global $_G;return avatar($uid, $size, $returnsrc, FALSE, $_G['setting']['avatarmethod'], $_G['setting']['ucenterurl']);}/*** 论坛附件删除* @param $attach - 单一附件数据*/function dunlink($attach) {global $_G;$filename = $attach['attachment'];$havethumb = $attach['thumb'];$remote = $attach['remote'];if($remote) {ftpcmd('delete', $_G['setting']['ftp']['attachdir'].'/forum/'.$filename);$havethumb && ftpcmd('delete', $_G['setting']['ftp']['attachdir'].'/forum/'.getimgthumbname($filename));} else {@unlink($_G['setting']['attachdir'].'/forum/'.$filename);$havethumb && @unlink($_G['setting']['attachdir'].'/forum/'.getimgthumbname($filename));}if($attach['aid']) {@unlink($_G['setting']['attachdir'].'image/'.$attach['aid'].'_140_140.jpg');}}/**权限表达式* @param $formula - 权限表达式*/function formulaperm($formula) {global $_G;$formula = unserialize($formula);$medalperm = $formula['medal'];$permusers = $formula['users'];$permmessage = $formula['message'];if($_G['setting']['medalstatus'] && $medalperm) {$exists = 1;$_G['forum_formulamessage'] = '';$medalpermc = $medalperm;if($_G['uid']) {$medals = explode("\t", DB::result_first("SELECT medals FROM ".DB::table('common_member_field_forum')." WHERE uid='$_G[uid]'"));foreach($medalperm as $k => $medal) {foreach($medals as $r) {list($medalid) = explode("|", $r);if($medalid == $medal) {$exists = 0;unset($medalpermc[$k]);}}}} else {$exists = 0;}if($medalpermc) {loadcache('medals');foreach($medalpermc as $medal) {if($_G['cache']['medals'][$medal]) {$_G['forum_formulamessage'] .= '<img src="'.STATICURL.'image/common/'.$_G['cache']['medals'][$medal]['image'].'" style="vertical-align:middle;" /> '.$_G['cache']['medals'][$medal]['name'].'  ';}}showmessage('forum_permforum_nomedal', NULL, array('forum_permforum_nomedal' => $_G['forum_formulamessage']), array('login' => 1));}}$formulatext = $formula[0];$formula = $formula[1];if($_G['adminid'] == 1 || $_G['forum']['ismoderator'] || in_array($_G['groupid'], explode("\t", $_G['forum']['spviewperm']))) {return FALSE;}if($permusers) {$permusers = str_replace(array("\r\n", "\r"), array("\n", "\n"), $permusers);$permusers = explode("\n", trim($permusers));if(!in_array($_G['member']['username'], $permusers)) {showmessage('forum_permforum_disallow', NULL, array(), array('login' => 1));}}if(!$formula) {return FALSE;}if(strexists($formula, '$memberformula[')) {preg_match_all("/\\\$memberformula\['(\w+?)'\]/", $formula, $a);$fields = $profilefields = array();$mfadd = array();foreach($a[1] as $field) {switch($field) {case 'regdate':$formula = preg_replace("/\{(\d{4})\-(\d{1,2})\-(\d{1,2})\}/e", "'\'\\1-'.sprintf('%02d', '\\2').'-'.sprintf('%02d', '\\3').'\''", $formula);case 'regday':$fields[] = 'm.regdate';break;case 'regip':case 'lastip':$formula = preg_replace("/\{([\d\.]+?)\}/", "'\\1'", $formula);$formula = preg_replace('/(\$memberformula\[\'(regip|lastip)\'\])\s*=+\s*\'([\d\.]+?)\'/', "strpos(\\1, '\\3')===0", $formula);case 'buyercredit':case 'sellercredit':$mfadd['ms'] = " LEFT JOIN ".DB::table('common_member_status')." ms ON m.uid=ms.uid";$fields[] = 'ms.'.$field;break;case substr($field, 0, 5) == 'field':$mfadd['mp'] = " LEFT JOIN ".DB::table('common_member_profile')." mp ON m.uid=mp.uid";$fields[] = 'mp.field'.intval(substr($field, 5));$profilefields[] = $field;break;}}$memberformula = array();if($_G['uid']) {$memberformula = DB::fetch_first("SELECT ".implode(',', $fields)." FROM ".DB::table('common_member')." m ".implode('', $mfadd)." WHERE m.uid='$_G[uid]'");if(in_array('regday', $a[1])) {$memberformula['regday'] = intval((TIMESTAMP - $memberformula['regdate']) / 86400);}if(in_array('regdate', $a[1])) {$memberformula['regdate'] = date('Y-m-d', $memberformula['regdate']);}$memberformula['lastip'] = $memberformula['lastip'] ? $memberformula['lastip'] : $_G['clientip'];} else {if(isset($memberformula['regip'])) {$memberformula['regip'] = $_G['clientip'];}if(isset($memberformula['lastip'])) {$memberformula['lastip'] = $_G['clientip'];}}}@eval("\$formulaperm = ($formula) ? TRUE : FALSE;");if(!$formulaperm) {if(!$permmessage) {$language = lang('forum/misc');$search = array('regdate', 'regday', 'regip', 'lastip', 'buyercredit', 'sellercredit', 'digestposts', 'posts', 'threads', 'oltime');$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']);for($i = 1; $i <= 8; $i++) {$search[] = 'extcredits'.$i;$replace[] = $_G['setting']['extcredits'][$i]['title'] ? $_G['setting']['extcredits'][$i]['title'] : $language['formulaperm_extcredits'].$i;}if($profilefields) {loadcache(array('fields_required', 'fields_optional'));foreach($profilefields as $profilefield) {$search[] = $profilefield;$replace[] = !empty($_G['cache']['fields_optional']['field_'.$profilefield]) ? $_G['cache']['fields_optional']['field_'.$profilefield]['title'] : $_G['cache']['fields_required']['field_'.$profilefield]['title'];}}$i = 0;$_G['forum_usermsg'] = '';foreach($search as $s) {if(in_array($s, array('digestposts', 'posts', 'threads', 'oltime', 'extcredits1', 'extcredits2', 'extcredits3', 'extcredits4', 'extcredits5', 'extcredits6', 'extcredits7', 'extcredits8'))) {$_G['forum_usermsg'] .= strexists($formulatext, $s) ? '<br />   '.$replace[$i].': '.(@eval('return intval(getuserprofile(\''.$s.'\'));')) : '';} elseif(in_array($s, array('regdate', 'regip'))) {$_G['forum_usermsg'] .= strexists($formulatext, $s) ? '<br />   '.$replace[$i].': '.(@eval('return $memberformula[\''.$s.'\'];')) : '';}$i++;}$search = array_merge($search, array('and', 'or', '>=', '<=', '=='));$replace = array_merge($replace, array('  <b>'.$language['formulaperm_and'].'</b>  ', '  <b>'.$language['formulaperm_or'].'</b>  ', '≥', '≤', '='));$_G['forum_formulamessage'] = str_replace($search, $replace, $formulatext);} else {$_G['forum_formulamessage'] = $permmessage;}if(!$permmessage) {showmessage('forum_permforum_nopermission', NULL, array('formulamessage' => $_G['forum_formulamessage'], 'usermsg' => $_G['forum_usermsg']), array('login' => 1));} else {showmessage('forum_permforum_nopermission_custommsg', NULL, array('formulamessage' => $_G['forum_formulamessage']), array('login' => 1));}}return TRUE;}/**勋章权限表达式* @param $formula - 勋章权限表达式* @param $type - 1 权限验证 2 勋章字串*/function medalformulaperm($formula, $type) {global $_G;$formula = unserialize($formula);$permmessage = $formula['message'];$formula = $formula['medal'];if(!empty($formula['usergroupallow']) && is_array($formula['usergroups']) && !in_array($_G['groupid'], $formula['usergroups'])) {loadcache('usergroups');$message = array();foreach($formula['usergroups'] as $groupid) {$message[] = $_G['cache']['usergroups'][$groupid]['grouptitle'].' ';}$_G['forum_formulamessage'] = implode(', ', $message);$_G['forum_usermsg'] = $_G['cache']['usergroups'][$_G['groupid']]['grouptitle'];return FALSE;}$formulatext = $formula[0];$formula = $formula[1];if(!$formula) {return FALSE;}if(strexists($formula, '$memberformula[')) {preg_match_all("/\\\$memberformula\['(\w+?)'\]/", $formula, $a);$fields = $profilefields = array();$mfadd = array();foreach($a[1] as $field) {switch($field) {case 'regdate':$formula = preg_replace("/\{(\d{4})\-(\d{1,2})\-(\d{1,2})\}/e", "'\'\\1-'.sprintf('%02d', '\\2').'-'.sprintf('%02d', '\\3').'\''", $formula);case 'regday':$fields[] = 'm.regdate';break;case 'regip':case 'lastip':$formula = preg_replace("/\{([\d\.]+?)\}/", "'\\1'", $formula);$formula = preg_replace('/(\$memberformula\[\'(regip|lastip)\'\])\s*=+\s*\'([\d\.]+?)\'/', "strpos(\\1, '\\3')===0", $formula);case 'buyercredit':case 'sellercredit':$mfadd['ms'] = " LEFT JOIN ".DB::table('common_member_status')." ms ON m.uid=ms.uid";$fields[] = 'ms.'.$field;break;case substr($field, 0, 5) == 'field':$mfadd['mp'] = " LEFT JOIN ".DB::table('common_member_profile')." mp ON m.uid=mp.uid";$fields[] = 'mp.field'.intval(substr($field, 5));$profilefields[] = $field;break;}}$memberformula = array();if($_G['uid']) {$memberformula = DB::fetch_first("SELECT ".implode(',', $fields)." FROM ".DB::table('common_member')." m ".implode('', $mfadd)." WHERE m.uid='$_G[uid]'");if(in_array('regday', $a[1])) {$memberformula['regday'] = intval((TIMESTAMP - $memberformula['regdate']) / 86400);}if(in_array('regdate', $a[1])) {$memberformula['regdate'] = date('Y-m-d', $memberformula['regdate']);}$memberformula['lastip'] = $memberformula['lastip'] ? $memberformula['lastip'] : $_G['clientip'];} else {if(isset($memberformula['regip'])) {$memberformula['regip'] = $_G['clientip'];}if(isset($memberformula['lastip'])) {$memberformula['lastip'] = $_G['clientip'];}}}@eval("\$formulaperm = ($formula) ? TRUE : FALSE;");if(!$formulaperm || $type == 2) {if(!$permmessage) {$language = lang('forum/misc');$search = array('regdate', 'regday', 'regip', 'lastip', 'buyercredit', 'sellercredit', 'digestposts', 'posts', 'threads', 'oltime');$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']);for($i = 1; $i <= 8; $i++) {$search[] = 'extcredits'.$i;$replace[] = $_G['setting']['extcredits'][$i]['title'] ? $_G['setting']['extcredits'][$i]['title'] : $language['formulaperm_extcredits'].$i;}if($profilefields) {loadcache(array('fields_required', 'fields_optional'));foreach($profilefields as $profilefield) {$search[] = $profilefield;$replace[] = !empty($_G['cache']['fields_optional']['field_'.$profilefield]) ? $_G['cache']['fields_optional']['field_'.$profilefield]['title'] : $_G['cache']['fields_required']['field_'.$profilefield]['title'];}}$i = 0;$_G['forum_usermsg'] = '';foreach($search as $s) {if(in_array($s, array('digestposts', 'posts', 'threads', 'oltime', 'extcredits1', 'extcredits2', 'extcredits3', 'extcredits4', 'extcredits5', 'extcredits6', 'extcredits7', 'extcredits8'))) {$_G['forum_usermsg'] .= strexists($formulatext, $s) ? '<br />   '.$replace[$i].': '.(@eval('return intval(getuserprofile(\''.$s.'\'));')) : '';} elseif(in_array($s, array('regdate', 'regip'))) {$_G['forum_usermsg'] .= strexists($formulatext, $s) ? '<br />   '.$replace[$i].': '.(@eval('return $memberformula[\''.$s.'\'];')) : '';}$i++;}$search = array_merge($search, array('and', 'or', '>=', '<=', '=='));$replace = array_merge($replace, array('  <b>'.$language['formulaperm_and'].'</b>  ', '  <b>'.$language['formulaperm_or'].'</b>  ', '≥', '≤', '='));$_G['forum_formulamessage'] = str_replace($search, $replace, $formulatext);} else {$_G['forum_formulamessage'] = $permmessage;}return $_G['forum_formulamessage'];} elseif($formulaperm && $type == 1) {return FALSE;}return TRUE;}/*** vip用户购买组权限是否到期* @param $terms 期限 来源于 memberfields 表的 groupterms 字段* @return 返回过期信息*/function groupexpiry($terms) {$terms = is_array($terms) ? $terms : unserialize($terms);$groupexpiry = isset($terms['main']['time']) ? intval($terms['main']['time']) : 0;if(is_array($terms['ext'])) {foreach($terms['ext'] as $expiry) {if((!$groupexpiry && $expiry) || $expiry < $groupexpiry) {$groupexpiry = $expiry;}}}return $groupexpiry;}/*** 返回当前链接的域名* @return 返回域名*/function site() {return $_SERVER['HTTP_HOST'];}/*** 显示主题分类* @param $curtypeid - 当前被选择的类型id* @return 返回的HTML数据*/function typeselect($curtypeid = 0) {global $_G;if($threadtypes = $_G['forum']['threadtypes']) {$html = '<select name="typeid" id="typeid"><option value="0"> </option>';foreach($threadtypes['types'] as $typeid => $name) {$html .= '<option value="'.$typeid.'" '.($curtypeid == $typeid ? 'selected' : '').'>'.strip_tags($name).'</option>';}$html .= '</select>';return $html;} else {return '';}}/*** 更新管理者状态* @param $modacton - 动作* @param $smcols - 执行次数*/function updatemodworks($modaction, $posts = 1) {global $_G;$today = dgmdate(TIMESTAMP, 'Y-m-d');if($_G['setting']['modworkstatus'] && $modaction && $posts) {DB::query("UPDATE ".DB::table('forum_modwork')." SET count=count+1, posts=posts+'$posts' WHERE uid='$_G[uid]' AND modaction='$modaction' AND dateline='$today'");if(!DB::affected_rows()) {DB::query("INSERT INTO ".DB::table('forum_modwork')." (uid, modaction, dateline, count, posts) VALUES ('$_G[uid]', '$modaction', '$today', 1, '$posts')");}}}/** * 格式化一个sql语句,通常用于update操作 * * @param string $fieldname 字段名称 * @param int $position 位置 * @param int $value 数值 0|1 * @return string */function buildbitsql($fieldname, $position, $value) {$t = " `$fieldname`=`$fieldname`";if($value) {$t .= ' | '.setstatus($position, 1);} else {$t .= ' & '.setstatus($position, 0);}return $t.' ';}function showmessagenoperm($type, $fid, $formula = '') {global $_G;loadcache('usergroups');if($formula) {$formula = unserialize($formula);$permmessage = stripslashes($formula['message']);}$usergroups = $nopermgroup = $forumnoperms = array();$nopermdefault = array('viewperm' => array(),'getattachperm' => array(),'postperm' => array(7),'replyperm' => array(7),'postattachperm' => array(7),);$perms = array('viewperm', 'postperm', 'replyperm', 'getattachperm', 'postattachperm');foreach($_G['cache']['usergroups'] as $gid => $usergroup) {$usergroups[$gid] = $usergroup['type'];$grouptype = $usergroup['type'] == 'member' ? 0 : 1;$nopermgroup[$grouptype][] = $gid;}if($fid == $_G['forum']['fid']) {$forum = $_G['forum'];} else {$forum = DB::fetch_first("SELECT * FROM ".DB::table('forum_forumfield')." WHERE fid='$fid'");}foreach($perms as $perm) {$permgroups = explode("\t", $forum[$perm]);$membertype = $forum[$perm] ? array_intersect($nopermgroup[0], $permgroups) : TRUE;$forumnoperm = $forum[$perm] ? array_diff(array_keys($usergroups), $permgroups) : $nopermdefault[$perm];foreach($forumnoperm as $groupid) {$nopermtype = $membertype && $groupid == 7 ? 'login' : ($usergroups[$groupid] == 'system' || $usergroups[$groupid] == 'special' ? 'none' : ($membertype ? 'upgrade' : 'none'));$forumnoperms[$fid][$perm][$groupid] = array($nopermtype, $permgroups);}}$v = $forumnoperms[$fid][$type][$_G['groupid']][0];$gids = $forumnoperms[$fid][$type][$_G['groupid']][1];$comma = $permgroups = '';if(is_array($gids)) {foreach($gids as $gid) {if($gid && $_G['cache']['usergroups'][$gid]) {$permgroups .= $comma.$_G['cache']['usergroups'][$gid]['grouptitle'];$comma = ', ';} elseif($_G['setting']['verify']['enabled'] && substr($gid, 0, 1) == 'v') {$vid = substr($gid, 1);$permgroups .= $comma.$_G['setting']['verify'][$vid]['title'];$comma = ', ';}}}$custom = 0;if($permmessage) {$message = $permmessage;$custom = 1;} else {if($v) {$message = $type.'_'.$v.'_nopermission';} else {$message = 'group_nopermission';}}showmessage($message, NULL, array('fid' => $fid, 'permgroups' => $permgroups, 'grouptitle' => $_G['group']['grouptitle']), array('login' => 1), $custom);}/** * 依据 tid 或者 fid ,自动取得 $_G['forum'] 或 $_G['thread'] 数据 * @global <type> */function loadforum() {global $_G;$tid = intval(getgpc('tid'));$fid = getgpc('fid');if(!$fid && getgpc('gid')) {$fid = intval(getgpc('gid'));}if(!empty($_G['gp_archiver'])) {//X1.5的Archiver兼容if($fid) {dheader('location: archiver/?fid-'.$fid.'.html');} elseif($tid) {dheader('location: archiver/?tid-'.$tid.'.html');} else {dheader('location: archiver/');}}if(defined('IN_ARCHIVER') && $_G['setting']['archiverredirect'] && !IS_ROBOT) {dheader('location: ../forum.php'.($_G['mod'] ? '?mod='.$_G['mod'].(!empty($_GET['fid']) ? '&fid='.$_GET['fid'] : (!empty($_GET['tid']) ? '&tid='.$_GET['tid'] : '')) : ''));}if($_G['setting']['forumpicstyle']) {$_G['setting']['forumpicstyle'] = unserialize($_G['setting']['forumpicstyle']);empty($_G['setting']['forumpicstyle']['thumbwidth']) && $_G['setting']['forumpicstyle']['thumbwidth'] = 214;empty($_G['setting']['forumpicstyle']['thumbheight']) && $_G['setting']['forumpicstyle']['thumbheight'] = 160;} else {$_G['setting']['forumpicstyle'] = array('thumbwidth' => 214, 'thumbheight' => 160);}if($fid) {$fid = is_numeric($fid) ? intval($fid) : (!empty($_G['setting']['forumfids'][$fid]) ? $_G['setting']['forumfids'][$fid] : 0);}$modthreadkey = isset($_G['gp_modthreadkey']) && $_G['gp_modthreadkey'] == modauthkey($tid) ? $_G['gp_modthreadkey'] : '';$_G['forum_auditstatuson'] = $modthreadkey ? true : false;$accessadd1 = $accessadd2 = $modadd1 = $modadd2 = $metadescription = $hookscriptmessage = '';$adminid = $_G['adminid'];if($_G['uid']) {if($_G['member']['accessmasks']) {$accessadd1 = ', a.allowview, a.allowpost, a.allowreply, a.allowgetattach, a.allowgetimage, a.allowpostattach, a.allowpostimage';$accessadd2 = "LEFT JOIN ".DB::table('forum_access')." a ON a.uid='$_G[uid]' AND a.fid=f.fid";}if($adminid == 3) {$modadd1 = ', m.uid AS ismoderator';$modadd2 = "LEFT JOIN ".DB::table('forum_moderator')." m ON m.uid='$_G[uid]' AND m.fid=f.fid";}}if(!empty($tid) || !empty($fid)) {if(!empty ($tid)) {$archiveid = !empty($_G['gp_archiveid']) ? intval($_G['gp_archiveid']) : null;$_G['thread'] = get_thread_by_tid($tid, '*', '', $archiveid);if(!$_G['forum_auditstatuson'] && !empty($_G['thread'])&& !($_G['thread']['displayorder'] >= 0 || (in_array($_G['thread']['displayorder'], array(-4,-3,-2)) && $_G['thread']['authorid'] == $_G['uid']))) {$_G['thread'] = null;}$_G['forum_thread'] = & $_G['thread'];if(empty($_G['thread'])) {$fid = $tid = 0;} else {$fid = $_G['thread']['fid'];$tid = $_G['thread']['tid'];}}if($fid) {$forum = DB::fetch_first("SELECT f.fid, f.*, ff.* $accessadd1 $modadd1, f.fid AS fidFROM ".DB::table('forum_forum')." fLEFT JOIN ".DB::table("forum_forumfield")." ff ON ff.fid=f.fid $accessadd2 $modadd2WHERE f.fid='$fid'");}if($forum) {$forum['ismoderator'] = !empty($forum['ismoderator']) || $adminid == 1 || $adminid == 2 ? 1 : 0;$fid = $forum['fid'];$gorup_admingroupids = $_G['setting']['group_admingroupids'] ? unserialize($_G['setting']['group_admingroupids']) : array('1' => '1');if($forum['status'] == 3) {if(!$_G['setting']['groupstatus']) {showmessage('group_status_off');}if(!empty($forum['moderators'])) {$forum['moderators'] = unserialize($forum['moderators']);} else {require_once libfile('function/group');$forum['moderators'] = update_groupmoderators($fid);}if($_G['uid'] && $_G['adminid'] != 1) {$forum['ismoderator'] = !empty($forum['moderators'][$_G['uid']]) ? 1 : 0;$_G['adminid'] = 0;if($forum['ismoderator'] || $gorup_admingroupids[$_G['groupid']]) {$_G['adminid'] = $_G['adminid'] ? $_G['adminid'] : 3;if(!empty($gorup_admingroupids[$_G['groupid']])) {$forum['ismoderator'] = 1;$_G['adminid'] = 2;}$group_userperm = unserialize($_G['setting']['group_userperm']);if(is_array($group_userperm)) {$_G['group'] = array_merge($_G['group'], $group_userperm);$_G['group']['allowmovethread'] = $_G['group']['allowcopythread'] = $_G['group']['allowedittypethread']= 0;}}}}foreach(array('threadtypes', 'threadsorts', 'creditspolicy', 'modrecommend') as $key) {$forum[$key] = !empty($forum[$key]) ? unserialize($forum[$key]) : array();if(!is_array($forum[$key])) {$forum[$key] = array();}}if($forum['status'] == 3) {$_G['isgroupuser'] = 0;$_G['basescript'] = 'group';if(empty($forum['level'])) {$levelid = DB::result_first("SELECT levelid FROM ".DB::table('forum_grouplevel')." WHERE creditshigher<='$forum[commoncredits]' AND '$forum[commoncredits]'<creditslower LIMIT 1");$forum['level'] = $levelid;DB::query("UPDATE ".DB::table('forum_forum')." SET level='$levelid' WHERE fid='$fid'");}loadcache('grouplevels');$grouplevel = $_G['grouplevels'][$forum['level']];if(!empty($grouplevel['icon'])) {$valueparse = parse_url($grouplevel['icon']);if(!isset($valueparse['host'])) {$grouplevel['icon'] = $_G['setting']['attachurl'].'common/'.$grouplevel['icon'];}}$group_postpolicy = $grouplevel['postpolicy'];if(is_array($group_postpolicy)) {$forum = array_merge($forum, $group_postpolicy);}$forum['allowfeed'] = $_G['setting']['group_allowfeed'];if($_G['uid']) {if(!empty($forum['moderators'][$_G['uid']])) {$_G['isgroupuser'] = 1;} else {$_G['isgroupuser'] = DB::result_first("SELECT level FROM ".DB::table('forum_groupuser')." WHERE fid='$fid' AND uid='$_G[uid]' LIMIT 1");if($_G['isgroupuser'] <= 0 && empty($forum['ismoderator'])) {$_G['group']['allowrecommend'] = $_G['cache']['usergroup_'.$_G['groupid']]['allowrecommend'] = 0;$_G['group']['allowcommentpost'] = $_G['cache']['usergroup_'.$_G['groupid']]['allowcommentpost'] = 0;$_G['group']['allowcommentitem'] = $_G['cache']['usergroup_'.$_G['groupid']]['allowcommentitem'] = 0;$_G['group']['raterange'] = $_G['cache']['usergroup_'.$_G['groupid']]['raterange'] = array();$_G['group']['allowvote'] = $_G['cache']['usergroup_'.$_G['groupid']]['allowvote'] = 0;} else {$_G['isgroupuser'] = 1;}}}}} else {$fid = 0;}}$_G['fid'] = $fid;$_G['tid'] = $tid;$_G['forum'] = &$forum;$_G['current_grouplevel'] = &$grouplevel;if(isset($_G['cookie']['widthauto']) && $_G['setting']['switchwidthauto'] && empty($_G['forum']['widthauto'])) {$_G['forum_widthauto'] = $_G['cookie']['widthauto'] > 0;} else {$_G['forum_widthauto'] = empty($_G['forum']['widthauto']) ? !$_G['setting']['allowwidthauto'] : $_G['forum']['widthauto'] > 0;if(!empty($_G['forum']['widthauto'])) {$_G['setting']['switchwidthauto'] = 0;}}}/** * * @param <type> $tid 主题id * @param <type> $fields 取用主题表的字段, 默认 "*" * @param <type> $addcondiction 除 tid='$tid' 以外的其他条件, 默认空 * @param <type> $forcetableid 是否强制只从某个分表中取得 thread, 默认 null * @return array 当有合法数值返回的时候, 将自动追加2个key值threadtable, posttable 记录此主题使用的分表名称 */function get_thread_by_tid($tid, $fields = '*', $addcondiction = '', $forcetableid = null) {global $_G;$ret = array();if(!is_numeric($tid)) {return $ret;}loadcache('threadtableids');$threadtableids = array(0);if(!empty($_G['cache']['threadtableids'])) {if($forcetableid === null || ($forcetableid > 0 && !in_array($forcetableid, $_G['cache']['threadtableids']))) {$threadtableids = array_merge($threadtableids, $_G['cache']['threadtableids']);} else {$threadtableids = array(intval($forcetableid));}}foreach($threadtableids as $tableid) {$table = $tableid > 0 ? "forum_thread_{$tableid}" : 'forum_thread';$ret = DB::fetch_first("SELECT $fields FROM ".DB::table($table)." WHERE tid='$tid' $addcondiction LIMIT 1");if($ret) {$ret['threadtable'] = $table;$ret['threadtableid'] = $tableid;$ret['posttable'] = 'forum_post'.($ret['posttableid'] ? '_'.$ret['posttableid'] : '');break;}}if(!is_array($ret)) {$ret = array();}return $ret;}/** * 依据 pid 和 其他条件,从某个post数据表中取回post信息 * @global <type> $_G * @param <type> $pid 帖子id * @param <type> $fields 帖子表字段,默认 * * @param <type> $addcondiction 其他条件,默认 空 * @param <type> $forcetable 是否强制使用某个分表, 支持: 使用id: 0 1 2 或者 p(主表), a(副表) 或者直接制定表名 forum_post_1 * @return array */function get_post_by_pid($pid, $fields = '*', $addcondiction = '', $forcetable = null) {global $_G;$ret = array();if(!is_numeric($pid)) {return $ret;}loadcache('posttable_info');$posttableids = array(0);if($_G['cache']['posttable_info']) {if(isset($forcetable)) {if(is_numeric($forcetable) && array_key_exists($forcetable, $_G['cache']['posttable_info'])) {$posttableids[] = $forcetable;} elseif(substr($forcetable, 0, 10) == 'forum_post') {$posttableids[] = $forcetable;}} else {$posttableids = array_keys($_G['cache']['posttable_info']);}}foreach ($posttableids as $id) {$table = empty($id) ? 'forum_post' : (is_numeric($id) ? 'forum_post_'.$id : $id);$ret = DB::fetch_first("SELECT $fields FROM ".DB::table($table)." WHERE pid='$pid' $addcondiction LIMIT 1");if($ret) {$ret['posttable'] = $table;break;}}if(!is_array($ret)) {$ret = array();}return $ret;}function set_rssauth() {global $_G;if($_G['setting']['rssstatus'] && $_G['uid']) {$auth = authcode($_G['uid']."\t".($_G['fid'] ? $_G['fid'] : '')."\t".substr(md5($_G['member']['password']), 0, 8), 'ENCODE', md5($_G['config']['security']['authkey']));} else {$auth = '0';}$_G['rssauth'] = rawurlencode($auth);}function my_thread_log($opt, $data) {global $_G;    $my_search_data = $_G['setting']['my_search_data'];    if ($my_search_data && !is_array($my_search_data)) {        $my_search_data = unserialize($my_search_data);    }if(!$_G['setting']['my_search_data']) return;$data['action'] = $opt;$data['dateline'] = time();DB::insert('forum_threadlog', $data, false, true);}function my_post_log($opt, $data) {global $_G;    $my_search_data = $_G['setting']['my_search_data'];    if ($my_search_data && !is_array($my_search_data)) {        $my_search_data = unserialize($my_search_data);    }if(!$_G['setting']['my_search_data']) return;$data['action'] = $opt;$data['dateline'] = time();DB::insert('forum_postlog', $data, false, true);}function rssforumperm($forum) {$is_allowed = $forum['type'] != 'group' && (!$forum['viewperm'] || ($forum['viewperm'] && forumperm($forum['viewperm'], 7)));return $is_allowed;}/** *upload_icon_banner上传群组/版块图片 *$forum中 fid和status 必须存在,status判断是群组还是版块图片,以存入不同目录 *$file上传时的$_FILES *$type icon 或 banner */function upload_icon_banner(&$data, $file, $type) {global $_G;$data['extid'] = empty($data['extid']) ? $data['fid'] : $data['extid'];if(empty($data['extid'])) return '';if($data['status'] == 3 && $_G['setting']['group_imgsizelimit']) {$file['size'] > ($_G['setting']['group_imgsizelimit'] * 1024) && showmessage('file_size_overflow', '', array('size' => $_G['setting']['group_imgsizelimit'] * 1024));}require_once libfile('class/upload');$upload = new discuz_upload();$uploadtype = $data['status'] == 3 ? 'group' : 'common';if(!$upload->init($file, $uploadtype, $data['extid'], $type)) {return false;}if(!$upload->save()) {if(!defined('IN_ADMINCP')) {showmessage($upload->errormessage());} else {cpmsg($upload->errormessage(), '', 'error');}}if($data['status'] == 3 && $type == 'icon') {require_once libfile('class/image');$img = new image;$img->Thumb($upload->attach['target'], './'.$uploadtype.'/'.$upload->attach['attachment'], 48, 48, 'fixwr');}return $upload->attach['attachment'];}/**用于 archiver 环境下的分页*/function arch_multi($total, $perpage, $page, $link) {$pages = @ceil($total / $perpage) + 1;$pagelink = '';if($pages > 1) {$pagelink .= lang('forum/archiver', 'page') . ": \n";$pagestart = $page - 10 < 1 ? 1 : $page - 10;$pageend = $page + 10 >= $pages ? $pages : $page + 10;for($i = $pagestart; $i < $pageend; $i++) {$pagelink .= ($i == $page ? "<strong>[$i]</strong>" : "<a href=\"$link&page=$i\">$i</a>")." \n";}}return $pagelink;}/**archiver 模板路径*/function loadarchiver($path) {global $_G;if(!$_G['setting']['archiver']) {require_once DISCUZ_ROOT . "./source/archiver/common/header.php";echo '<div id="content">'.lang('message', 'forum_archiver_disabled').'</div>';require_once DISCUZ_ROOT . "./source/archiver/common/footer.php";exit;}$filename = $path . '.php';return DISCUZ_ROOT . "./source/archiver/$filename";}/** *update_threadpartake 按参与人次更新主题热度 */function update_threadpartake($tid) {global $_G;if($_G['uid'] && $tid) {if($_G['setting']['heatthread']['period']) {$partaked = DB::result_first("SELECT uid FROM ".DB::table('forum_threadpartake')." WHERE tid='$tid' AND uid='$_G[uid]'");if(!$partaked) {DB::query("INSERT INTO ".DB::table('forum_threadpartake')." (tid, uid, dateline) VALUES ('$tid', '$_G[uid]', ".TIMESTAMP.")");DB::query("UPDATE ".DB::table('forum_thread')." SET heats=heats+1 WHERE tid='$tid'", 'UNBUFFERED');}} else {DB::query("UPDATE ".DB::table('forum_thread')." SET heats=heats+1 WHERE tid='$tid'", 'UNBUFFERED');}}}/** * 获取帖子封面地址 * * @param int $tid * @param int $cover 负数时表示是远程,正数为本地 没有值表示只取filename */function getthreadcover($tid, $cover = 0, $getfilename = 0) {global $_G;if(empty($tid)) {return '';}$coverpath = '';$covername = 'threadcover/'.substr(md5($tid), 0, 2).'/'.substr(md5($tid), 2, 2).'/'.$tid.'.jpg';if($getfilename) {return $covername;}if($cover) {$coverpath = ($cover < 0 ? $_G['setting']['ftp']['attachurl'] : $_G['setting']['attachurl']).'forum/'.$covername;}return $coverpath;}/** *添加主题标签 * * @param <type> $tags * @param <type> $itemid */function addthreadtag($tags, $itemid , $typeid = 'tid') {global $_G;if($tags == '') {return;}$tags = str_replace(array(chr(0xa3).chr(0xac), chr(0xa1).chr(0x41), chr(0xef).chr(0xbc).chr(0x8c)), ',', censor($tags));if(strexists($tags, ',')) {$tagarray = array_unique(explode(',', $tags));} else {$langcore = lang('core');$tags = str_replace($langcore['fullblankspace'], ' ', $tags);$tagarray = array_unique(explode(' ', $tags));}$tagcount = 0;foreach($tagarray as $tagname) {$tagname = trim($tagname);if(preg_match('/^([\x7f-\xff_-]|\w|\s){3,20}$/', $tagname)) {$result = DB::fetch_first("SELECT tagid, status FROM ".DB::table('common_tag')." WHERE tagname='$tagname'");if($result['tagid']) {if(!$result['status']) {$tagid = $result['tagid'];}} else {DB::query("INSERT INTO ".DB::table('common_tag')." (tagname, status) VALUES ('$tagname', '0')");$tagid = DB::insert_id();}if($tagid) {DB::query("INSERT INTO ".DB::table('common_tagitem')." (tagid, tagname, itemid, idtype) VALUES ('$tagid', '$tagname', '$itemid', '$typeid')");$tagcount++;$tagstr .= $tagid.','.$tagname.'\t';}if($tagcount > 4) {unset($tagarray);break;}}}return $tagstr;}/** *修改主题标签 * * @param <type> $tags * @param <type> $itemid * @return <type> */function modthreadtag($tags, $itemid) {global $_G;$thread = & $_G['forum_thread'];$posttable = $thread['posttable'];$tagstr = DB::result_first("SELECT tags FROM ".DB::table($posttable)." WHERE tid='$itemid' AND first=1");$threadtagarray = $threadtagidarray = $threadtagarraynew = array();$query = DB::query("SELECT tagid, tagname FROM ".DB::table('common_tagitem')." WHERE idtype='tid' AND itemid='$itemid'");while($result = DB::fetch($query)) {$threadtagarray[] = $result['tagname'];$threadtagidarray[] = $result['tagid'];}$tags = str_replace(array(chr(0xa3).chr(0xac), chr(0xa1).chr(0x41), chr(0xef).chr(0xbc).chr(0x8c)), ',', censor($tags));if(strexists($tags, ',')) {$tagarray = array_unique(explode(',', $tags));} else {$langcore = lang('core');$tags = str_replace($langcore['fullblankspace'], ' ', $tags);$tagarray = array_unique(explode(' ', $tags));}$tagcount = 0;foreach($tagarray as $tagname) {$tagname = trim($tagname);if(preg_match('/^([\x7f-\xff_-]|\w|\s){3,20}$/', $tagname)) {$threadtagarraynew[] = $tagname;if(!in_array($tagname, $threadtagarray)) {$result = DB::fetch_first("SELECT tagid, status FROM ".DB::table('common_tag')." WHERE tagname='$tagname'");if($result['tagid']) {if(!$result['status']) {$tagid = $result['tagid'];}} else {DB::query("INSERT INTO ".DB::table('common_tag')." (tagname, status) VALUES ('$tagname', '0')");$tagid = DB::insert_id();}if($tagid) {DB::query("INSERT INTO ".DB::table('common_tagitem')." (tagid, tagname, itemid, idtype) VALUES ('$tagid', '$tagname', '$itemid', 'tid')");$tagstr = $tagstr.$tagid.','.$tagname.'\t';}}}$tagcount++;if($tagcount > 4) {unset($tagarray);break;}}foreach($threadtagarray as $key => $tagname) {if(!in_array($tagname, $threadtagarraynew)) {DB::query("DELETE FROM".DB::table('common_tagitem')." WHERE idtype='tid' AND itemid = '$itemid' AND tagname='$tagname'");$tagid = $threadtagidarray[$key];$tagstr = str_replace("$tagid,$tagname\t", '', $tagstr);}}return $tagstr;}/** * 将未使用的附件转为已使用状态 * @param <int> $aid * @param <int> $tid * @param <pid> $pid */function convertunusedattach($aid, $tid, $pid) {if(!$aid) {return;}global $_G;$attach = DB::fetch_first("SELECT * FROM ".DB::table('forum_attachment_unused')." WHERE aid='$aid' AND uid='$_G[uid]'");if(!$attach) {return;}$attach = daddslashes($attach);$attach['tid'] = $tid;$attach['pid'] = $pid;DB::insert(getattachtablebytid($tid), $attach, false);DB::update('forum_attachment', array('tid' => $tid, 'pid' => $pid, 'tableid' => getattachtableid($tid)), "aid='$attach[aid]'");DB::delete('forum_attachment_unused', "aid='$attach[aid]'");}/** * 更新附件的 TID 值 * @param <string> $where 条件 * @param <int> $oldtid 旧 TID * @param <int> $newtid  新 TID */function updateattachtid($where, $oldtid, $newtid) {$oldattachtable = getattachtablebytid($oldtid);$newattachtable = getattachtablebytid($newtid);if($oldattachtable != $newattachtable) {$query = DB::query("SELECT * FROM ".DB::table($oldattachtable)." WHERE $where");while($attach = DB::fetch($query)) {$attach = daddslashes($attach);$attach['tid'] = $newtid;DB::insert($newattachtable, $attach);}DB::delete($oldattachtable, $where);}DB::query("UPDATE ".DB::table('forum_attachment')." SET tid='$newtid',tableid='".getattachtableid($newtid)."' WHERE $where");}/** * 更新POST * @global  $_G * @param array $data 更新的数据 * @param string/array $condition 条件 * @param bool $unbuffered 是否即时返回 * @param int $posttableid post分表ID * @return int 返回的更新的记录数 */function updatepost($data, $condition, $unbuffered = false, $posttableid = false) {global $_G;loadcache('posttableids');$affected_rows = 0;if(!empty($_G['cache']['posttableids'])) {$posttableids = $posttableid !== false && in_array($posttableid, $_G['cache']['posttableids']) ? array($posttableid) : $_G['cache']['posttableids'];} else {$posttableids = array('0');}foreach($posttableids as $id) {DB::update(getposttable($id), $data, $condition, $unbuffered);$affected_rows += DB::affected_rows();}return $affected_rows;}/**    插入一个帖子*/function insertpost($data) {if(isset($data['tid'])) {$tableid = DB::result_first("SELECT posttableid FROM ".DB::table('forum_thread')." WHERE tid='{$data['tid']}'");} else {$tableid = $data['tid'] = 0;}$pid = DB::insert('forum_post_tableid', array('pid' => null), true);if(!$tableid) {$tablename = 'forum_post';} else {$tablename = "forum_post_$tableid";}$data = array_merge($data, array('pid' => $pid));DB::insert($tablename, $data);if($pid % 1024 == 0) {DB::delete('forum_post_tableid', "pid<$pid");}save_syscache('max_post_id', $pid);return $pid;}?>

原创粉丝点击