AGAMES 討論區

標題: Discuz! 插件的設計 [打印本頁]

作者: dlalden    時間: 2009-1-16 15:51:35     標題: Discuz! 插件的設計

Discuz! 插件的設計您在開始論壇插件的設計之前,有必要了解一下我們所推薦的插件設計方式,更好的規範性和兼容性,將使得您設計的插件受到更多使用者的歡迎,對於程序員而言,也有助於形成良好的編碼習慣,實現自身能力的提升。如果您有意編寫 Discuz! 論壇插件,請按照先後順序仔細閱讀本文檔。
準備工作插件實現流程開始編寫論壇插件,您應當首先對插件實現的流程有一個大致的了解,以下是我們推薦的插件編寫流程:
文件命名規範Discuz! 按照如下的規範對程序和模板進行命名,請在設計插件時盡量遵循此命名規範:
common.inc.php 模塊功能白皮書./include/common.inc.php 是 Discuz! 的通用初始化模塊程序,其幾乎被所有的外部代碼所引用,在您開始插件設計之前,可以先對該模塊的大致功能做一定的了解。common.inc.php 主要完成了以下任務:
插件接口概述使用管理員賬號登錄 Discuz! 系統設置,在左側菜單將可以看到“插件設置”和“插件管理”兩個選項,使用超級版主或版主賬號登錄,將只出現“插件設置”一個選項。“插件管理”是控制插件打開與否、設計插件模塊、菜單、參數和使用權限的地方,插件開發者可以依照設計意圖,在此進行插件的初步設置,這裡同時也提供插件導入和插件開關的功能,用於導入他人設計的插件和對插件的可用狀態進行變更。“插件設置”是對已經安裝的插件進行設置的地方,供使用者對插件參數進行調整以實現不同的插件功能。即前者主要面向開發者,後者主要面向使用者。

開始編寫一個新插件,請首先在插件管理中,輸入新插件的名稱和惟一標識符。名稱用於表明此插件的用途,例如設置為“虛擬銀行插件”。惟一標識符用於在後續的插件模塊中調用本插件,不可與現有插件重復,命名規則限制與 PHP 變量命名相同,雖然初次設置後仍可改動,但強烈建議一次性將此配置設置好,否則可能涉及到很多代碼方面的變更,增加編碼的麻煩。請注意:惟一標識符請不要設置的過短,或使用有可能與其他插件重復的命名,例如制作此插件的公司叫做 Comsenz Inc.,插件名稱是“虛擬銀行插件”,惟一標識符可設置為“comsenz_virtual_bank”,後面將以“虛擬銀行插件”和 “comsenz_virtual_bank”為例進行說明。

在插件管理中添加插件後,僅僅是增加了一條插件記錄,後面還需要很多相關的設計和設置。在列表中選擇插件的“詳情”進入插件的詳細設置。插件設置分為三個部分:
插件接口中提供了一個通用的插件配置管理程序,在大多數情況下可實現插件的參數配置,省卻了插件開發者自行編寫後台管理模塊(即上面提到的“後台調用(後台菜單)”模塊)的麻煩。通常情況下,應優先使用通用插件配置管理程序來實現插件的參數配置,只有在通用程序確實無法實現時,才自行編寫後台管理模塊。輸入配置名稱和配置變量名、選擇合適的配置類型後,即可為此插件增加一個配置變量,點“詳情”可以編輯此配置變量的更多信息。為了方便插件程序調用使用者配置好的參數,配置變量同樣被存放在了緩存文件中,讀取方法將在後面的《參數讀取與緩存控制》中詳細說明。
注意:您只有在插件管理中將插件設置為“可用”,以上設置才能生效。
參數讀取與緩存控制編寫插件程序時,可能需要讀取一些插件的信息,如果插件需要使用者進行配置,還需要讀取使用者設置的參數值。Discuz! 允許插件程序使用數據庫讀取和緩存讀取這兩種方法獲取插件信息和參數。Discuz! 的插件接口已經對插件信息進行了合理的緩存,使用緩存讀取的方式,將比數據庫讀取速度更快,消耗的資源更是幾乎可以忽略不計。緩存讀取唯一的局限是需要插件使用插件接口提供的通用後台管理程序。如果使用自定義後台模塊的方式,需要後台模塊將參數存放到 pluginvars 數據表中,才能被系統正常緩存。我們強烈推薦您通過緩存讀取插件信息和配置數據。 插件數據結構插件數據使用兩個數據表存放,分別是 plugins 和 pluginvars。前者用於存放插件信息:安裝了多少個插件,就有多少條記錄;後者用於存放插件的配置參數和配置值:所有已安裝的插件總共有多少個配置項目,就有多少條記錄。下面的表格列出了這兩個表的主要字段及其用途說明。
plugins 表:
pluginid插件的惟一 ID,自動遞增
available插件是否可用,1=是,0=否
adminid 使用系統設置中插件接口自帶的插件參數設置程序所需的最低權限等級要求,1=管理員,2=超級版主,3=版主
name插件名稱
identifier插件惟一標識符
description插件簡介
datatables插件數據表,不包含前綴,多個表使用半角逗號“,”分隔
directory插件所在目錄,例如設置為 comsenz_bank,則對應論壇目錄的位置為 ./plugins/comsenz_bank/
copyright插件版權信息
modules 插件模塊信息,數組格式,使用 serialize() 序列化後存放


