Discuz X:家园底层逻辑浅析(1)

Discuz X:家园底层逻辑浅析(1)

作者:Garry 发布于:2012-3-23 10:31 Friday 分类:代码研究

首发于:http://www.PHPig.net,转载请注明。

点击X的家园,看到连接是home.php,下面就看看这个文件。

01 define('APPTYPEID', 1);
02 define('CURSCRIPT''home');
03  
04 require_once './source/class/class_core.php'//循例的,加载核心
05 require_once './source/function/function_home.php'//加载函数库
06  
07 $discuz = & discuz_core::instance(); //实例化
08  
09 //核心类
10 $cachelist array('magic','userapp','usergroups''blockclass'); //这些应该是需要缓存的内容吧
11 $discuz->cachelist = $cachelist;
12 $discuz->init();
13  
14 //初始化
15 $space array();
16  
17 //脚本引导
18 $mod = getgpc('mod'); //取得GP中mod的值,例如url中mod=space中的space
19 if(!in_array($modarray('space''spacecp''misc''magic''editor''userapp','invite''task''medal'))) {
20     $mod 'space'//默认mod=space
21     $_GET['do'] = 'home'//默认do=home
22 }
23  
24 define('CURMODULE'$mod); //定义常量为mod的值,默认为space
25 runhooks();
26  
27 require_once libfile('home/'.$mod'module'); //所以说点击‘家园’后,默认的访问的文件就是source/module/home/home_space.php,其实家园就是‘我的中心’
28 ?>

 

home_space.php,看看这个文件

01 if(!defined('IN_DISCUZ')) { //这个常量是在class_core.php定义的。在home.php已经包含过了,所以说只能通过home.php来访问,不能直接通过绝对路径访问。
02     exit('Access Denied');
03 }
04  
05 $uid empty($_GET['uid']) ? 0 : intval($_GET['uid']); //判断uid的值
06  
07 //跳转,特别注意这里的$uid是被访问者的uid。
08 if($_GET['username']) { //根据username取得uid
09     $member = DB::fetch_first("SELECT uid FROM ".DB::table('common_member')." WHERE username='$_GET[username]' LIMIT 1");
10     $uid $member['uid'];
11 elseif ($_GET['domain']) { //根据domain取得uid
12     $member = DB::fetch_first("SELECT uid FROM ".DB::table('common_member_field_home')." WHERE domain='$_GET[domain]' LIMIT 1");
13     $uid $member['uid'];
14 }
15  
16 //允许动作
17 $dos array('index''doing''blog''album''friend''wall',
18     'notice''share''home''pm''videophoto''top''favorite',
19     'thread''trade''poll''activity''debate''reward''group''profile');
20  
21 //获取变量,默认do=index时,为个人空间
22 $do = (!empty($_GET['do']) && in_array($_GET['do'], $dos))?$_GET['do']:'index';
23  
24 //获取空间
25 if(empty($uid)) $uid $_G['uid']; //如果不能根据url的username或domain取得uid的话,就默认为访问者的uid,home.php?mod=space&do=index&username=admin,访问的就是admin的个人空间
26  
27 if($uid) {
28     $space = getspace($uid'uid');
29     if(empty($space)) {
30         showmessage('space_does_not_exist');
31     }
32 }
33  
34 if(empty($space)) {
35     //游客
36     if(in_array($doarray('doing''blog''album''share''home''thread''trade','poll''activity''debate''reward''group'))) {
37         $_GET['view'] = 'all';
38         $space['uid'] = 0;
39     else {
40         showmessage('login_before_enter_home''member.php?mod=logging&action=login');
41     }
42 else {
43  
44     //验证空间是否被锁定
45     if($space['status'] == -1) {
46         showmessage('space_has_been_locked');
47     }
48  
49     //隐私检查
50     if(!ckprivacy($do'view')) { //这里我们后面仔细看看隐私是什么判断的。
51         include template('home/space_privacy');
52         exit();
53     }
54      
55     //别人默认查看自己
56     if(!$space['self']) $_GET['view'] = 'me';
57      
58     //用户应用菜单
59     get_my_userapp();
60      
61     //漫游默认应用
62     get_my_app();
63 }
64  
65 //diy
66 $diymode = 0;
67  
68 //验证码开关
69 $seccodecheck $_G['setting']['seccodestatus'] & 4;
70 $secqaacheck $_G['setting']['secqaa']['status'] & 2;
71  
72 //处理
73 require_once libfile('space/'.$do'include');
74  
75 ?>

 

整理一下,
点‘家园’,实际就是访问home.php,也就是home.php?mod=space&do=home,具体文件是source/module/home/home_space.php,如果do没有或者参数不在允许范围,则home.php?mod=space访问的是home.php?mod=space&do=index,‘个人空间’,也就是别人访问你的那个空间。是不是很绕,事实就是这么绕。
反正记住,do=home是我的中心,do=index是个人空间,这里的do也可以是Doing,album等。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值