設為首頁收藏本站

艾歐踢論壇

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

搜索
熱搜: 活動 交友 discuz
查看: 713|回復: 0
打印 上一主題 下一主題

Discuz论坛首页五格修改代码解析之一(index.php)

[複製鏈接]
跳轉到指定樓層
樓主
發表於 2015-2-8 23:04:52 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
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"就是取精华贴

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 轉播轉播 分享分享 分享淘帖
回復

使用道具 舉報

您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

小黑屋|Archiver|手機版|艾歐踢創新工坊    

GMT+8, 2024-6-12 08:59 , Processed in 0.195519 second(s), 19 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表