【原】discuz! 7.2 超详细代码解析(2)

2010年07月16日 星期五 20:30

由于某度众所周知的举动,让我搬离写了5年的渣度空间,准备把技术性的文章定在CSDN了。这些都是文章备份。勿怪。。

鉴于最近有些抓取机器和抄袭者,把标题的【原】字都复制,我不得不声明:本文为 yukon12345原创,转载请注明出处http://blog.csdn.net/yukon12345

$announcepm还是在cache_settings.php中的被extract的变量,私信条数,默认为0。
if($announcepm && !in_array('announcepm', $disableprompt)) {
$prompts['announcepm']['new'] = $announcepm;
}
//lastvisit,上次访问时间。在members表中。空就设置成此时-24小时时间戳
$lastvisit = empty($lastvisit) ? $timestamp - 86400 : $lastvisit;
//这是兼容老版本时区设置时用的。
$timenow = array('time' => gmdate("$dateformat $timeformat", $timestamp + 3600 * $timeoffset),
'offset' => ($timeoffset >= 0 ? ($timeoffset == 0 ? '' : '+'.$timeoffset) : $timeoffset));

if(PHP_VERSION > '5.1') {
@date_default_timezone_set('Etc/GMT'.($timeoffset > 0 ? '-' : '+').(abs($timeoffset)));
}

$accessadd1 = $accessadd2 = $modadd1 = $modadd2 = $metadescription = $hookscriptmessage = '';
//过滤cookie传入的$discuz_uid等
if(empty($discuz_uid) || empty($discuz_user)) {
$discuz_user = $extgroupids = '';
$discuz_uid = $adminid = $posts = $digestposts = $pageviews = $oltime = $invisible
= $credits = $extcredits1 = $extcredits2 = $extcredits3 = $extcredits4
= $extcredits5 = $extcredits6 = $extcredits7 = $extcredits8 = 0;
//groupid用户组。7为访客,6为禁止ip usergroup表中。
$groupid = empty($groupid) || $groupid != 6 ? 7 : 6;

} else {
//$discuz_userss为被显示的用户名
$discuz_userss = $discuz_user;
$discuz_user = addslashes($discuz_user);
//accessmask,为members表中字段。权限掩码。默认为0,标示一个用户是否有被单独屏蔽的权限。
//下面2个if用来拼装sql语句。留到当帖子id或版块id不空时候查询
if($accessmasks) {
//如果有禁止权限,左联合access表查找此uid账号的具体权限
$accessadd1 = ', a.allowview, a.allowpost, a.allowreply, a.allowgetattach, a.allowpostattach';
$accessadd2 = "LEFT JOIN {$tablepre}access a ON a.uid='$discuz_uid' AND a.fid=f.fid";
}

if($adminid == 3) {//如果是审帖员,网站编辑之类的。查询在哪个版块。类似小吧主。比版主,管理员之类的权限低
//左联合查询此id是属于哪个版块的小吧主。
$modadd1 = ', m.uid AS ismoderator';
$modadd2 = "LEFT JOIN {$tablepre}moderators m ON m.uid='$discuz_uid' AND m.fid=f.fid";
}
}
//adminid为用户权限标示。>0为管理层,=0为普通用户。
if($errorreport == 2 || ($errorreport == 1 && $adminid > 0)) {
error_reporting(E_ERROR | E_WARNING | E_PARSE);
}
//返回一个md5加密的拼装值。在global.func.php中。
define('FORMHASH', formhash());
//statstatus在cache_settings.php中,默认1,用来标记是否记录访问者信息。
$statstatus && !$inajax && require_once DISCUZ_ROOT.'./include/counter.inc.php';
//附加信息。检测$extra是否是只含下面正则的字串.否则为空。$extra是用来存储url后附加参数的。比如第几页。
$extra = isset($extra) && @preg_match("/^[&=;a-z0-9]+$/i", $extra) ? $extra : '';

