外掛製作的基本思路是:(初學者適用)
1. 形成外掛思路
2. 製作外掛介面
3. 構架程式模組
4. 搭建儲存資料
5. 填充功能語句
6. 檢查應用錯誤
7. 完善外掛功能

前言:為方便網際網路數萬 Discuz! 愛好者,更加深入瞭解 Discuz! 軟體,本人在熟悉 Discuz! 過程中,順便將個人經驗寫給大家。本貼內容由本人定期更新。本貼只介紹 Discuz! 中部分技術點,本貼緊屬個人觀點,不足之處,請各位多多指教,在下先此謝過!。 「Discuz!」 在下文中簡稱 「DZ」 。要弄 DZ 二次開發,必須至少具備如下技能:
1) 能夠理很好理解 MVC 構架的原理 (雖然 DZ 不是 MVC 架構的)
2) 紮實的 PHP 基礎,熟悉結構化程式,OOP 程式的寫法及應用
3) 熟悉 MYSQL 就用,掌握 SQL 語言,懂 SQL 最佳化者更佳
4) 熟悉使用 Discuz! 的各項功能

一)Discuz! 的檔案系統目錄
注:想搞 DZ 開發,就得弄懂 DZ 中每個檔案的功能。
a) Admin:後臺管理功能模組
b) Api:DZ 系統與其它系統之間介面程式
c) Archiver:DZ 中,用以搜尋引擎最佳化的無圖版
d) Attachments:DZ 中 , 使用者上傳附件的存放目錄
e) Customavatars:DZ 中,使用者自定義頭像的目錄
f) Forumdata:DZ 快取資料的存放目錄
g) Images:DZ 模板中的圖片存放目錄
h) Include:DZ 常用函式庫,基本功能模組目錄
i) Ipdata:DZ 統計 IP 來路用的資料
j) Plugins:DZ 外掛資訊的存放目錄
k) Templates:DZ 模板檔案的存放目錄
l) Wap:DZ 無線,Wap 程式處理目錄

二) 必須記熟 Discuz! 資料庫設計的每個表的功能,每個表中每個欄位的功能。
關於 DZ 資料庫設計檔案,請參閱 DZ 相關的專案檔案 (請從本貼附件中下載)

三)Discuz! 的流程控制
a) 後臺流程控:DZ 後臺所有的功能,均需要註冊到 admincp.php 檔案,每個功能都至少有一個或一個以上的 Action(動作),在 admincp.php 中,可以定義 Action 的執行許可權,分別為:「admin==1」 管理員,或 「admin==2 || admin==3」 超級版主和版主,每個 Action 對應一個指令碼檔案,指令碼檔案的命名為 action.inc.php(*.inc.php),並存放在 admin 目錄下,如執行:admincp.php?action=dodo,相當於執行 admin 目錄下的 dodo.inc.php 檔案
b) 前臺流程控制:前臺的流程控制比較簡單:流程是自由的,如:
首頁:index.php
會員註冊:register.php;
會員登入:logging.php
發貼程式:post.php
會員資訊:member.php
論壇內容:forumdisplay.php
檢視貼子:viewthread.php
…大部分功能,此處不一一列出…
c) DZ 根目下的 config.inc.php 屬於整個 DZ 系統的配置檔案 

四)Discuz! 的資料處理過程
a) DZ 對 mysql 的資料庫操作處理全部封裝在 dbstuff(db_mysql.class.php) 類中
b) 所在的外部資料均透過 「daddslashes()」 初步過濾,然後再過濾,再根據需要處理

五)Discuz! 的顯示控制 (網站多樣式風格輸出)
a) 顯示層就是大家通常所看到的網站風格了。 DZ 中每套風絡分別在 templates 及 images 下對應一個風格檔案的存放目錄。網站風格的製作,請參閱詳細的 DZ 風格製作檔案
b) DZ 網站風格檔案處理的原理:其實很簡單,DZ 使用 template.func.php 中的 parse_template() 以 PHP 正則運算把 htm 模檔案中的模板標籤,轉換成了 PHP 程式碼,並根據 styleid 儲存在 forumdata/templates 下,這個有點像 Smarty 中的技術。

六)DZ 中的語言處理
a) DZ 前臺及後臺中、英語言的實現,均是把語句定義成了語變數,然後在模板輸入,語句變數的賦值,均放在模板目錄中的*.lang.php 檔案中,DZ 在生成網站風格時就載入了這相應的語言包。

