Discuz论坛首页五格修改代码解析之一(index.php)来自网上!!共享给大家!
这是参考别人的代码修改来的,发现大家对首页修改都挺感兴趣,我就把首页五格代码解释说明一下。我是写.NET程序的,因为觉得Discuz论坛不错,所以用这套系统来构建了这个网站,也是刚接触PHP,主要是写给初学者看的,有不对的地方,还请PHP高手指教。
下面开始,我做的这个五格主要修改了两个文件,index.php,discuz.htm,添加了pic.php,还有pixviewer.swf。
index.php和discuz.htm的关系有点像.NET里面的Code behind,显示结果由aspx页面负责,数据处理由cs文件负责。这里index.php负责定义各种变量,调用数据库获取各种数据,discuz.htm加上css样式表文件就负责把index.php里面的数据按一定的样式显示出来。所以你要修改首页各个区域的功能或者数据就要修改index.php,修改首页的显示样式就修改discuz.htm。
Discuz论坛的换肤功能也是基于这种原理实现的,我们下载的模版文件里面都是一些定义了位置和样式的htm和css文件,而论坛的代码不用修改,因为逻辑和数据不变。经典的MVC模式也是一样的,数据,显示,控制分离。扯远了,呵呵
先看一下index.php。
1.添加require_once DISCUZ_ROOT.’./include/forum.func.php’;
这个文件里面主要包含了一些常用的函数,添加它主要是为了调用这个函数function convertip($ip),这个函数会去查找ipdata目录下面的wry.dat,wry.dat里面包含了几乎全世界的IP地址段和物理地址的映射,convertip会把获取当前的客户端IP地址转换成物理地址,这样就可以在用户信息里面显示来访者的位置了,但是我的首页用户信息里面并没有显示来访者位置,因为我觉得访问的人肯定是自己在哪的,而且查找wry.dat会消耗一定的资源。虽然看着很酷:)下面的浏览器和操作系统也是为了填满区域才添加的,所以如果你不需要convertip功能的话,完全可以不添加require_once DISCUZ_ROOT.’./include/forum.func.php’。
如果要显示就添加,然后在index.php中定义$mem_home = convertip($onlineip);在discuz.htm里面用户信息的DIV里面“来访者位置mem_home调用一下就可以了。
2.获取客户端用户信息
if(strpos($HTTP_SERVER_VARS[HTTP_USER_AGENT], "MSIE 6.0")) {
$visitor_browser = "Internet Explorer 6.0";
} elseif(strpos($HTTP_SERVER_VARS[HTTP_USER_AGENT], "MSIE 5.5")) {
$visitor_browser = "Internet Explorer 5.5";
}
这段代码的意思是从用户的http请求的头信息中获取USERAGENT信息,USERAGENT里面包含了客户端的操作系统,浏览器,显示颜色数,操作系统语言等等的信息,取出来后判断一下是否包含"MSIE 6.0",如果包含就说明是Microsoft的IE6.0,并把这个结果赋值给$visitor_browser 变量,如果不包含就继续判断其他浏览器类型。在discuz.htm中浏览器visitor_browser就把用户的浏览器类型显示出来了。
下面的
if(strpos($HTTP_SERVER_VARS[HTTP_USER_AGENT], "NT 5.1")) {
$visitor_os = "Windows XP";
}elseif(strpos($HTTP_SERVER_VARS[HTTP_USER_AGENT], "NT 5.2")) {
$visitor_os = "Windows Server 2003";
}
判断的就是操作系统类型。
3.下面解释一下最新主题区域的代码
$hack_cut_str =29;
//定义截取的标题长度
$hack_cut_strauthor = 9;
//定义截取的作者姓名长度
$new_post_threadlist = array();
//定义一个数组存放最后的主题列表
$nthread = array();
//定义一个临时数组,存放从数据库取出的主题的一些属性
$query = $db->query("SELECT t.*, f.name FROM {$tablepre}threads t, {$tablepre}forums f WHERE t.fid<>’$fid’ AND f.fid=t.fid ORDER BY t.dateline DESC LIMIT 0, 8");
//执行SQL语句,$tablepre是全局变量,定义了数据库表名的前缀,默认是cdb_,threads 表存放主题,forums 存放版块和板块组,ORDER BY t.dateline DESC指按照帖子的发布时间倒序排列,Limit 0,8取开始的8条,这条SQL语句的意思就是从主题中取出最新的8个。Discuz论坛的数据库表结构和关系我会在以后专门发帖说明。
while($nthread = $db->fetch_array($query)) {
//每次从数据库中取出一条数据添加到nthread 这个临时数组中,一直循环到取不出数据位置,因为前面SQL语句LIMIT 0, 8,所以最多也就取8次
$nthread['forumname'] = $nthread['name'];
//将数据库取出的版块名称’name’ 赋值给nthread的’forumname’
$nthread['view_subject'] = cutstr($nthread['subject'],$hack_cut_str);
//将主题名称按$hack_cut_str的长度截取存放在’view_subject’
$nthread['view_author'] = cutstr($nthread['author'],$hack_cut_strauthor);
//将主题作者按$hack_cut_strauthor的长度截取存放在’view_author’
$nthread['date']= gmdate("$dateformat $timeformat", $nthread['dateline'] + $timeoffset * 3600);
//将主题发布时间赋值给nthread的’date’
$nthread['lastreplytime']= gmdate("$dateformat $timeformat", $nthread[lastpost] + ($timeoffset * 3600));
//将主题最后发布时间时间赋值给nthread的’date’
if($nthread['highlight']) {
//判断主题是否高亮显示,如果高亮,增加粗体斜体下划线等样式
$string = sprintf(‘%02d’, $nthread['highlight']);
$stylestr = sprintf(‘%03b’, $string[0]);
$nthread['highlight'] = ‘style="’;
$nthread['highlight'] .= $stylestr[0] ? ‘font-weight: bold;’ : ”;
$nthread['highlight'] .= $stylestr[1] ? ‘font-style: italic;’ : ”;
$nthread['highlight'] .= $stylestr[2] ? ‘text-decoration: underline;’ : ”;
$nthread['highlight'] .= $string[1] ? ‘color: ‘.$colorarray[$string[1]] : ”;
$nthread['highlight'] .= ‘"’;
} else {
$nthread['highlight'] = ”;
}
$new_post_threadlist[] = $nthread;
//将每次取到的主题添加到$new_post_threadlist数组中。
}
其他几个版块也是一样的,只不过定义了不同变量名称和SQL语句。
例如
"SELECT t.*, f.name FROM {$tablepre}threads t, {$tablepre}forums f WHERE t.fid<>’$fid’ AND f.fid=t.fid AND t.closed !=1 AND t.replies !=0 ORDER BY t.lastpost DESC LIMIT 0, 8" 就是最新回复
"SELECT t.*, f.name FROM {$tablepre}threads t, {$tablepre}forums f WHERE t.fid<>’$fid’ AND f.fid=t.fid AND t.closed !=1 AND t.replies !=0 ORDER BY t.views DESC LIMIT 0, 8"就是热门贴,因为是按帖子的浏览次数倒序查询出来的。
"SELECT t.*, f.name FROM {$tablepre}threads t, {$tablepre}forums f WHERE digest>’0′ AND t.fid<>’$fid’ AND f.fid=t.fid ORDER BY t.dateline DESC LIMIT 0, 10"就是取精华贴
|