loadforum();
第53行左右的这句代码,我们需要细究一下!
loadforum()函数的功能很强大,它负责取BBS板块和用户的相关数据!大家可以debug一下,查看一下它的细节!整体结构还算清晰!
当用户未登录,请求中未指定fid和tid的时候,它其实什么都没做,只是简单的给相关数据赋空值而已!如果用户处在登录状态呢,注意下面这段代码:
if($_G['uid']) {
if($_G['member']['accessmasks']) {
$accessadd1 = ', a.allowview, a.allowpost, a.allowreply, a.allowgetattach, 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";
}
}
看得出来,如果有uid,那么就在取该论坛数据的时候加上left join语句,同时取出匹配条件(a.uid='$_G[uid]' AND a.fid=f.fid或m.uid='$_G[uid]' AND m.fid=f.fid)的用户配置!对照着数据字典,可以看出查出来的这些字段都是用来控制对指定BBS板块的操作权限的,例如是否有权限浏览,发表,回复,下载或上传附件等操作!
如果请求的是某一个板块,那么执行的就是这条语句:
$forum = DB::fetch_first("SELECT f.fid, f.*, ff.* $accessadd1 $modadd1, f.fid AS fid
FROM ".DB::table('forum_forum')." f
LEFT JOIN ".DB::table("forum_forumfield")." ff ON ff.fid=f.fid $accessadd2 $modadd2
WHERE f.fid='$fid'");
很给力吧,取出指定板块的所有配置数据,对比数据字典中的对应表,可以发现DX允许为每个板块提供相当细腻的定制!
如果请求的是某一个主题贴,那么要做的事儿就更复杂了:
loadcache('threadtableids');
如果请求的是主题帖,那么DX首先就要确定这个贴的数据存在哪个表中,因为DX对帖子的存放方式用到了分表,而上面一行代码就是为了取得所有分表的编号,接下来的几十行都是根据tid(帖子ID)和threadtable(帖子所在的表)来查找,注意的是这里只是取出了帖子的tid和closed字段,closed字段的作用是判断该主题帖是否关闭状态,当然除了帖子的这两个数据,还取了用户和主题所在版块的配置数据,这点和上面讲到的加载版块的方法一样!
现在$forum中就存放着项目所需要的数据,这里loadforum()函数会通过$forum['status']的状态来进行不同的处理,这个status字段在数据字典中提示的作用是:显示状态(0:隐藏,1:正常,2只显示子版块,3:群组)!
如果是该版块的类型是群组,那么首先就是取出这个群组里的成员列表:
if(!empty($forum['moderators'])) {
$forum['moderators'] = unserialize($forum['moderators']);
} else {
require_once libfile('function/group');
$forum['moderators'] = update_groupmoderators($fid);
}
有兴趣的朋友可以仔细分析一下update_groupmoderators()函数,它其实做了很多工作!包括查询和更新数据库!
接下来loadforum()做的就是判断目前的请求用户是否具有该群组的管理权限!然后如果是群组类型的版块,它还会取这个群组的等级(根据该群组的公共积分所在的群组等级积分范围):$forum['level']
确定群组的等级后,还要做的就是取出管理员定义的这个等级的相关数据,例如:等级徽章等相关配置数据!
最后还要为$_G['isgroupuser']初始化一个正确的值(1 or 0),它用来表述该请求用户是否是群组成员。
到此为止
loadforum();
最新推荐文章于 2024-07-10 22:41:59 发布