$rsshead = $navtitle = $navigation = '';
//ipbanned来自members表中。这句是如果被禁止ip,groupid就为6(禁止ip),如果groupid是空的话用户组为7(游客)具体id对应值在usergroups表中。
$_DSESSION['groupid'] = $groupid = empty($ipbanned) ? (empty($groupid) ? 7 : intval($groupid)) : 6;

//对用户组id引入用户权限文件。默认使用文件中的。加载不正确就从库里找。
if(!@include DISCUZ_ROOT.'./forumdata/cache/usergroup_'.$groupid.'.php') {
$grouptype = $db->result_first("SELECT type FROM {$tablepre}usergroups WHERE groupid='$groupid'");
if(!empty($grouptype)) {
//标记cachelost,添加一段usergroup字符串。
$cachelost .= ' usergroup_'.$groupid;
} else {
$grouptype = 'member';
}
}

/*
$link_login = 'logging.php?action=login';
$link_logout = 'logging.php?action=logout&formhash='.FORMHASH;
$link_register = $regname;
*/

if($discuz_uid && $_DSESSION) {//登陆了。
//groupexpiry在members表中。用来标示即将到期的用户组。通常是活动或付费什么原因提升用户组,但到期后就取消。
if(!empty($groupexpiry) && $groupexpiry < $timestamp && !in_array(CURSCRIPT, array('wap', 'member'))) {
dheader("Location: {$boardurl}member.php?action=groupexpiry");
} elseif($grouptype && $groupid != getgroupid($discuz_uid, array
(
'type' => $grouptype,
//groupcreditshigher在forumdata/cache/admingroup_x.php中载入设置。
'creditshigher' => $groupcreditshigher,
'creditslower' => $groupcreditslower
), $_DSESSION)) {//如果没过期,并且$groupid不=处理过后的$groupid,就
//从index引入的角度来看,getgroupid返回的肯定是等于$groupid的。
//貌似是计算积分,然后是看否准许干某事。
@extract($_DSESSION);
$cachelost .= (@include DISCUZ_ROOT.'./forumdata/cache/usergroup_'.intval($groupid).'.php') ? '' : ' usergroup_'.$groupid;
}
}

if(!in_array($adminid, array(1, 2, 3))) {
//如果不是管理组,设置下面的权限为空,
$alloweditpost = $alloweditpoll = $allowstickthread = $allowmodpost = $allowdelpost = $allowmassprune
= $allowrefund = $allowcensorword = $allowviewip = $allowbanip = $allowedituser = $allowmoduser
= $allowbanuser = $allowpostannounce = $allowviewlog = $disablepostctrl = 0;
} elseif(isset($radminid) && $adminid != $radminid && $adminid != $groupid) {
//如果是管理组,就引入管理组设置缓存页面
$cachelost .= (@include DISCUZ_ROOT.'./forumdata/cache/admingroup_'.intval($adminid).'.php') ? '' : ' admingroup_'.$groupid;
}