七)DZ 如何處理使用者資訊 (存取、計算、更新過程)
新手要做二次開發,都必須掌握這陣列中,每個陣列元素的意義。
a) DZ 的基本資訊,如使用者資訊,Session 資訊存在如下變數中:
a). $_DCACHE
b). $_COOKIE
c). $_DCOOKIE
d). $_DSESSION
e). $_DPLUGIN
b) 可以透過 print_r($GLOBALS),列印全部變數
八)DZ 中快取處理機制
a) DZ 中快取處理過程都放在 「cache.func.php」 中,DZ 的快取處理比較簡單,其原理是把一個陣列轉換成了 PHP 程式碼,並儲存在快取目錄下,大家可開啟快取檔案檢視便知。
b) 使用方法:如果在新開的功能中,需要快取某部分資料,基本上就是:
1) 定義並註冊快取名字。
2) 從資料讀取相應的資料。
3) 資料在寫入快取前作相應處理。
4) 最後寫入快取。
具體操作,可以看檔案中的程式碼,做相應的修改即可
九)DZ 中模板處理機制
a) DZ 獨創的模板處理技術,類似於 Smarty 中的模板處理,只是具體演演算法,過程不同,Smarty 是一種重型模板引擎方案。其原理都是把模板中的變數轉換成相應的 PHP 程式碼,這個過程實際是模訪 JAVA 中的一次編譯,多處執行。
十)DZ 中許可權處理機制
a) 對於 DZ 中前臺的每相 action 都有 $discuz_action 定義,DZ 根據使用者所在的使用者組來判定使用者是否具有相應操作 $discuz_action 的許可權。至於後臺的許可權權驗證,則更簡單了,依據 「admin==1」 來確定的
十一)DZ 中如何實現 URL 靜態化
a) DZ 中的靜態有兩法,只要懂 ReWrite 規劃的朋友,一看就知。
十二)DZ 獨創的 HTML 編輯器,如何擷取並使用,如果進行 Discuz! 代和 Html 程式碼的轉換
a) 這也算是 DZ 比較牛的一項技術了,在早期版中,因 DZ 編輯器的不足,使得很多使用者放棄了 DZ 。實現原理:透過 JS 把用的一些操作轉換成了 DZ 的 bbcode 程式碼。這樣子提交了安全性,將帶有 bbcode 程式碼的內容存入資料,在使用者開啟頁頁時,又把 bbcode 程式碼轉換成 html 程式碼

本貼宣告:由於時間有限,本貼只有關於 DZ 部分功能的簡短分析。若各位網友,對本文感興趣並想更為深入瞭解 DZ,請在本貼後回貼!我將盡可能多的 DZ 技術分析寫在本文,不斷更新本貼內容。

部分檔案說明:

admincp.php 管理
ajax.php ajax 功能
announcement.php 公告
attachment 附件
board.php 真正的首頁
config.inc.php 這個是配置檔案
corpus.php 論壇文集
digest.php 精華帖子
discuz_version.php 論壇版本號
faq.php 問題列表
forumdisplay.php 論壇列表
index.php 跳轉頁面
loggin.php 認證頁面 (登入退出)
mail_config.inc.php 郵件配置
member.php 使用者操作
memcp.php 個人控制面版
misc.php 零碎功能
my.php 我的帖子
plugin.php 外掛
pm.php 簡訊
post.php 傳送帖子
redirect.php 頁面重定向
register.php 註冊
robots.txt 限制搜尋
rss.php rss 資訊釋出
search.php 論壇查詢
secode.php 驗證碼
stats.php 統計
topic.php 首頁論壇專題
topicadmin 主題管理
viewpro.php 顯示個人資訊
viewthread.php 主題顯示

資料夾 
admin 管理
api 介面
archiver 檔案
attachments 附件
customavatars 自定義表情
forumdata 論壇資料包含緩衝資料
images 圖片
include 公共檔案
install 安裝包
ipdata ip 地址
plugins 外掛
readme 幫助檔案
templates 模板
utilities 工具包
wap 手機網站

資料夾 include 
advertisements.inc.php 廣告管理
ajax.js ajax 相關
attachment.func.php 附件函式集
bbscode.js 論壇表情
cache.fun.php 快取函式集
category.inc.php 欄目
chinese.class.php 
common.inc.php 最主要的標頭檔案
common.js 最主要的 js 檔案
corpus.func.php 論壇文集函式
counter.inc.php 論壇計數
cron.func.php 計劃任務
db_mysql.class.php 資料庫
db_mysql_error.inc.php 資料庫錯誤
debug.php 除錯資訊
discuzcode.func.php 論壇程式碼
editor.func.php 編輯器
editor.js 編輯器
editpost.inc.php 編輯帖子
floatadv.js 浮動廣告
forum.func.php 論壇函式集
global.func.php 全域性函式
menu.js 選單
misc.func.php 其它
newreply.inc.php 新回覆
newthread.inc.php 新主題
*pmprompt.inc.php 
post.fun.php 發表主題
printable.inc.php 論壇列印
qihoo.js qihoo
relatethreads.inc.php 相關主題
security.inc.php 安全
sendmail.inc.php 郵件
serverbusy.htm 系統繁忙
template.func.php 模板
threadpay.inc.php 購買帖子

