【原】discuz! 7.2 超详细代码解析(2)
2011-09-28 17:17
375 查看
2010年07月16日 星期五 20:30
由于某度众所周知的举动,让我搬离写了5年的渣度空间,准备把技术性的文章定在CSDN了。这些都是文章备份。勿怪。。
鉴于最近有些抓取机器和抄袭者,把标题的【原】字都复制,我不得不声明:本文为 yukon12345原创,转载请注明出处http://blog.csdn.net/yukon12345
由于某度众所周知的举动,让我搬离写了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(); }
相关文章推荐
- 【原】discuz! 7.2 超详细代码解析(1)
- 【原】discuz! 7.2 超详细代码解析(3)
- Eclipse创建Hibernate入门实例代码详细解析
- Discuz!NT 代码阅读笔记(9)--DNT数据库中唯一的用户函数解析
- HDU 5355 Cake (WA后AC代码,详细解析,构造题)
- 机器学习实战+统计学习方法之理解KNN(1.实战代码的详细走读和解析)
- (转)Android JSON解析详解(详细代码)
- Discuz!X模板代码解析--Header(头文件)
- 基于粒子滤波器的目标跟踪算法基础(Rob Hess代码详细解析)第一部分
- 详细解读PHP解析XML元素结构的代码示例
- java客户端http报文发送和解析的详细代码
- 属性动画,代码详细解析
- 转载:discuz代码解析(一、初始化应用的过程)
- swift:使用NSJSONSerialization解析本地json数据文件(代码详细注释)
- Web Service学习笔记(webservice、soap、wsdl、jws详细分析) Webservice的wsdl文件解析与Soap消息的发送、接收(不生成java客户端代码)
- 属性动画,代码详细解析
- ROI Pooling层解析_代码原理详细解释和存在目的
- DZ论坛横排美化,代码详细分析[Discuz 7.0]
- android Json解析详解(详细代码)
- discuz代码解析-初始化过程