插件製作的基本思路是:(初學者適用)
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! 中常用變量説明