//$page第几页,$tid帖子id,fid版块id,typeid帖子类型
$page = isset($page) ? max(1, intval($page)) : 1;
$tid = isset($tid) && is_numeric($tid) ? $tid : 0;
$fid = isset($fid) && is_numeric($fid) ? $fid : 0;
$typeid = isset($typeid) ? intval($typeid) : 0;
$tpp = intval(empty($_DSESSION['tpp']) ? $topicperpage : $_DSESSION['tpp']);
$ppp = intval(empty($_DSESSION['ppp']) ? $postperpage : $_DSESSION['ppp']);
//
$modthreadkey = isset($modthreadkey) && $modthreadkey == modthreadkey($tid) ? $modthreadkey : '';
$auditstatuson = $modthreadkey ? true : false;
//当帖子id或版块id只要有1个不空。
if(!empty($tid) || !empty($fid)) {
if(empty($tid)) {//只有有fid时。转即为版面。从forums表中取一些权限相关数据。此文件中$accessadd1 $modadd1是之前所设定好的查询语句。
$forum = $db->fetch_first("SELECT f.fid, f.*, ff.* $accessadd1 $modadd1, f.fid AS fid
FROM {$tablepre}forums f
LEFT JOIN {$tablepre}forumfields ff ON ff.fid=f.fid $accessadd2 $modadd2
WHERE f.fid='$fid'");
} else {//有tid时,数据库查找具体一个帖子是否关闭,用户的发帖,修改,上传附件,下载附件,判断用户所在组的操作权限。等
$forum = $db->fetch_first("SELECT t.tid, t.closed,".(defined('SQL_ADD_THREAD') ? SQL_ADD_THREAD : '')." f.*, ff.* $accessadd1 $modadd1, f.fid AS fid
FROM {$tablepre}threads t
INNER JOIN {$tablepre}forums f ON f.fid=t.fid
LEFT JOIN {$tablepre}forumfields ff ON ff.fid=f.fid $accessadd2 $modadd2
WHERE t.tid='$tid'".($auditstatuson ? '' : " AND t.displayorder>='0'")." LIMIT 1");
$tid = $forum['tid'];
}

if($forum) {
$fid = $forum['fid'];
//判断是否是此版版主。$forum['ismoderator']实际上是根据上面的查询语句,左联合moderators表查出的。
//如果是,就把adminid置1。成管理层
$forum['ismoderator'] = !empty($forum['ismoderator']) || $adminid == 1 || $adminid == 2 ? 1 : 0;
foreach(array('postcredits', 'replycredits', 'threadtypes', 'threadsorts', 'digestcredits', 'postattachcredits', 'getattachcredits', 'modrecommend') as $key) {
$forum[$key] = !empty($forum[$key]) ? unserialize($forum[$key]) : array();
}
} else {//查询失败,就fid=0。返回总版。
$fid = 0;
}
}
//sytleid是网站模板id。在后台设置界面,安装了就会出现。这是按GPSC优先次序取得id值
$styleid = intval(!empty($_GET['styleid']) ? $_GET['styleid'] :
(!empty($_POST['styleid']) ? $_POST['styleid'] :
(!empty($_DSESSION['styleid']) ? $_DSESSION['styleid'] :
$_DCACHE['settings']['styleid'])));

//如果$styles数组对应的styleid不存在,那么使用cache_settings.php设置的默认styleid
$styleid = intval(isset($styles[$styleid]) ? $styleid : $_DCACHE['settings']['styleid']);

//引入相应的风格页面。里面有一堆常量定义各种样式。
if(@!include DISCUZ_ROOT.'./forumdata/cache/style_'.intval(!empty($forum['styleid']) ? $forum['styleid'] : $styleid).'.php') {
//如果载入默认风格还是失败,写入缓存缺失字串
$cachelost .= (@include DISCUZ_ROOT.'./forumdata/cache/style_'.($styleid = $_DCACHE['settings']['styleid']).'.php') ? '' : ' style_'.$styleid;
}

if($cachelost) {//当有缓存缺失。使用缓存恢复函数。创建相关页面
require_once DISCUZ_ROOT.'./include/cache.func.php';
updatecache();
exit('Cache List: '.$cachelost.'<br />Caches successfully created, please refresh.');
}
//不是手机页面时候
if(CURSCRIPT != 'wap') {
//nocacheheaders由缓存页面cache_settings.PHP引入。默认为0。作用:通知浏览器不缓存
if($nocacheheaders) {
@dheader("Expires: 0");
@dheader("Cache-Control: private, post-check=0, pre-check=0, max-age=0", FALSE);
@dheader("Pragma: no-cache");
}
if($headercharset) {//页面编码。config.INC.PHP页面引入。
@dheader('Content-Type: text/html; charset='.$charset);
}
if(empty($_DCOOKIE['sid']) || $sid != $_DCOOKIE['sid']) {
//cookie中的sid和页面中的sid不同时(比如重新登录另一个号),重设cookie。
dsetcookie('sid', $sid, 604800, 1, true);
}
}

$_DCOOKIE['loginuser'] = !empty($_DCOOKIE['loginuser']) ? substr(htmlspecialchars($_DCOOKIE['loginuser']), 0, 15) : '';
//每日定时清空一些统计数据
if($cronnextrun && $cronnextrun <= $timestamp) {
require_once DISCUZ_ROOT.'./include/cron.func.php';
runcron();
}
//广告相关。根据缓存页面引入广告。
if((!empty($_DCACHE['advs']) || $globaladvs) && !defined('IN_ADMINCP')) {
require_once DISCUZ_ROOT.'./include/advertisements.inc.php';
}
//插件相关。暂时不知道$plugins['include']从何处而来
if(isset($plugins['include']) && is_array($plugins['include'])) {
foreach($plugins['include'] as $pluginid => $include) {
//遍历include数组
if(!$include['adminid'] || ($include['adminid'] && $adminid > 0 && $include['adminid'] >= $adminid)) {
if(@in_array($pluginid, $pluginlangs)) {
@include_once DISCUZ_ROOT.'./forumdata/cache/cache_scriptlang.php';
}
@include_once DISCUZ_ROOT.'./plugins/'.$include['script'].'.inc.php';
}
}
}


//$allowvisit检测是否有访问权限(forumdata/cache/usergroup_x.php定义)
//并且member页面的action参数不为groupexpiry(限时用户组到期)或者activate(待审核用户)【url参数定义】
if(isset($allowvisit) && $allowvisit == 0 && !(CURSCRIPT == 'member' && ($action == 'groupexpiry' || $action == 'activate'))) {
showmessage('user_banned', NULL, 'HALTED');
} elseif(!(in_array(CURSCRIPT, array('logging', 'wap', 'seccode', 'ajax')) || $adminid == 1)) {

//设置当设坛关闭时,上述页面(管理员也无法访问),另外任何页面除(管理员)其他人不可访问
if($bbclosed) {//论坛关闭标示(cache_SETTINGS.PHP)
clearcookies();
$closedreason = $db->result_first("SELECT value FROM {$tablepre}settings WHERE variable='closedreason'");
//显示论坛关闭原因
showmessage($closedreason ? $closedreason : 'board_closed', NULL, 'NOPERM');
}
//而在非上述页面或者非管理员时
//下面这个函数确认论坛各种功能的开放时间。后台可以设置各功能提供使用的时间段。
//可供选的有4种限制:搜索的开放时间段,发帖,看帖,附件时间段。
periodscheck('visitbanperiods');
}



//如果$fromuid或$fromuser不空,那么就是从推广链接来的。当被推广来的人注册成为会员时,执行
if((!empty($fromuid) || !empty($fromuser)) && ($creditspolicy['promotion_visit'] || $creditspolicy['promotion_register'])) {
require_once DISCUZ_ROOT.'/include/promotion.inc.php';
}
//uchome会员中心,订阅相关。index里暂时用不到。
if($uchome['addfeed']) {
//检查customaddfeed是否为-1(不开放订阅)
$customaddfeed = $customaddfeed == '-1' ? 0 : ($customaddfeed == 0 ? $uchome['addfeed'] : intval($customaddfeed));
} else {
$customaddfeed = 0;
}

$rssauth = $rssstatus && $discuz_uid ? rawurlencode(authcode("$discuz_uid\t".($fid ? $fid : '')."\t".substr(md5($discuz_pw.$discuz_secques), 0, 8), 'ENCODE', md5($_DCACHE['settings']['authkey']))) : '0';
$transferstatus = $transferstatus && $allowtransfer;
$feedpostnum = $feedpostnum && $uchomeurl ? intval($feedpostnum) : 0;

$pluginhooks = array();
if(isset($hookscript[CURSCRIPT]['module'])) {
hookscript(CURSCRIPT);
}

if($discuz_uid && $newbietaskupdate && $lastactivity < $newbietaskupdate) {
require_once DISCUZ_ROOT.'./include/task.func.php';
task_newfunction_autoapply();
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值