為什麼檔案的命名有 inc 呢?
檔案命名規範

Discuz! 按照如下的規範對程式和模板進行命名,請在設計外掛時儘量遵循此命名規範: 

1. 可以直接透過瀏覽器訪問的普通程式檔案,以 .php 字尾命名。 
2. 被普通程式檔案引用的程式檔案,以 .inc.php 字尾命名。 
3. 被普通程式檔案,或引用程式檔案引用的函式庫或類庫,以 .func.php(函式庫) 或 .class.php(類庫) 字尾命名。 
4. 模板檔案,以 .htm 字尾命名,模板檔案只存在於 ./templates 目錄中。 
5. 模板語言包檔案,以 .lang.php 字尾命名,語言包檔案只存放於 ./templates 目錄中,與模板檔案同級目錄。 
6. 被編譯後的模板檔案,以 .tpl.php 字尾命名,前面的數字是模板套系的 ID,下劃線後面的是模板原名,編譯模板檔案只存在於 ./forumdata/templates 目錄中。 
7. 動態快取檔案,存放於 ./forumdata/cache 目錄中,依據不同的功用進行獨立的命名。 
8. 使用後臺資料備份功能生成的備份檔案,通常以 .sql 為字尾,存放於 ./forumdata/ 目錄中。 
9. 有些目錄中存在內容為空白的 index.htm 檔案,此類檔案是為了避免 Web 伺服器開啟 Directory Index 時可能產生的安全問題。

模組型別:
外掛模組和自定義選單:
外掛介面預設提供四種可選的模組方式:

1. 直接連結 (前臺選單):可在前臺右上角加入一個選單項,可自主指派選單連結的 URL 。注意:由於引用外部程式,因此即便設定了模組的使用等級,您的程式如需許可權判斷,仍需要引用 common.inc.php 和外掛相關的快取檔案 (將在後面的 《引數讀取與快取控制》 中詳細說明),並自行判斷使用等級是否合法; 

2. 前臺呼叫 (前臺選單):與直接連結類似,但其呼叫的是外掛的一個模組,模組檔名指派為 「./plugins/外掛目錄/外掛模組名.inc.php」,由 plugin.php 呼叫此模組,呼叫 URL 將在後面的 《編寫外掛的原則與注意事項》 中詳細說明; 

3. 後臺呼叫 (後臺選單):可在後臺外掛設定中為此外掛增添一個管理模組,模組檔名指派為 「./plugins/外掛目錄/外掛模組名.inc.php」,由 admincp.php 呼叫此模組,呼叫 URL 將在後面的 《編寫外掛的原則與注意事項》 中詳細說明; 

4. 包含執行 (無選單):可設定一個在論壇所有頁面均包含執行的指令碼,此指令碼在 ./include/common.inc.php 中載入,指令碼檔名指派為 「./plugins/外掛目錄/外掛模組名.inc.php」 。請注意,為了不導致錯誤的外掛影響論壇執行,在 common.inc.php 載入此模組時,遮蔽了錯誤資訊,因此請務必仔細檢查是否存在語法錯誤,任何微小的語法錯誤都將不被提示出來,並且導致此模組不被正常載入。如果您配置了不正確的包含指令碼而導致論壇系統設定無法使用,刪除伺服器上相應的指令碼檔案即可解決。 

您可以為每個模組設定不同的使用等級,例如設定為 「超級版主」,則超級版主及更高的管理者 (例如論壇管理員) 可以使用此模組。 
看到了應該很簡單前臺檔案、後臺檔案、呼叫外部檔案、初始化檔案!就這四種!那麼一般的外掛檔案當然是前臺呼叫

這裡要說明一個呼叫問題,文中多次說到./include/common.inc.php 是否載入,也就是說載入了這個檔案,你就可以輕鬆的得到會員名、會員 uid 、會員的積分資訊、論壇的分類、各級會員組使用者組資訊,簡單說就是汽車加了汽油你可以開了,前後臺呼叫都載入了這個檔案;包含執行是把程式寫入這個檔案;前臺連結沒有加是需要你另外新增的!

第四章 Discuz! 中常用檔案說明

         第一節 常用檔案說明
DZ 程式檔案目錄含義整理表
http://www.discuz.net/thread-329948-1-1.html