pluginvars 表:
pluginvarid插件配置的惟一 ID,自動地增
pluginid本項配置所隸屬的插件 ID
displayorder本項配置的顯示順序,數值低的排在前面
title插件配置的名稱
description插件配置的簡介
variable插件配置的變量名
type插件配置的類型
value插件配置的值
extra當本項配置為“選擇(select)”時,可選的取值範圍

如果您使用自行編寫的插件後台管理模塊進行插件參數配置,請盡量將配置項目按照 pluginid 的對應關系,將參數存儲於 pluginvars 表中,這樣系統就可以自動將您增加的配置參數緩存起來,以供插件程序進行調用。
插件參數讀取了解了 Discuz! 插件存儲的數據結構後,您可以在插件程序中根據需要選擇合適的數據讀取方式。由於數據庫讀取方式可以由數據結構推斷而來,因此這裡只介紹緩存讀取的方式,這種方式是我們強烈推薦的插件數據讀取方式。
在管理者配置好插件信息,或用戶進行插件的參數設置之後,系統將根據插件設置的惟一標識符,自動生成一個插件數據的緩存文件,例如惟一標識符為 comsenz_virtual_bank,則緩存文件位於 ./forumdata/cache/plugin_comsenz_virtual_bank.php,您可以打開此文件查看其中的數據內容和格式。緩存採用數組的方式進行存儲,引用此文件即可將所需的插件參數一次性賦值。
其中,$_DPLUGIN['comsenz_virtual_bank'] 這個數組下標,為插件的惟一標識符,所有插件緩存數據,一經被引用,就會賦值到 $_DPLUGIN 這個多維數組中。modules 描述了這個插件的模塊信息,其中 type 為 1~4 的整數值,從小到大依次為“直接鏈接(前台菜單)”、“前台調用(前台菜單)”、“後台調用(後台菜單)”、“包含運行(無菜單)”;vars 描述了這個插件的配置變量,前面為變量名,後面為使用者賦予這個變量的值。
編寫插件的原則與注意事項請在您動手編寫插件之前,還需要仔細的閱讀以下原則,遵循這些原則,將有效的避免可能發生的問題:
  1. if(!defined('IN_DISCUZ')) {
  2.         exit('Access Denied');
  3. }
複製代碼

以免其被 URL 直接請求調用,產生安全問題。
插件鉤子的設計插件鉤子的設計,需要您具有一定編程基礎,比較了解 Discuz! 論壇程序的結構,並能夠使用 PHP 語言撰寫代碼。對於普通用戶,可以略過以下內容。插件鉤子(以下簡稱“鉤子”)屬於插件的一部分,因此在設計鉤子之前應當首先進入後台——插件管理,新增插件或者編輯一個現有的插件,即可看到相關設置。
鉤子的添加鉤子的刪除在鉤子管理界面,您可以隨時刪除某一個鉤子。 鉤子刪除以後,您應當及時修正放置鉤子的程序文件,清除鉤子標記,以免影響您論壇的正常使用。
鉤子的編輯與升級鉤子的放置與調用鉤子設計完成以後,您需要在相應的程序中安放鉤子,不同鉤子由於作用的不同,放置的位置也是不同的。 安放鉤子,您僅僅需要將鉤子的調用代碼放入即可。調用代碼格式如下:
  1. <p> eval($hooks['插件唯一標識符(identifier)_鉤子名稱']); </p>
複製代碼

例如:調用 插件demo 的鉤子 testhook, 我們需要在程序中適當的地方加入下面的代碼
  1. <p> eval($hooks['demo_testhook']); </p>
複製代碼

設計範例此處我們為您提供一個使用鉤子技術的插件範例,完成功能十分簡單,旨在使您直觀的了解鉤子的使用。此範例實現了當游客訪問論壇首頁時,強制用戶登錄的功能。
  1. if(!$discuz_uid) {        showmessage('請您登陸後訪問本站,現在將轉入登錄頁面。', 'logging.php?action=login');}
複製代碼


[ 本帖最後由 dlalden 於 2009-1-16 15:55 編輯 ]




歡迎光臨 AGAMES 討論區 (http://61.244.113.49/) Powered by Discuz! X2