WIKI使用導(dǎo)航
站長(zhǎng)百科導(dǎo)航
站長(zhǎng)專題
- 網(wǎng)站推廣
- 網(wǎng)站程序
- 網(wǎng)站賺錢(qián)
- 虛擬主機(jī)
- cPanel
- 網(wǎng)址導(dǎo)航專題
- 云計(jì)算
- 微博營(yíng)銷
- 虛擬主機(jī)管理系統(tǒng)
- 開(kāi)放平臺(tái)
- WIKI程序與應(yīng)用
- 美國(guó)十大主機(jī)
Discuz:插件設(shè)計(jì)
您在開(kāi)始論壇插件的設(shè)計(jì)之前,有必要了解一下我們所推薦的插件設(shè)計(jì)方式,更好的規(guī)范性和兼容性,將使得您設(shè)計(jì)的插件受到更多使用者的歡 迎,對(duì)于程序員而言,也有助于形成
良好的編碼習(xí)慣,實(shí)現(xiàn)自身能力的提升。如果您有意編寫(xiě) Discuz! 論壇插件,請(qǐng)按照先后順序仔細(xì)閱讀本文檔。
準(zhǔn)備工作
插件實(shí)現(xiàn)流程
開(kāi)始編寫(xiě)論壇插件,您應(yīng)當(dāng)首先對(duì)插件實(shí)現(xiàn)的流程有一個(gè)大致的了解,以下是我們推薦的插件編寫(xiě)流程:
1. 熟練使用 Discuz! 論壇系統(tǒng)后,對(duì)希望完善或補(bǔ)充的個(gè)性化功能進(jìn)行評(píng)估,進(jìn)而提出插件的功能需求。 2. 對(duì)插件做一個(gè)概括性的設(shè)計(jì),例如:需要使用什么菜單、什么參數(shù),配置哪些選項(xiàng)、數(shù)據(jù)結(jié)構(gòu)如何設(shè)計(jì)、前后臺(tái)實(shí)現(xiàn)哪些功能等等。 3. 閱讀本文檔并在系統(tǒng)設(shè)置中實(shí)際體驗(yàn) Discuz! 插件接口所實(shí)現(xiàn)的功用,例如:您的插件應(yīng)當(dāng)如何設(shè)計(jì)才能良好的掛接到論壇系統(tǒng)中 來(lái)。插件接口能夠?qū)崿F(xiàn)哪些功能、不能實(shí)現(xiàn)哪些功能,插件為此而需要做的優(yōu)化、改造和取舍。 4. 編寫(xiě)相應(yīng)程序代碼和模板語(yǔ)句,實(shí)現(xiàn)所需的功能并進(jìn)行代碼測(cè)試、兼容性測(cè)試和代碼改進(jìn)。 5. 如果需要公開(kāi)您的插件,可以用插件導(dǎo)出的方式,將插件配置信息導(dǎo)出到一個(gè)文本文件中,連同相應(yīng)的程序和模板文件一同打包。同 時(shí),編寫(xiě)一個(gè)適合新手的插件的說(shuō)明書(shū)也是必不可少的,其中包括:插件適用的 Discuz! 版本、功能概述、兼容性聲明、安裝方 法、使用方法、卸載方法等等。 6. 將插件提供給他人,或自己使用,根據(jù)使用者反饋,對(duì)插件進(jìn)行完善。插件實(shí)現(xiàn)流程至此結(jié)束。
文件命名規(guī)范
Discuz! 按照如下的規(guī)范對(duì)程序和模板進(jìn)行命名,請(qǐng)?jiān)谠O(shè)計(jì)插件時(shí)盡量遵循此命名規(guī)范:
1. 可以直接通過(guò)瀏覽器訪問(wèn)的普通程序文件,以 .php 后綴命名。 2. 被普通程序文件引用的程序文件,以 .inc.php 后綴命名。 3. 被普通程序文件,或引用程序文件引用的函數(shù)庫(kù)或類庫(kù),以 .func.php(函數(shù)庫(kù)) 或 .class.php(類庫(kù)) 后綴命名。 4. 模板文件,以 .htm 后綴命名,模板文件只存在于 ./templates 目錄中。 5. 模板語(yǔ)言包文件,以 .lang.php 后綴命名,語(yǔ)言包文件只存放于 ./templates 目錄中,與模板文件同級(jí)目錄。 6. 被編譯后的模板文件,以 .tpl.php 后綴命名,前面的數(shù)字是模板套系的 ID,下劃線后面的是模板原名,編譯模板文件只存在于 ./forumdata/templates 目錄中。 7. 動(dòng)態(tài)緩存文件,存放于 ./forumdata/cache 目錄中,依據(jù)不同的功用進(jìn)行獨(dú)立的命名。 8. 使用后臺(tái)數(shù)據(jù)備份功能生成的備份文件,通常以 .sql 為后綴,存放于 ./forumdata/ 目錄中。 9. 有些目錄中存在內(nèi)容為空白的 index.htm 文件,此類文件是為了避免 Web 服務(wù)器打開(kāi) Directory Index 時(shí)可能產(chǎn)生的安全問(wèn)題
common.inc.php 模塊功能白皮書(shū)
./include/common.inc.php 是 Discuz! 的通用初始化模塊程序,其幾乎被所有的外部代碼所引用,在您開(kāi)始插件設(shè)計(jì)之前,可以先對(duì)該模
塊的大致功能做一定的了解。common.inc.php 主要完成了以下任務(wù):
1. 對(duì)不同 PHP 及操作系統(tǒng)環(huán)境做了判斷和兼容性處理,使得 Discuz! 可以運(yùn)行于各種不同配置的服務(wù)器環(huán)境下。 2. 初始化常量 IN_DISCUZ 為 TRUE,用于 include 或 require 后續(xù)程序的判斷,避免其他程序被非法引用。 3. 讀取論壇所在絕對(duì)路徑,存放于常量 DISCUZ_ROOT 中。 4. 加載所需的基本函數(shù)庫(kù) include/global.func.php。 5. 通過(guò) config.inc.php 中提供的數(shù)據(jù)庫(kù)賬號(hào)信息,建立數(shù)據(jù)庫(kù)連接。Discuz!支持?jǐn)?shù)據(jù)表的前綴,如需獲得表的全名,可使 用”{$tablepre}tablename” 或 $tablepre.’tablename’的方式。 6. 判斷用戶是否登錄,如登錄標(biāo)記 $discuz_uid 為非 0,同時(shí)將 $discuz_user(加了 slash 的用戶名,可用于不加修改的插入數(shù) 據(jù)庫(kù))、 $discuz_userss(原始的用戶名,可用于頁(yè)面顯示)、$discuz_pw(用戶密碼的MD5串)、$discuz_secques(登錄提示 問(wèn)題的加密串)等相應(yīng)用戶信息賦值。 7. 判斷用戶管理權(quán)限,將管理權(quán)限標(biāo)記 $adminid 為 -1~3 中間的值。-1 代表為特殊用戶組用戶。0 代表普通用戶;1 代表論壇管 理員;2 代表超級(jí)版主;3 代表論壇版主。將用戶權(quán)限按照其所在的主用戶組 ID 標(biāo)記為 $groupid,相關(guān)權(quán)限從該 $groupid 所 對(duì)應(yīng)的系統(tǒng)緩存中讀出(./forumdata/cache/usergroup_$groupid.php)。將用戶擴(kuò)展權(quán)限按照其擴(kuò)展用戶組 ID 標(biāo)記為 $ extgroupids,中間以 \t(tab) 分隔,格式為“$groupid1\t$groupid2...”,擴(kuò)展用戶組用于確定用戶的擴(kuò)展瀏覽權(quán)限,例如 能否訪問(wèn)某些有特殊權(quán)限設(shè)定的論壇等。 8. 讀入系統(tǒng)設(shè)置中的各種變量,并根據(jù) Cache 模塊的設(shè)定,根據(jù)當(dāng)前被調(diào)用的程序文件名(如 index.php,forumdisplay.php 等 等)讀入相應(yīng)的緩存代碼。緩存代碼被存放于 ./forumdata/cache/ 中。除了對(duì)應(yīng)當(dāng)前程序的緩存,可能還會(huì)加載一些通用的緩存 數(shù)據(jù),例如整個(gè)論壇的設(shè)置(./forumdata/cache/cache_settings.php)、界面風(fēng)格(./forumdata/cache/style_x.php)、當(dāng) 前用戶的用戶組(./forumdata/cache/usergroup_x.php)、管理組權(quán)限(./forumdata/cache/adminusergroup_x.php)等。 9. 緩存數(shù)據(jù)的格式,大多是存放在 $_DCACHE['cachename'] 數(shù)組中,有些常用的參數(shù),如系統(tǒng)設(shè)置中的參數(shù)、風(fēng)格界面等,通常還 被進(jìn)行了展開(kāi)操作(extract)或使用常量進(jìn)行賦值。 10. 用戶如果處在登錄狀態(tài),會(huì)自動(dòng)讀出 members 表相關(guān)用戶的參數(shù)值,用戶的個(gè)性設(shè)置參數(shù):如時(shí)差、時(shí)間格式、界面風(fēng)格等等,會(huì) 根據(jù)實(shí)際情況覆蓋系統(tǒng)默認(rèn)值,因此在后續(xù)程序通常不用再做判斷。 11. 如果程序提交的 URL 中包含 tid=x 或 fid=x,common.inc.php 模塊會(huì)自動(dòng)讀出其所對(duì)應(yīng)的論壇記錄及包括 access masks、版 主設(shè)定等相應(yīng)權(quán)限,記錄在 $forum 變量中。后續(xù)程序只要通過(guò)URL將tid或fid傳遞過(guò)來(lái),便可通過(guò) $forum 數(shù)組的存在性或相關(guān) 參數(shù)來(lái)對(duì)論壇權(quán)限進(jìn)行判斷,不需要再讀 forums 表的資料。
插件接口概述
使用管理員賬號(hào)登錄 Discuz! 系統(tǒng)設(shè)置,在左側(cè)菜單將可以看到“插件設(shè)置”和“插件管理”兩個(gè)選項(xiàng),使用超級(jí)版主或版主賬號(hào)登錄,將 只出現(xiàn)“插件設(shè)置”一個(gè)選項(xiàng)?!安寮芾怼笔强刂撇寮蜷_(kāi)與否、設(shè)計(jì)插件模塊、菜單、參數(shù)和使用權(quán)限的地方,插件開(kāi)發(fā)者可以依照設(shè)計(jì) 意圖,在此進(jìn)行插件的初步設(shè)置,這里同時(shí)也提供插件導(dǎo)入和插件開(kāi)關(guān)的功能,用于導(dǎo)入他人設(shè)計(jì)的插件和對(duì)插件的可用狀態(tài)進(jìn)行變更?!安?件設(shè)置”是對(duì)已經(jīng)安裝的插件進(jìn)行設(shè)置的地方,供使用者對(duì)插件參數(shù)進(jìn)行調(diào)整以實(shí)現(xiàn)不同的插件功能。即前者主要面向開(kāi)發(fā)者,后者主要面向使用者。
開(kāi)始編寫(xiě)一個(gè)新插件,請(qǐng)首先在插件管理中,輸入新插件的名稱和惟一標(biāo)識(shí)符。名稱用于表明此插件的用途,例如設(shè)置為“虛擬銀行插件”。惟一標(biāo)識(shí)符用于在后續(xù)的插件模塊中調(diào)用本插件,不可與現(xiàn)有插件重復(fù),命名規(guī)則限制與 PHP 變量命名相同,雖然初次設(shè)置后仍可改動(dòng),但強(qiáng)烈建議一次性將此配置設(shè)置好,否則可能涉及到很多代碼方面的變更,增加編碼的麻煩。請(qǐng)注意:惟一標(biāo)識(shí)符請(qǐng)不要設(shè)置的過(guò)短,或使用有可能與其他插件重復(fù)的命名,例如制作此插件的公司叫做 Comsenz Inc.,插件名稱是“虛擬銀行插件”,惟一標(biāo)識(shí)符可設(shè)置為“comsenz_virtual_bank”,后面將以“虛擬銀行插件”和“comsenz_virtual_bank”為例進(jìn)行說(shuō)明。
在插件管理中添加插件后,僅僅是增加了一條插件記錄,后面還需要很多相關(guān)的設(shè)計(jì)和設(shè)置。在列表中選擇插件的“詳情”進(jìn)入插件的詳細(xì)設(shè)置。插件設(shè)置分為三個(gè)部分:
- 插件基本設(shè)置:
設(shè)置插件的基本參數(shù),配置項(xiàng)目右邊括號(hào)中的內(nèi)容,為此設(shè)置對(duì)應(yīng)的參數(shù)名稱,調(diào)用方法將在后面的《參數(shù)讀取與緩存控制》中詳細(xì)說(shuō)明。
- 插件模塊和自定義菜單:
插件接口默認(rèn)提供四種可選的模塊方式:
1. 直接鏈接(前臺(tái)菜單):可在前臺(tái)右上角加入一個(gè)菜單項(xiàng),可自主指派菜單鏈接的 URL。注意:由于引用外部程序,因此即便設(shè)置了 模塊的使用等級(jí),您的程序如需權(quán)限判斷,仍需要引用 common.inc.php 和插件相關(guān)的緩存文件(將在后面的《參數(shù)讀取與緩存控 制》中詳細(xì)說(shuō)明),并自行判斷使用等級(jí)是否合法。 2. 前臺(tái)調(diào)用(前臺(tái)菜單):與直接鏈接類似,但其調(diào)用的是插件的一個(gè)模塊,模塊文件名指派為“./plugins/插件目錄/插件模塊名. inc.php”,由 plugin.php 調(diào)用此模塊,調(diào)用 URL 將在后面的《編寫(xiě)插件的原則與注意事項(xiàng)》中詳細(xì)說(shuō)明。 3. 后臺(tái)調(diào)用(后臺(tái)菜單):可在后臺(tái)插件設(shè)置中為此插件增添一個(gè)管理模塊,模塊文件名指派為“./plugins/插件目錄/插件模塊名. inc.php”,由 admincp.php 調(diào)用此模塊,調(diào)用 URL 將在后面的《編寫(xiě)插件的原則與注意事項(xiàng)》中詳細(xì)說(shuō)明。 4. 包含運(yùn)行(無(wú)菜單):可設(shè)置一個(gè)在論壇所有頁(yè)面均包含運(yùn)行的腳本,此腳本在 ./include/common.inc.php 中加載,腳本文件名 指派為“./plugins/插件目錄/插件模塊名.inc.php”。請(qǐng)注意,為了不導(dǎo)致錯(cuò)誤的插件影響論壇運(yùn)行,在 common.inc.php 加載 此模塊時(shí),屏蔽了錯(cuò)誤信息,因此請(qǐng)務(wù)必仔細(xì)檢查是否存在語(yǔ)法錯(cuò)誤,任何微小的語(yǔ)法錯(cuò)誤都將不被提示出來(lái),并且導(dǎo)致此模塊不被 正常加載。如果您配置了不正確的包含腳本而導(dǎo)致論壇系統(tǒng)設(shè)置無(wú)法使用,刪除服務(wù)器上相應(yīng)的腳本文件即可解決。
您可以為每個(gè)模塊設(shè)置不同的使用等級(jí),例如設(shè)置為“超級(jí)版主”,則超級(jí)版主及更高的管理者(例如論壇管理員)可以使用此模塊。
- 插件鉤子設(shè)置:
插件鉤子能夠?qū)⒉寮a埋藏在程序中的任意位置,從而實(shí)現(xiàn)更加靈活的插件功能,最大限度的減少對(duì)原有程序代碼的修改。 論壇版本升級(jí)后,只需將相應(yīng)鉤子重新埋入相應(yīng)程序中,原有插件即可繼續(xù)使用。 關(guān)于插件鉤子的具體設(shè)計(jì)方法請(qǐng)見(jiàn)下面的《插件鉤子的設(shè)計(jì)》。
- 插件變量配置:
插件接口中提供了一個(gè)通用的插件配置管理程序,在大多數(shù)情況下可實(shí)現(xiàn)插件的參數(shù)配置,省卻了插件開(kāi)發(fā)者自行編寫(xiě)后臺(tái)管理模塊(即上面提到的“后臺(tái)調(diào)用(后臺(tái)菜單)”模塊)的麻煩。通常情況下,應(yīng)優(yōu)先使用通用插件配置管理程序來(lái)實(shí)現(xiàn)插件的參數(shù)配置,只有在通用程序確實(shí)無(wú)法實(shí)現(xiàn)時(shí),才自行編寫(xiě)后臺(tái)管理模塊。輸入配置名稱和配置變量名、選擇合適的配置類型后,即可為此插件增加一個(gè)配置變量,點(diǎn)“詳情”可以編輯此配置變量的更多信息。為了方便插件程序調(diào)用使用者配置好的參數(shù),配置變量同樣被存放在了緩存文件中,讀取方法將在后面的《參數(shù)讀取與緩存控制》中詳細(xì)說(shuō)明。
注意:您只有在插件管理中將插件設(shè)置為“可用”,以上設(shè)置才能生效。
參數(shù)讀取與緩存控制
編寫(xiě)插件程序時(shí),可能需要讀取一些插件的信息,如果插件需要使用者進(jìn)行配置,還需要讀取使用者設(shè)置的參數(shù)值。Discuz! 允許插件程序使用數(shù)據(jù)庫(kù)讀取和緩存讀取這兩種方法獲取插件信息和參數(shù)。Discuz! 的插件接口已經(jīng)對(duì)插件信息進(jìn)行了合理的緩存,使用緩存讀取的方式,將比數(shù)據(jù)庫(kù)讀取速度更快,消耗的資源更是幾乎可以忽略不計(jì)。緩存讀取唯一的局限是需要插件使用插件接口提供的通用后臺(tái)管理程序。如果使用自定義后臺(tái)模塊的方式,需要后臺(tái)模塊將參數(shù)存放到 pluginvars 數(shù)據(jù)表中,才能被系統(tǒng)正常緩存。我們強(qiáng)烈推薦您通過(guò)緩存讀取插件信息和配置數(shù)據(jù)。
- 插件數(shù)據(jù)結(jié)構(gòu)
插件數(shù)據(jù)使用兩個(gè)數(shù)據(jù)表存放,分別是 plugins 和 pluginvars。前者用于存放插件信息:安裝了多少個(gè)插件,就有多少條記錄;后者用于存放插件的配置參數(shù)和配置值:所有已安裝的插件總共有多少個(gè)配置項(xiàng)目,就有多少條記錄。下面的表格列出了這兩個(gè)表的主要字段及其用途說(shuō)明。
plugins 表:
pluginid 插件的惟一 ID,自動(dòng)遞增 available 插件是否可用,1=是,0=否 adminid 使用系統(tǒng)設(shè)置中插件接口自帶的插件參數(shù)設(shè)置程序所需的最低權(quán)限等級(jí)要求,1=管理員,2=超級(jí)版主,3=版主 name 插件名稱 identifier 插件惟一標(biāo)識(shí)符 description 插件簡(jiǎn)介 datatables 插件數(shù)據(jù)表,不包含前綴,多個(gè)表使用半角逗號(hào)“,”分隔 directory 插件所在目錄,例如設(shè)置為 comsenz_bank,則對(duì)應(yīng)論壇目錄的位置為 ./plugins/comsenz_bank/ copyright 插件版權(quán)信息 modules 插件模塊信息,數(shù)組格式,使用 serialize() 序列化后存放
pluginvars 表:
pluginvarid 插件配置的惟一 ID,自動(dòng)地增 pluginid 本項(xiàng)配置所隸屬的插件 ID displayorder 本項(xiàng)配置的顯示順序,數(shù)值低的排在前面 title 插件配置的名稱 description 插件配置的簡(jiǎn)介 variable 插件配置的變量名 type 插件配置的類型 value 插件配置的值 extra 當(dāng)本項(xiàng)配置為“選擇(select)”時(shí),可選的取值范圍
如果您使用自行編寫(xiě)的插件后臺(tái)管理模塊進(jìn)行插件參數(shù)配置,請(qǐng)盡量將配置項(xiàng)目按照 pluginid 的對(duì)應(yīng)關(guān)系,將參數(shù)存儲(chǔ)于 pluginvars 表中,這樣系統(tǒng)就可以自動(dòng)將您增加的配置參數(shù)緩存起來(lái),以供插件程序進(jìn)行調(diào)用。
- 插件參數(shù)讀取
了解了 Discuz! 插件存儲(chǔ)的數(shù)據(jù)結(jié)構(gòu)后,您可以在插件程序中根據(jù)需要選擇合適的數(shù)據(jù)讀取方式。由于數(shù)據(jù)庫(kù)讀取方式可以由數(shù)據(jù)結(jié)構(gòu)推斷而來(lái),因此這里只介紹緩存讀取的方式,這種方式是我們強(qiáng)烈推薦的插件數(shù)據(jù)讀取方式。
在管理者配置好插件信息,或用戶進(jìn)行插件的參數(shù)設(shè)置之后,系統(tǒng)將根據(jù)插件設(shè)置的惟一標(biāo)識(shí)符,自動(dòng)生成一個(gè)插件數(shù)據(jù)的緩存文件,例如惟一標(biāo)識(shí)符為 comsenz_virtual_bank,則緩存文件位于 ./forumdata/cache/plugin_comsenz_virtual_bank.php,您可以打開(kāi)此文件查看其中的數(shù)據(jù)內(nèi)容和格式。緩存采用數(shù)組的方式進(jìn)行存儲(chǔ),引用此文件即可將所需的插件參數(shù)一次性賦值。
其中,$_DPLUGIN['comsenz_virtual_bank'] 這個(gè)數(shù)組下標(biāo),為插件的惟一標(biāo)識(shí)符,所有插件緩存數(shù)據(jù),一經(jīng)被引用,就會(huì)賦值到 $_DPLUGIN 這個(gè)多維數(shù)組中。modules 描述了這個(gè)插件的模塊信息,其中 type 為 1~4 的整數(shù)值,從小到大依次為“直接鏈接(前臺(tái)菜單)”、“前臺(tái)調(diào)用(前臺(tái)菜單)”、“后臺(tái)調(diào)用(后臺(tái)菜單)”、“包含運(yùn)行(無(wú)菜單)”;vars 描述了這個(gè)插件的配置變量,前面為變量名,后面為使用者賦予這個(gè)變量的值。
編寫(xiě)插件的原則與注意事項(xiàng)
請(qǐng)?jiān)谀鷦?dòng)手編寫(xiě)插件之前,還需要仔細(xì)的閱讀以下原則,遵循這些原則,將有效的避免可能發(fā)生的問(wèn)題:
1. 所有與插件的程序,包括其全部的前后臺(tái)程序,請(qǐng)全部放入 ./plugins 目錄中,同時(shí)在插件的安裝說(shuō)明中指出,插件的文件需要復(fù)制到哪些目錄。為了避免與其他插件沖突,請(qǐng)盡量建立 ./plugins 下的子目錄,并將插件程序放置于子目錄下,這樣您編寫(xiě)的插件將獲得更好的兼容性。
2. 如果您的插件包含“前臺(tái)調(diào)用(前臺(tái)菜單)”模塊,該模塊將統(tǒng)一用 plugin.php?identifier=xxx&module=yyy 的方式調(diào)用,請(qǐng)?jiān)谙鄳?yīng)鏈接、表單中使用此方式。其中 xxx 為插件的惟一標(biāo)識(shí)符,yyy 為模塊名稱。前臺(tái)插件外殼程序 plugin.php 已經(jīng)加載了通用初始化模塊(./include/common.inc.php),不需再次引用。
3. 如果您的插件包含“后臺(tái)調(diào)用(后臺(tái)菜單)”模塊,該模塊將統(tǒng)一用 admincp.php?action=plugins&identifier=xxx&mod=yyy 的方式調(diào)用,請(qǐng)?jiān)谙鄳?yīng)鏈接、表單中使用此方式。其中 xxx 和 yyy 的定義與“前臺(tái)調(diào)用(前臺(tái)菜單)”模塊中的相同。系統(tǒng)還允許用 admincp.php?action=plugins&edit=$edit&mod=$mod 的方式來(lái)生成鏈接和表單地址,$edit 和 $mod 變量已經(jīng)被插件后臺(tái)管理接口賦值,因此將這兩個(gè)變量值帶入 URL 中也是被支持的。由于后臺(tái)模塊是被 admincp.php 調(diào)用,因此已加載了通用初始化模塊(./include/common.inc.php)并進(jìn)行了后臺(tái)管理人員權(quán)限驗(yàn)證,因此模塊程序中可直接寫(xiě)功能代碼,不需再進(jìn)行驗(yàn)證。
4. 請(qǐng)勿繞過(guò)插件的前后臺(tái)外殼(plugin.php 和 admincp.php)而以直接調(diào)用某程序的方式編寫(xiě)插件,因?yàn)檫@樣既導(dǎo)致了用戶使用不便,代碼冗余和不規(guī)范,同時(shí)又產(chǎn)生了因驗(yàn)證程序考慮不周到而帶來(lái)的安全隱患。您可以在任何地方,包括鏈接、表單等處方便的使用上述 URL 地址對(duì)插件模塊進(jìn)行調(diào)用。
5. 所有與插件有關(guān)的程序,包括全部的前后臺(tái)程序,因全部使用外殼調(diào)用,請(qǐng)務(wù)必在第一行加入
if(!defined('IN_DISCUZ')) { exit('Access Denied'); }
以免其被 URL 直接請(qǐng)求調(diào)用,產(chǎn)生安全問(wèn)題。
6. 一般情況下,您發(fā)布插件請(qǐng)使用插件導(dǎo)出的功能,以方便使用者一次性導(dǎo)入插件的配置數(shù)據(jù),極特殊的情況下,也可以分步驟告知使用者如何進(jìn)行插件配置管理和安裝此插件。
7. 如果功能獨(dú)立,請(qǐng)盡量使用單獨(dú)程序的方式編寫(xiě)插件(即外掛型插件),而盡量少的對(duì)論壇本身代碼進(jìn)行修改,這將為使用者今后的升級(jí)帶來(lái)很大方便。
8. 您可以修改 Discuz! 本身的數(shù)據(jù)結(jié)構(gòu),但更推薦在不很影響效率的前提下將插件數(shù)據(jù)用另外的數(shù)據(jù)表存儲(chǔ),因?yàn)椴荒芘懦黾拥淖侄位蛩饕徒窈蟀姹?Discuz! 核心數(shù)據(jù)字段重名的可能。在任何情況下,請(qǐng)不要?jiǎng)h除 Discuz! 標(biāo)準(zhǔn)版本數(shù)據(jù)結(jié)構(gòu)中已有的字段或索引。
9. 請(qǐng)?jiān)诓寮f(shuō)明書(shū)中對(duì)插件做以詳盡的描述,例如增加了哪些字段、哪些表,修改了或新增了哪些程序,版本兼容性,后續(xù)支持的提供方式(例如不提供支持,或以什么樣的方式提供)。如果方便,請(qǐng)盡可能提供插件的卸載方法,例如去除哪些字段、刪除哪些新增的程序、將哪些被插件修改的程序恢復(fù)原狀等等,使用者會(huì)感激您為此付出的辛勤勞動(dòng),甚至愿意支付相應(yīng)的費(fèi)用支持您未來(lái)的發(fā)展。
10. 如果插件使用另外的數(shù)據(jù)表存儲(chǔ),請(qǐng)?jiān)诓寮芾碇袦?zhǔn)確的設(shè)置插件所使用的數(shù)據(jù)表名稱(不包含前綴),這樣用戶在備份數(shù)據(jù)的時(shí)候,能夠把插件數(shù)據(jù)一同備份。
11. Discuz! 自 4.0.0 版本起,內(nèi)置了 8 種自定義積分,存儲(chǔ)于 members 表中的 extcredits1 至 extcredits8 字段中,類型為有符號(hào)整數(shù),您可以在引用 common.inc.php 后,在 $extcredits 或 $_DCACHE['settings']['extcredits'] 中讀取 8 種積分的啟用信息(詳情請(qǐng)參考 ./forumdata/cache/cache_settings.php)。插件程序中如需更新用戶積分,可直接 UPDATE 相應(yīng)的積分字段,無(wú)需其他操作。
插件鉤子的設(shè)計(jì)
插件鉤子的設(shè)計(jì),需要您具有一定編程基礎(chǔ),比較了解 Discuz! 論壇程序的結(jié)構(gòu),并能夠使用 PHP 語(yǔ)言撰寫(xiě)代碼。對(duì)于普通用戶,可以略過(guò)以下內(nèi)容。 插件鉤子(以下簡(jiǎn)稱“鉤子”)屬于插件的一部分,因此在設(shè)計(jì)鉤子之前應(yīng)當(dāng)首先進(jìn)入后臺(tái)——插件管理,新增插件或者編輯一個(gè)現(xiàn)有的插件,即可看到相關(guān)設(shè)置。
- 鉤子的添加
鉤子名稱:在一個(gè)插件內(nèi),鉤子的名稱是唯一的,不可重復(fù)。名稱可以由英文字母、數(shù)字和“_”組成,不支持中文,最長(zhǎng)255個(gè)字符。為了便于理解和記憶鉤子的作用, 名 稱應(yīng)當(dāng)盡量簡(jiǎn)潔清晰,能夠表述一定的含義。注意:鉤子名稱對(duì)字母大小敏感,例如:Index_start 和 index_start 將視為兩個(gè)不同的鉤子。 鉤子描述:對(duì)鉤子的詳細(xì)說(shuō)明,如功能介紹、調(diào)用方法、使用方法等。 PHP代碼:這里是鉤子的核心內(nèi)容,也是一段PHP代碼,需要您自行設(shè)計(jì),完成鉤子需要處理的數(shù)據(jù)或者需要執(zhí)行的操作。 可用:每個(gè)插件允許有多個(gè)鉤子,您可以自由選擇關(guān)閉或者開(kāi)啟某個(gè)鉤子。
- 鉤子的刪除
在鉤子管理界面,您可以隨時(shí)刪除某一個(gè)鉤子。 鉤子刪除以后,您應(yīng)當(dāng)及時(shí)修正放置鉤子的程序文件,清除鉤子標(biāo)記,以免影響您論壇的正常使用。
- 鉤子的編輯與升級(jí)
編輯:插件設(shè)計(jì)階段,您可能需要隨時(shí)編輯鉤子,每次更改,系統(tǒng)會(huì)自動(dòng)更新緩存文件,您可以立即看到更改的效果。如果是更改鉤子名稱,那么您可能需要調(diào)整鉤子放置的程序,修改鉤子調(diào)用的名稱。
升級(jí):論壇程序進(jìn)行升級(jí)之前,您應(yīng)當(dāng)使用插件的導(dǎo)出功能,導(dǎo)出插件備份。論壇升級(jí)并正常運(yùn)行后,再導(dǎo)入插件備份,修改相關(guān)程序,重新安放鉤子。
- 鉤子的放置與調(diào)用
鉤子設(shè)計(jì)完成以后,您需要在相應(yīng)的程序中安放鉤子,不同鉤子由于作用的不同,放置的位置也是不同的。 安放鉤子,您僅僅需要將鉤子的調(diào)用代碼放入即可。調(diào)用代碼格式如下:
eval($hooks['插件唯一標(biāo)識(shí)符(identifier)_鉤子名稱']);
例如:調(diào)用 插件demo 的鉤子 testhook, 我們需要在程序中適當(dāng)?shù)牡胤郊尤胂旅娴拇a
eval($hooks['demo_testhook']);
- 設(shè)計(jì)范例
此處我們?yōu)槟峁┮粋€(gè)使用鉤子技術(shù)的插件范例,完成功能十分簡(jiǎn)單,旨在使您直觀的了解鉤子的使用。此范例實(shí)現(xiàn)了當(dāng)游客訪問(wèn)論壇首頁(yè)時(shí),強(qiáng)制用戶登錄的功能。
1. 進(jìn)入系統(tǒng)設(shè)置中的插件管理,添加一個(gè)名稱和惟一標(biāo)識(shí)符均為 demo 的插件。
2. 編輯插件 demo 詳情,找到“插件鉤子設(shè)置”,添加一個(gè)名為 index_force_loggedin 的鉤子,然后提交。
3. 編輯鉤子 index_force_loggedin,按如下內(nèi)容填寫(xiě)設(shè)置:
鉤子描述:當(dāng)游客訪問(wèn)論壇首頁(yè)的時(shí)候,程序會(huì)彈出提示框,并自動(dòng)跳轉(zhuǎn)到登陸頁(yè)面。
PHP代碼:
if(!$discuz_uid) { showmessage('請(qǐng)您登陸后訪問(wèn)本站,現(xiàn)在將轉(zhuǎn)入登錄頁(yè)面。', 'logging.php?action=login'); }
4. 提交后,回到此插件的設(shè)置頁(yè)面。將鉤子 index_force_loggedin 設(shè)置為可用。 5. 點(diǎn)擊左側(cè)導(dǎo)航,進(jìn)入插件管理,將插件 demo 設(shè)置為可用。 6. 編輯論壇程序 index.php 安放鉤子,方法如下:
查找代碼:
$discuz_action = 1;
在上述代碼下放添加代碼:
eval($hooks['demo_index_alter']);
7. 保存文件后將文件上傳到服務(wù)器。
8. 至此,一個(gè)簡(jiǎn)單的使用鉤子實(shí)現(xiàn)的插件已經(jīng)徹底完成。您可以退出登陸并訪問(wèn)論壇首頁(yè),測(cè)試一下插件的效果。
Discuz! 插件的鉤子技術(shù),為廣大的插件開(kāi)發(fā)者提供了一個(gè)更加靈活的插件設(shè)計(jì)機(jī)制。當(dāng) Discuz! 升級(jí)后,用戶只需重新將鉤子調(diào)用代碼安放到程序中原來(lái)的位置,就幾乎可以繼續(xù)使用原來(lái)已安裝的插件,降低了對(duì)于程序修改的幅度和插件安裝的難度,更加有利于插件程序的規(guī)范、管理、維護(hù)、相互交流。因此我們強(qiáng)烈建議插件開(kāi)發(fā)者能夠深入研究個(gè)應(yīng)用這一機(jī)制,創(chuàng)作出越來(lái)越多的優(yōu)秀插件。