請看以上, 感謝作者 sw08
以下內容版權歸原作者 sw08 哦
最近看見很多人熱衷於功能增強型 HACK 的修改。這種功能增強型 HACK 和平時所說的外掛不一樣,外掛是單獨的檔案,一般在後臺匯入即可使用。但是功能增強型 HACK 更多是修改程式原始碼來實現自己需要的功能,本人做得最多就是這類。可以說功能增強型 HACK 是外掛的前身,想做外掛就一定要做熟功能增強型 HACK 。
功能增強型 HACK 挺簡單,因為程式碼修改量不多,而且一般以改程式碼為主;說難,因為一般不好找檔案,而且一旦對程式結構不熟悉,馬上陷入迷坑。

這裡先簡單說下 Discuz! 的所有檔案,目前所代表的含義,方便大家修改時候避免找不到改哪個檔案。這是個基本功,一定要熟練~熟悉了檔案的話,隨便做個功能增強型 HACK 根本就是不費吹灰之力的事情。

先說根檔案:
admincp.php——後臺系統設定程式檔案,一般只處理選單的顯示的訪問許可權,不處理管理控制。
attachment——附件檔案,僅僅處理附件下載的功能。
announcement.php——論壇公告的顯示,一般很少改
blog.php——瀏覽 BLOG 文章時候會用的,非常容易理解
config.inc.php——配置論壇資料庫、密碼等資訊,這個大家最熟悉了
digest.php——論壇精華區的資訊顯示,不用多說了吧?
discuz_version.php——論壇版本資訊,用來更新用的,沒有官方說明絕對不要修改
faq.php——論壇幫助系統,不過我看絕對沒人用
forumdisplay.php——很簡單,論壇主題列表的顯示
index.php——控制首頁元素顯示
logging.php——登陸系統,判斷使用者名稱、密碼。
mail_config.inc.php——配置論壇 EMAIL 功能
member.php——控制會員列表顯示,積分策略等等資訊顯示
memcp.php——會員控制面板
misc.php——控制評分功能、 BLOG 、論壇介面顯示功能等等
plugin.php——論壇外掛,這個主要控制論壇外掛的選單的顯示,一般極少修改
pm.php——論壇簡訊息程式,控制簡訊息發表與瀏覽
post.php——與 viewthread.php 相似,但是更多是管理帖子發表、編輯等等資訊,也會有許可權的控制提示
redirect.php——控制顯示論壇的最後發表的主題訪問
register.php——註冊檔案,同時也會控制註冊的資訊的合法性
rss.php——RSS 快速訂閱,不用多說了吧?
search.php——處理論壇搜尋功能中的資訊篩選
seccode.php——論壇註冊,生成驗證碼的程式
stats.php——處理統計中的統計資訊
topic.php——一般無法直接訪問,控制頁面顯示,顯示主題條數
topicadmin.php——控制的是管理人員的前臺管理操作,如精華、置頂、高亮等等
viewpro.php——處理瀏覽會員資訊的內容顯示
viewthread.php——處理瀏覽帖子時候的帖子資訊顯示,例如資訊、標題等等,同時也處理訪問帖子的許可權,如閱讀許可權是否足夠等等。

接著開始說資料夾裡面的檔案了,一個個開始:
有人會問,那個空 index.htm 是幹什麼用的,我可以回覆,那是防止列目錄檢視檔案用的,避免安全問題。
admin===(管理後臺的程式檔案,全部在這裡,僅能透過 admincp.php 來訪問)
標記紅色的檔案最好別動,畢竟主程式被加密,而且也是違背官方授權協議的。        
home.inc.php——後臺首頁內容
settings.inc.php——Discuz! 選項下的所有小分類
passport.inc.php——一堆通行證的東西
avatarshow.inc.php——天下秀
qihoo.inc.php——奇虎搜尋
forums.inc.php——論壇編輯下面所有子分類
members.inc.php——新增使用者、編輯使用者、合併使用者、使用者欄目定製 
groups.inc.php——分組與級別下所有子分類
announcements.inc.php——只有論壇公告發布的管理
styles.inc.php——風格管理
templates.inc.php——模板線上編輯
moderate.inc.php——一堆稽核,稽核新使用者、稽核新主題、稽核新回覆 
recyclebin.inc.php——單獨的回收站程式
ecommerce.inc.php——支付寶,不過最好別動
misc.inc.php——勳章編輯、線上列表定製、聯盟論壇、計劃任務、 Discuz! 程式碼、詞語過濾、 Smilies 編輯、附件型別尺寸、積分交易記錄,管理得真多,甚至連後臺的退出功能也歸這個檔案管。
advertisements.inc.php——廣告管理
database.inc.php——資料備份、資料恢復、資料庫升級、資料表最佳化 
attachments.inc.php——編輯附件,只有一個
counter.inc.php——更新論壇統計
threads.inc.php——批次主題管理
prune.inc.php——批次刪帖、清理短訊息 
plugins.inc.php——外掛設定、外掛管理 
logs.inc.php——執行記錄,除了積分交易記錄以外的所有記錄
tools.inc.php——管理更新快取、 JS 呼叫嚮導、檔案許可權檢查
menu.inc.php——後臺左邊那個好長的導航選單就是了

