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