discuz的模板制作与源代码分析
各位网友,大家好!我是德阳热线论坛管理员()欢迎大家到我站看看,许
多使用discuz的人都会自然的想到论坛的风格、样式和模板,如何修改它,如何让它符合心中的要求,相信大家只要对discuz的模板源代码进行钻研的话,那就肯定能够自己独立修改,并且达到自己想要的风格和样式。
但是discuz的源代码极为精简,而且无注释,采用的方法多变,对象、函数等等都不易理解,无疑让大家对模板源代码头痛不已。
俗语说得好,授人以鱼不如授人以渔,我在这里不讲如局具体修改什么,
而是讲一讲discuz模板的工作原理和源代码的拆开。
源代码1080p在线说到模板风格,大家自然想到的就是templates文件夹下的default模板,这里面的文件众多,它是discuz的默认模板。
在这个文件夹里的模板文件很多,最常使用到的,比如说header.htm和footer.htm两个文件,它们分别是论坛的头部和底部,在其它模板里都必须调
用这两个文件,是以大家可以看到,在论坛的所有页面里,头部和底部都是相
同的。
论坛最常见的三个页面,一个是主页,也就是通常的index.php,还有是
主题列表页,以及帖子内容页,下面以index.php来讲述discuz模板的原理以及它牵扯到的文件。
首先我们打开index.php,在这个文件的开头是discuz作者的声明。
然后就是
//定义页面
define('CURSCRIPT','index');
//包含common文件和forum函数库
require_once'./include/common.inc.php';
require_once DISCUZ_ROOT.'./include/forum.func.php';
大家可以看到这里很重要的两句,就是使用require_once函数来包含两个文件,在common.inc.php里存放的是一些常用数据,而在forum.func.php里
存放的是有关版块的函数,把这些分离开来单独作为一个文件,是因为这些东
西会在多个文件里使用,是以为了循环利用以及代码的精简性,他们被放在一
个单独的文件里。
调用了common.inc.php文件以后,我们就可以直接在本页面使用其中的变量了,下面的这几句:
//判断页面状况,包括:页面缓存、是否登录、是否开启了左右分栏等等
if($cacheindexlife&&!$discuz_uid&&$showoldetails!='yes'&&(!
$_DCACHE['settings']['frameon']||$_DCACHE['settings']['frameon']&&$_G ET['frameon']!='yes')&&empty($gid)){…}
在这个if大括号里我们可以看到许多变量,这些变量的值从何而来,就是从common.inc.php里来的,而这个大括号里分别判断页面的各种状况,并且对其进行处理,特别要说的是$discuz_uid这个变量,它表示的是访问者的uid,如果未登录就是0,所以大家可以使用if(!$dicuz){…}来判断用户是否登录。
后面的也是进行一些判断,我们直接到第42行,可以看到这里有了一些新变量,他们都是时间的变量。
//第一个变量里的gmdate是返回一个格式化的时间,里面需要指定格式和timestamp格式的时间,timestamp格式就是一连串的整形数字,代表着从格林威治时间1970年1月1日凌晨0点到规定时间的秒数。
$currenttime=gmdate($timeformat,$timestamp+$timeoffset*3600);
//下面这个变量是把上次访问时间(timestmp格式)格式化成我们可以明白
的时间格式
$lastvisittime=dgmdate("$dateformat$timeformat",$lastvisit+$timeo ffset*3600);
在第一个函数里,gmdate函数后面的($timestamp+$timeoffset*3600)这个$timestamp是返回现在的时间,而后面的$timeoffset却是时区,因为统一使用格林威治时间,所以要补上时区,这样才能正确显示我们的时间。
而第二个函数dgmdate不是php自带的,而是discuz里的函数,它存在于何处?并不是在forum.func.php
里,而是在common.inc.php里面,因为common.inc.php里包含了一个discuz的全局函数库--global.func.php,这个函数库几乎所有页面都会用到,但不需要在页面指定调用,因为在
common.inc.php里已经包含了它。
dgmdate也是像gmdate那样格式化一个timestamp的时间,但是它更为强大,更为人性化的时间格式,我们平常看到的几分钟以前或者几天以前那样的格式就是通过它来转换的,而timestamp只能返回XX年X月X日这种格式的
他们下面的是:
//这个是把用户名转换成非汉字
$memberenc=rawurlencode($lastmember);
//取整时间
$newthreads=round(($timestamp-$lastvisit+600)/1000)*1000;
rawurlencode函数把用户名转换成一串字符,主要是针对汉字或者特殊字符的,比如说
%B0%B2%B5%D1这个是用十六进制来表示字符,一个汉字两个字符,使用这个函数把汉字或者特殊字符转换成可以用url传送的字符。
//先定义主题、帖子、今日发帖、版块、短消息数的变量
$threads=$posts=$todayposts=$fids=$announcepm=0;
//定义发帖数量
$postdata=$historyposts?explode("\t",$historyposts):array();
上面的$historyposts是一个字符串,大家可以在cdb_setting数据表里到它,它存放着两个数据,一个是昨日发帖,一个是历史最高发帖,explode 是用来拆分这个字符串并且返回一个数组,如果这个$historyposts变量不存在的话就返回一个空数组,所以$postdata是一个明确定义的数组。
我们往下面跳着看,在97行有一个这样的字符串变量:
$sql=!empty($accessmasks)?
"SELECT
f.fid,f.pe,f.name,f.threads,f.dayposts,f.lastpost,f .inheritedmod,f.forumcolumns,f.simple,ff.derators,ff .icon,ff.direct,a.allowview FROM{$tablepre}forums f
LEFT JOIN{$tablepre}forumfields ff ON ff.fid=f.fid LEFT
JOIN{$tablepre}access aON a.uid='$discuz_uid'AND a.fid=f.fid WHERE f.status 0ORDER pe,f.displayorder"
:"SELECT
f.fid,f.pe,f.name,f.threads,f.dayposts,f.lastpost,f .inheritedmod,f.forumcolumns,f.simple,ff.derators,ff .icon,ff.direct FROM{$tablepre}forums f
LEFT JOIN{$tablepre}forumfields ff USING(fid)
WHERE f.status 0ORDER pe,f.displayorder";
这个变量同样使用?:来选择不同字符串的,大家可以看到,这是一串SQL 代码,他们是在cdb_forumfields和cdb_access查数据,其中
cdb_forumfields表存放着版块的各种信息,比如说版块简介,版块图标,访
问密码等等,而cdb_access是针对个人的访问控制,比如已经限制了某人访问某个版块,那么就会记录在这张表里,SQL查询就会用到它。
在后面的$query=$db-query($sql);以及$db-fetch_array($query)等等,这些都是PHP里的对象使用方法,其中$db是一个大对象,而query和
fetch_array等都是这个对象的方法函数,这些具体的对象都存放在
include/db_mysql.class.php文件夹下,同样,它是在common.inc.php里调
用过的,所以在这个页面上可以直接使用。
在这个class文件里,把对于mysql的大多数使用方法都整合成了一个对
象包,使用起来极大的方便。
根据上面SQL查询到的信息,我们得到了许多值,然后再进行对比和判断,从而返回不同的变量,这些都是版块的信息,我们就不多看了。
直接跳到180行,我们可以看到这个是在线人数的统计,因为每一个访问
的用户,会注册一个session,所以返回所有的session就可以知道在线用户
有多少,在$onlinerecord里存放的是最高在线,如果在线人数超过这个数字
的话,会自动把新的最高在线存放到数据库里。
在index.php的最后,是
include template('discuz');
它是index.php能够显示的基础。
大家想必已经看到,在index.php里,全都是对变量进行处理,没有一个
显示出来的,如何能让这些不同的变量按照格式显示出来呢?这就需要调用
xhtml来完成,一般的php页面会直接含有html文件,也就是把php代码穿插
到html里,但是这样以来会让代码可读性降低,维护起来困难许多。
现在比较流行一种叫smarty技术,也就是模板技术,它把xhtml和php分开,这就是所谓的逻辑层与表现层之间的分离,这种方法让前台设计师们更容
易表现自己,他们可以不必完全精通php,但一样可以做出精美的页面。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论