Api 目錄的檔案是全部被加密過的,無法修改也不能修改,詳情見官方授權協議。

archiver==(特別說明下,因為 archiver 中的目錄的檔案沒有呼叫 commom.inc.php,所以所有變數、函式都不能直接使用,必須要搜尋資料庫來進行判斷)
    index.php archiver 首頁
    include==
        thread.inc.php archiver 主題顯示
        index.inc.php 這個是過濾論壇許可權和介面顯示用的
        header.inc.php archiver 風格控制
        forum.inc.php archiver 論壇顯示

attachments 是論壇附件的存放目錄

customavatars 是論壇頭像的存放目錄

forumdata 是論壇記錄和快取檔案的存放目錄,一般這些檔案都是自動生成的,所以不要修改。至於有什麼用途也說下吧。
    cache==(很好用的功能,呼叫的這裡的檔案變數是非常快的)
       admingroup_X.php 管理組許可權
       cache_bbcodes.php BBCODE 和 SMILES
       cache_blog.php 所有使用者組的許可權變數和 smilies 、 bbcode,還有發帖數等級的資訊
       cache_censor.php 遮蔽資訊
       cache_crons.php 計劃任務
       cache_forumdisplay.php 論壇資訊與公告
       cache_forums.php 同上
       cache_index.php 線上列表、聯盟論壇、公告
       cache_ipbanned.php 封 IP 段記錄
       cache_medals.php 勳章資訊
       cache_post.php smilies 、 bbcode 、 icons
       cache_profilefields.php 暫時不清楚
       cache_settings.php setting 表設定的引數變數
       cache_viewthread.php 論壇,使用者組,smilies 、 bbcode 、 icons
       plugin_XX.php 外掛表
       style_XX.php 風格快取
       usergroup_XX.php 使用者組快取
    templates==(升成的模板 PHP,比較少做外掛會用到,忽略)
根部的一些 LOG 檔案就是後臺記錄檔案了。

images 是圖片目錄,忽略過~

include 是論壇核心程式目錄,非常有必要去了解。
    crons==(這裡是計劃任務檔案,你可以增加自己的計劃任務,而且可以呼叫系統變數)
    tables==(幾個語言檔案,很少改,跳過)
serverbusy.htm 系統錯誤資訊
bbcode.js Discuz! 程式碼 JS 效果檔案
common.js 主要是 DZ 常用的模板函式檔案,可以直接用
floatadv.js 廣告用的
qihoo.js 奇虎的檔案,不改
threadpay.inc.php 出售帖
template.func.php 控制模板快取生成的檔案
sendmail.inc.php 傳送 EMAIL 的程式
security.inc.php 好像是代理一類的,不管
relatethreads.inc.php 應該說是生成相關主題的程式
promotion.inc.php 記錄當前使用者的 IP 等資訊
printable.inc.php 列印主題用的程式
post.func.php 不錯的函式檔案,主要是記錄資訊、更新帖子的函式
pmprompt.inc.php 簡訊息內容處理
newthread.inc.php 發新話題的資訊處理
newreply.inc.php 發回復的資訊處理
misc.func.php 又是函式檔案,控制管理 PM,評分 PM,評分記錄,附件高亮顯示,IP 轉換為地理位置
global.func.php 豐富的函式庫,都是前臺用的,如除去 HTML 、發 PM 、發 EMAIL 等等,建議大家研究下。
forum.func.php 處理論壇資訊用的函式,如論壇選單下拉等等
editpost.inc.php 編輯帖子的資訊處理
discuzcode.func.php Discuz! 程式碼轉換處理程序
db_mysql_error.inc.php 資料庫錯誤彙報
db_mysql.class.php 資料庫中心操作程式
cron.func.php 控制計劃任務執行的程式
counter.inc.php 記錄作業系統與瀏覽器的統計
common.inc.php 最重要的核心程式,讀取 COOKIES 資訊,定義全域性系統函式變數
chinese.class.php 處理亂碼和字元集用的
category.inc.php 控制帖數,今日發帖數的統計
cache.func.php 控制生成快取檔案的程式
blog.func.php 在 BLOG 發帖時資訊處理會用到
attachment.func.php 識別附件拓展名,控制附件前面顯示類別圖片的程式, 還有附件大小的記錄判斷
advertisements.inc.php 處理廣告顯示用的

ipdata==(IP 庫檔案目錄,下面那個 wry.dat 就是 IP 庫,這個我不會改)

