各位網友,你們好!我是德陽熱線論壇管理員(http://www.dyrx.net)歡迎你們到我站看看,許多使用discuz的人都會天然的想到論壇的風格、樣式和模板,如何修改它,如何讓它符合心中的要求,相信你們只要對discuz的模板源代碼進行鑽研的話,那就確定可以本身獨立修改,而且達到本身想要的風格和樣式。 可是discuz的源代碼極爲精簡,並且無註釋,採用的方法多變,對象、函數等等都不易理解,無疑讓你們對模板源代碼頭痛不已。 俗語說得好,授人以魚不如授人以漁,我在這裏不講如局具體修改什麼,而是講一講discuz模板的工做原理和源代碼的拆開。 說到模板風格,你們天然想到的就是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'] && $_GET['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 + $timeoffset * 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函數把用戶名轉換成一串字符,主要是針對漢字或者特殊字符的,好比說 http://www.discuz.net/space.php?username=%B0%B2%B5%D1 %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.fup, f.type, f.name, f.threads, f.posts, f.todayposts, f.lastpost, f.inheritedmod, f.forumcolumns, f.simple, ff.description, ff.moderators, ff.icon, ff.viewperm, ff.redirect, a.allowview FROM {$tablepre}forums f LEFT JOIN {$tablepre}forumfields ff ON ff.fid=f.fid LEFT JOIN {$tablepre}access a ON a.uid='$discuz_uid' AND a.fid=f.fid WHERE f.status>0 ORDER BY f.type, f.displayorder" : "SELECT f.fid, f.fup, f.type, f.name, f.threads, f.posts, f.todayposts, f.lastpost, f.inheritedmod, f.forumcolumns, f.simple, ff.description, ff.moderators, ff.icon, ff.viewperm, ff.redirect FROM {$tablepre}forums f LEFT JOIN {$tablepre}forumfields ff USING(fid) WHERE f.status>0 ORDER BY f.type, 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,但同樣能夠作出精美的頁面。 dz並非直接使用smarty,而是本身創造了一個小庫,你們能夠在template.func.php看到dz如何使用文件緩存配合模板。 當你訪問一個頁面時候,實際上訪問的是php頁面,在php頁面裏會有include函數,它用來包含一個顯示出來的頁面,也就是一般意義上的模板,不過dz採用類smarty技術,因此會使用include template('discuz');這樣的語句調用頁面。 而後根據用戶使用的風格來找到styleid,存儲到session和cookie裏,而後返回給服務器端,服務器端經過這個來搜索styleid找到制定的緩存文件,若是有的話直接返回文件顯示,若是沒有的話,就會從新創建,會查找styleid指向的那個模板文件夾,若是裏面含有這個模板文件,那麼就作成緩存,而若是在這個文件夾裏找不到莫個模板文件,好比找不到discuz.htm文件,函數纔會去搜default文件,若是在這個文件夾裏找到了,就直接作成緩存文件。 php端而後調用緩存文件顯示出來,因此並非同時搜索default文件夾和模板文件夾,通常來講,若是一個模版文件夾裏包含全部模板頁面,轉換成緩存頁面的速度是最快的。 咱們下面說說index.php調用的模板頁面——discuz.htm 你們打開discuz.htm文件,能夠看到最上方就是一句: {subtemplate header} 而最下方是 {subtemplate footer} 這兩句的意思就是分別加載頭部和尾部,而頭部和尾部的模板就是header.htm和footer.htm,咱們首先看一看header.htm 你們打開header.htm能夠看到是經典的html文件格式。 第一句是DTD聲明,在標準化頁面裏這是必需要的。 同時咱們也能夠看到在head標籤內裏有不少meta信息,meta信息是頭文件,它用於傳遞給瀏覽器或者搜索引擎,其中這兩句: 第一個是關鍵詞,第二個是描述,在不少SEO教程裏,你們都會對這個花很大的心思,他是蜘蛛們最容易獲取的信息,也是SEO優化所必須考慮的。 $rsshead $extrahead {subtemplate css_script} 在上面的一行代碼裏,$rsshead是rss頭信息,$extrahead是額外的頭部信息,這個能夠在論壇後臺的全局,搜索優化裏填寫。 而下面的{subtemplate css_script}是獲取CSS信息,全部的樣式都在這裏面定義了。 咱們打開css_script.htm文件,能夠發現它首先加載了 @import url(forumdata/cache/style_{STYLEID}_common.css?{VERHASH}); 這個能夠很清楚的看到,它調用了一個css文件,這個css文件是存在於forumdata/cache/文件夾下的,它是一個緩存文件,而根據{STYLEID}的不一樣,這些文件也不一樣,好比一個風格的STYLEID爲5,那麼它調用的就是style_5_common.css這個css樣式,然後面的{VERHASH}是產生一個hash數,這個hash數用來對文件進行hash校檢,每次更新模板緩存後產生的hash值都不同,這樣有不少好處。 你們可能會詢問,爲什麼會生成一個style_5_common.css的樣式文件呢?它裏面的內容又是什麼呢? 這裏面的內容其實根據兩個方面來的: 1.css_common.htm 2.論壇後臺設定的風格,好比字體顏色、背景圖片等等 由於discuz採用了風格標籤的方法,把一些常見的標籤放到後臺裏,能夠很容易讓你們修改,而這些值會傳遞給緩存函數,在style_5_common.css裏就會使用這些標籤來控制樣式。 在css_script.htm裏還有一些經常使用的css樣式,這些都會被header.htm文件選擇性的調用。 回到header.htm裏,咱們能夠看到下面有一段JavaScript代碼,這個是控制風格切換以及風格切換時的cookie做用域。 在head標籤的結束前,是一段JS的調用 <script type="text/javascript" src="include/js/common.js?{VERHASH}"></script> 這個include/js/common.js就是經常使用的JavaScript代碼,咱們常使用的是:浮動窗口,樣式改變,列表下滑,按ALT+S或者CTRL+ENTER快捷回覆等等一系列的js控制。 body標籤開始,就是真正顯示在瀏覽器的內容,由於discuz是標準化的頁面,用div+css規劃頁面的,因此能夠看到不少div標籤,是用來對頁面的各個元素進行樣式定義。 首先就是logo信息了, {BOARDLOGO} $indexname是點擊logo所返回的頁面,title是把鼠標放到logo上所顯示的文字,而{BOARDLOGO}則是logo的圖片,通常在後臺定義。 下面的注意這一句: 前面說了,這個是表明着已經登陸,因此它後面的代碼就是登陸後顯示的內容,分別是用戶名 | 個人帖子 空間 短消息 論壇任務 | 我的中心 退出 這些字。 你們看不到漢字,是由於這裏面的漢字也是使用函數替換的,它們被集合起來,稱爲語言包,你們能夠在template.lang.php裏找到這些文字,分別與這裏面一一對應。 而在未登陸的時候,你只能看到登陸 | 註冊 這兩個詞,因此後面的else就是這些內容,其中還有一種比較特殊的狀況是,未登陸,可是cookie裏面有登陸信息,這樣的狀況下,會顯示登陸 | 退出,點擊登陸能夠直接登陸,退出則是清空cookie 再下面的是廣告banner,通常是在頁面的右上方,能夠在後臺添加。 再下面的就是關於分欄模式,這個開啓了之後和天涯等相似,在左邊會有一個長框,版塊都會放在那條框裏,這是針對於版塊數目較多的論壇而設立的,通常沒必要開啓它。 下面的是導航欄和風格切換按鈕,導航欄由於是在後臺設定的,存放到數據庫的,因此在這裏就是一些變量,它採用循環{loop}來讓這些變量逐一展示出來。 好,咱們說完header.htm,再說說footer.htm文件,這個是底部信息,開始的是底部廣告,這個能夠在後臺設定,而下面的是這種經常使用連接(站點全稱,站點備案信息,站點郵箱,論壇統計以及Archiver以及WAP統計) Comsenz Technology Ltd ( 京ICP備05079575號)|聯繫咱們 |論壇統計|Archiver|WAP 在它旁邊是第三方統計代碼,你們能夠在論壇後臺的全局,論壇功能裏添加這個第三方統計代碼,好比雅虎統計等等。 而這個 !--{if debuginfo()}-->, Processed in $debuginfo[time] second(s), $debuginfo[queries] queries, Gzip enabled. 它是表示論壇執行秒數,這個在你打開頁面的剛開始,也就是調用common.inc.php時記錄一個開始時間,而在你打開頁面之後又記錄一個結束時間,這個$debuginfo[queries]就是二者的差,後面的是gzip是否開啓的信息,GZIP是壓縮傳送,通常是不開啓的,能夠在論壇後臺開啓它。 再下面就是論壇底部的右邊信息,也就是版權信息 Powered by Discuz! $version Licensed © 2001-2009 Comsenz Inc. 這個顯示結果就是 Powered by Discuz! 7.0.0 © 2001-2009 Comsenz Inc. 版權信息是discuz所看重的,discuz做爲開發者,提供這麼一個程序,底部版權聲明是必須保留的,你們能夠參考康盛的協議聲明,不要擅自修改版權文字。 再下面的那些代碼,是開啓了分欄模式的,而最後的那個代碼,是discuz把feed事件傳送給uchome的JavaScript代碼。 看完footer.htm,咱們轉過頭來講說discuz.htm文件,這個就是使用index.php裏的值來組織成一個首頁頁面。 能夠看到,它分紅許多個div塊,並且div快裏嵌套着div,在剛開始的是相似於這種Discuz! 論壇官方 » 首頁,這個是在首頁的上方。 下面就是廣告顯示,若是有廣告就會提早出現。 而後是論壇的邊欄顯示,根據邊欄的開啓來判斷頁面寬度。 在論壇的首頁公告顯示區上方的是,那個大的發帖按鈕,以及歡迎信息,它對應的代碼就是 {lang home_welcome_guest} {lang home_welcome} {$discuz_userss}, {lang home_lastvisit} {$lastvisit}, 這些lang函數把這串英文字母替換成語言包裏的漢字或其它語言。 公告區的右方是發帖量等信息的現實,好比是這樣: 今日: 3637, 昨日: 7808, 會員: 1004553 它對應的就是 {lang index_today}: $todayposts, {lang index_yesterday}: $postdata[0], {lang index_members}: $totalmembers 在公告區的下方就是版塊列表區,這些版塊的排列是用css控制的,而版塊也是使用{loop}循環顯示出來的。 這些標籤和元素比較多,不過你們能夠看到table標籤,這是使用表格來規劃版塊裏面的信息顯示,好比版塊名,版塊簡介,版塊發帖量等等,爲了讓它們工整對齊,因此使用無邊框的表格來排版。 由於有橫排的板塊,因此兩種不一樣的顯示在discuz.htm裏表現出來,這裏就很少說了。 最下面的是友情連接,有的人會奇怪,友情連接爲何如此簡單,其實友情連接由於存放在數據庫裏,並且每訪問一次主頁,它都要顯示出來,而且它的變化不頻繁,不會每秒都會變化,因此它是利用數據緩存,把生成好的數據放在緩存文件裏,而後用$_DCACHE來使用它。 生成緩存的函數能夠在include/cache.func.php裏找到。 最下面的是在線人數,咱們以前在index.php裏獲取了在線人數的值,在這裏咱們能夠把它展示出來。 綜上所說,一個完整的頁面所涉及到的文件實際上是很是多的,所使用的技術也很是多。 其中模板分離技術(相似smarty技術)是很重要的,它讓htm裏可使用{if}、{loop}這類來代替和這類真正的php語言,從而讓代碼看上去簡單許多,又可讓語言包從中分離出來,你們能夠輕易的改變語言。