plugins==(外掛存放目錄)

templates==(模板目錄,一般做 HACK 也要改模板,因此說明下)
  default==(預設模板,從這個開始,其它風格以此類推)
announcement.htm 公告
blog.htm BLOG 首頁
blog_addremove.htm 移除新增 BLOG
blog_list.htm BLOG 列表 
blog_topic.htm BLOG 中主題顯示
credits.htm 積分策略
css.htm 做風格用的,不過我不懂
customtopics.htm 首頁那個使用者專題
digest.htm 精華區主題
emailfriend.htm EMAIL 推薦主題
faq.htm FAQ 幫助手冊,下面都是,只不過顯示部分不一樣,省略。
footer.htm 論壇底部資訊
forumdisplay.htm 論壇主題列表
forumdisplay_subforum.htm 二級論壇列表
getpasswd.htm 取回密碼
groupexpiry.htm 公眾使用者組
header.htm 頭部連線
index.htm 首頁
login.htm 登入頁面
login_secques.htm 登入時安全提問
lostpasswd.htm 取回密碼
memberlist.htm 會員列表,上面那個
memcp_credits.htm 控制面板——積分交易
memcp_home.htm 控制面板——首頁
memcp_misc.htm 控制面板——好友列表、訂閱列表、收藏夾
memcp_navbar.htm 控制面板——上面那個選單條
memcp_profile.htm 控制面板——編輯個人資料
memcp_usergroups.htm 控制面板——公眾使用者組
nopermission.htm 關閉論壇顯示的提示頁
pay.htm 買帖子
pay_view.htm 看帖子被誰買了
pm.htm 簡訊息左邊選單條
pm_archive.htm 匯出短訊息
pm_archive_html.htm 匯出短訊息 HTML
pm_folder.htm 好像就是列表而已
pm_ignore.htm 忽略列表
pm_search.htm 搜尋短訊息
pm_search_result.htm  搜尋短訊息結果
pm_send.htm  傳送短訊息 
pm_view.htm 瀏覽簡訊息,內容更詳細
pmprompt.htm 首頁新簡訊提示
post_attachments.htm 發帖子的附件模組
post_bbinsert.htm 一堆 BBCODE
post_editpost.htm 編輯帖子
post_newreply.htm 回覆主題
post_newthread.htm 發新話題
post_preview.htm 主題回顧
post_seccode.htm 驗證碼
post_smilies.htm SMILES
post_sminsert.htm 快速發帖欄
rate.htm 評分
rate_view.htm 評分記錄瀏覽
register.htm 註冊
reportpost.htm 主題報告
search.htm 搜尋主頁
search_blog.htm 搜尋 BLOG 列表
search_threads.htm 搜尋後的帖子列表
showmessage.htm 系統返回錯誤資訊那個
stats_main.htm 統計首頁
stats_misc.htm 管理統計、時間、積分等等一堆
stats_navbar.htm 統計上面那個選單條
stats_onlinetime.htm 時間統計
stats_team.htm 管理團隊
topic.htm 又是 QIHOO 的隨機廣告
topicadmin_bump.htm 提升主題
topicadmin_delpost.htm 刪除主題
topicadmin_getip.htm 檢視 IP
topicadmin_merge.htm 合併主題
topicadmin_moderate.htm 高亮、置頂、精華一堆~
topicadmin_move.htm 移動主題
topicadmin_reason.htm 管理理由填寫
topicadmin_refund.htm 強制退款
topicadmin_split.htm 分割主題
topicadmin_stick.htm 置頂
viewpro.htm 會員詳細資訊檢視
viewthread.htm 瀏覽帖子
viewthread_mod.htm 帖子管理記錄
viewthread_pay.htm 帖子支付頁面
viewthread_poll.htm 投票框
viewthread_printable.htm 列印主題
whosonline.htm 詳細的線上動作
actions.lang.php  動作語言包
admincp.lang.php 後臺語言包
archiver.lang.php archiver 語言包
customfaq.lang.php FAQ 手冊的語言包
emails.lang.php 一堆 EMAIL 資訊
messages.lang.php 錯誤資訊語言包
misc.lang.php 像最後編輯,由誰管理等等
modactions.lang.php 管理代號
pms.lang.php PM,都是管理理由
templates.lang.php 前臺模板的語言包
wap.lang.php wap 用的語言包 

wap==(WAP 支援程式,一般很少改,忽略)

相信看了上面的表來熟悉檔案作用,找相應的檔案進行修改,做一個功能增強型 HACK 不是難事。:) 

緒論 本檔案的說明
伴隨著 Discuz! 的成長, 在 Discuz! 快速發展的同時,Discuz! 的外掛也日益豐富, 在這些外掛中存在的不規範問題也是確實存在的, 為了外掛的規範化標準化程式的進行, 也為了方便各位優秀的外掛開發人員, 更為了 Discuz! 程式外掛的傳承, 我們特從現在開始進行外掛開發標準化手冊的編寫, 促進 Discuz! 論壇程式的外掛開發!
目前手冊正在緊張的製作中, 歡迎大家對其中不對的地方進行指正, 個人感覺這個手冊更新的速度那會是相當的快啊
第一章 外掛程式碼書寫規範

        第一節 註釋標準
在 Discuz! 外掛中我們建議開發人員儘量新增簡潔明瞭的註釋語言, 以方便後繼的外掛修改者
以下的幾種註釋都是支援的, 我們建議使用第一種<?php

  echo " 這是第一種例子。
"; // 本例是 C++ 語法的註釋

  /* 本例採用多行的

     註釋方式      */

  echo " 這是第兩種例子。
";

  echo " 這是第三種例子。
"; # 本例使用 UNIX Shell 語法註釋

?>
複製程式碼
第二節 縮排標準
在 Discuz! 外掛中我們建議開發人員儘量使用縮排來完成整個程式, 雖然對於程式沒有影響, 但是縮排會使程式碼易於閱讀, 並且強烈建議使用 Tab 鍵來控制縮排的程度, 並強制定義其距離是 8 個空白字元寬度<?php

  if($loadctrl && (!defined('CURSCRIPT') || CURSCRIPT != 'wap') && substr(PHP_OS, 0, 3) != 'WIN') {

        if($fp = @fopen('/proc/loadavg', 'r')) {

                list($loadaverage) = explode(' ', fread($fp, 6));//請注意縮排

                fclose($fp);

                if($loadaverage > $loadctrl) {

                        header("HTTP/1.0 503 Service Unavailable");//請注意縮排

                        include DISCUZ_ROOT.'./include/serverbusy.htm';

                        exit();

                }//請注意縮排

        }//請注意縮排

}

?>
複製程式碼
第三節 命名標準
良好的命名方式會給程式的開放帶來很大的便利, 同時不良的命名習慣也會給程式開發帶來麻煩, 所以在 Discuz! 外掛中我們建議開發人員儘量使用規範的命名方式來完成整個程式, 仍然以上例為演示, 請注意其中變數名稱, 由於篇幅和時間的關係這裡就不再展開敘述, 這裡給出一個 PHP 程式開發比較通用的命名習慣 (這是一個程式設計標準檔案)PHP 程式設計標準. 總的來說, 只有瞭解系統的程式設計師才能為系統取出最合適的名字, 如果所有的命名都與其自然相適合, 則關係清晰, 含義可以推導得出, 一般人的推想也能在意料之中, 如果你發覺你的命名只有少量能和其對應事物相匹配的話, 最好還是重新設計吧<?php

  if($loadctrl && (!defined('CURSCRIPT') || CURSCRIPT != 'wap') && substr(PHP_OS, 0, 3) != 'WIN') {

        if($fp = @fopen('/proc/loadavg', 'r')) {

                list($loadaverage) = explode(' ', fread($fp, 6));

                fclose($fp);

                if($loadaverage > $loadctrl) {

                        header("HTTP/1.0 503 Service Unavailable");

                        include DISCUZ_ROOT.'./include/serverbusy.htm';

                        exit();

                }

        }

}

?>
複製程式碼
第四節 資料庫設計標準
對於資料庫的設計我們同樣由於篇幅和時間的關係我們不再多說, 請仔細檢視 Discuz! 中的論壇版塊表的設計和命名標準, 同樣的我們提供給您一份手冊給您檢視 MySQL 參考手冊
cdb_forums 論壇表 
fid smallint 論壇 ID 
fup smallint 上級論壇 ID 
type enum 型別 
name char 名稱 
status tinyint 顯示狀態 
displayorder tinyint 顯示順序 
styleid smallint 風格 ID 
threads mediumint 主題數量 
posts mediumint 帖子數量 
todayposts mediumint 今日發帖數量 
lastpost char 最後發表 
allowsmilies tinyint 允許使用表情 
allowhtml tinyint 允許使用 html 
allowbbcode tinyint 允許 bbcode 
allowimgcode tinyint 允許 img 
allowanonymous tinyint 允許匿名 
allowshare tinyint 允許共享到文集和 supe 
allowpostspecial tinyint 允許發表特殊主題 
alloweditrules tinyint 允許版主修改論壇規則 
recyclebin tinyint 是否啟用回收站 
modnewposts tinyint 是否稽核發帖 
jammer tinyint 是否啟用幹擾碼 
disablewatermark tinyint 是否圖片附件增加水印 
inheritedmod tinyint 本論壇或分類版主的權力繼承到下級論壇 
autoclose smallint 自動關閉主題 
forumcolumns tinyint 增加論壇水平橫排設定 
threadcaches tinyint 主題快取功能設定 
allowpaytoauthor tinyint 允許直接向作者支付 

第二章 外掛程式碼安全規範

        第一節 PHP 安全資訊
總的來說 PHP 還是相對安全的 Web 程式, 但是由於一些程式碼在處理方式上的不成熟導致了安全隱患. 由於這個議題範圍太廣, 所以推薦 PHPCHINA 的 Essential PHP Security -PHP 安全基礎一書給大家, 希望大家多看看, 很不錯的一本書哦, 更詳細的 PHP 安全資訊請登入 php.net 查詢.
第二節 我們該怎麼做
對於外掛安全究竟我們要做些什麼怎麼做?建議本內容在看過上節推薦的書之後再看會更好

變數的初始化
這裡不討論 magic_quotes_gpc 和 register_globals 的設定情況, 大家只要注意不要 「無中生有」 變數, 每個變數的得到都是自己初始化過的

邏輯關係清楚
對於邏輯的判定不是一句話能夠說明白的, 舉個簡單的例子, 在判斷上傳檔案的時候, 我們判斷的依據是他的字尾是否在我們允許的字尾裡面, 如果是允許的就執行上傳, 反之就提示上傳檔案字尾不對, 但是如果使用者上傳的檔名是 webshell.xxx.mht(允許 mht 檔案上傳,mht 是一種網頁儲存格式), 於是檔案上傳了, 在 apache 系統的預設配置下, 這個檔案是會用 PHP 來解析的, 利用這個算是 BUG 的問題吧, 小版本人就曾夥同 PHP 安全界知名人士 (幫他匿了) 對我們學校的伺服器完成了入侵, 並最終取得了 root 許可權 (目前俺們學校的伺服器已經修正此問題), 舉這個例子是為了說明程式處理的重要性, 如果當時多一步判斷上傳的檔案, 也許這個安全問題就不再存在, 其實這個例子來說明邏輯關係並不是很合適, 但是程式處理真的是一個非常重要的部分

''與"" 的區別運用
單引號中, 任何變數 ($var) 、特殊跳脫字元 (如 「
」 等) 不會被解析,因此 PHP 的解析速度更快, 跳脫字元僅僅支援 「』」 和 「」 這樣對單引號和反斜槓本身的轉義;
雙引號中, 變數 ($var) 值會代入字串中, 特殊跳脫字元也會被解析成特定的單個字元, 還有一些專門針對上述兩項特性的特殊功能性轉義, 例如 「$」 和 「{$array[『key』]}. 這樣雖然程式編寫更加方便, 但同時 PHP 的解析也很慢;
陣列中, 如果下標不是整型, 而是字串型別, 請務必用單引號將下標括起, 正確的寫法為 $array[『key』], 而不是 $array[key],因為不正確的寫法會使 PHP 解析器認為 key 是一個常量, 進而先判斷常量是否存在, 不存在時才以 「key」 作為下標帶入表示式中, 同時出發錯誤事件, 產生一條 Notice 級錯誤.
因此, 在絕大多數可以使用單引號的場合, 禁止使用雙引號. 依據上述分析, 可以或必須使用單引號的情況包括但不限於下述:
字串為固定值, 不包含 「 」 等特殊跳脫字元;
陣列的固定下標, 例如 $array[『key』];
表示式中不需要帶入變數, 例如 $string = 『test』; 而非 $string = 「test$var」;

資料的過濾與處理
對於任何得到的資料在不能確定或者不能充分確定其來路的時候一定要進行過濾與處理, 在資料進入程式執行處理階段之前, 一定要保證它的準確性和正確性

不要相信任何資料的準確性和正確性
這條視乎是和上面一條雷同, 但是即使是從資料庫中查出來的資料也一樣不能確定, 比如生成 cache 檔案, 如果使用者 POST 的資料錯誤不是我們期望的資料, 而 「恰巧」 生成到檔案中, 於是一個 webshell 產生了, 同樣這個例子也不是很合適, 我只是希望大家明白這麼一點, 如果我們沒有一個很好的處理資料的方式, 那麼程式碼的安全崩潰也就指日可待

不要妄圖直接把低版本的 Discuz! 外掛直接執行
由於每個大版本的升級都會帶來系統構架的一些變化, 可能舊版本的外掛仍然可以使用, 但是或許一些不可預料的問題正在隱藏中, 所以建議任何低版本的 Discuz! 外掛最好是經過仔細研究之後再公告說可以適用新版本 Discuz! 外掛
第三章 Discuz! 中常用變數說明