文件命名規范
- 可以直接通過瀏覽器訪問的普通程序文件,以 .php 后綴命名。
- 被普通程序文件引用的程序文件,以 .inc.php 后綴命名。
- 被普通程序文件,或引用程序文件引用的函數庫或類庫,以 .func.php(函數庫) 或 .class.php(類庫) 后綴命名。
- 模板文件,以 .htm 后綴命名,插件模板文件存在于 source/plugin/identifier/template/ 目錄中,手機版插件模板存在于 source/plugin/identifier/template/mobile/目錄中
- 模板語言包文件,以 .lang.php 后綴命名,插件語言包文件開發時存放于 data/plugindata/ 目錄中,文件名為identifier.lang.php。
- 動態緩存文件,存放于 ./data/cache 目錄中,依據不同的功用進行獨立的命名。
- 使用后臺數據備份功能生成的備份文件,通常以 .sql 為后綴,存放于 data/ 目錄中。
- 有些目錄中存在內容為空白的 index.htm 文件,此類文件是為了避免 Web 服務器打開 Directory Index 時可能產生的安全問題。
- 從 Discuz! X2.5 開始,產品對數據表進行了封裝,封裝后的文件統一命名為 Table 類,通過“C::t(Table類文件名)”方式調用。插件如需封裝自己的數據表,可將 Table 類文件存放于 source/plugin/identifier/table/ 目錄下,并以 table_表名.php 格式命名
class_core.php
source/class/class_core.php 是 Discuz! 的通用初始化模塊程序,其幾乎被所有的外部代碼所引用,在您開始插件設計之前,可以先對該模塊的大致功能做一定的了解。class_core.php 主要完成了以下任務:
- 對不同 PHP 及操作系統環境做了判斷和兼容性處理,使得 Discuz! 可以運行于各種不同配置的服務器環境下。
- 初始化常量 IN_DISCUZ 為 TRUE,用于 include 或 require 后續程序的判斷,避免其他程序被非法引用。
- 讀取社區程序所在絕對路徑,存放于常量 DISCUZ_ROOT 中。
- 加載所需的基本函數庫 source/function/function_core.php。
- 通過 config/config_global.php 中提供的數據庫賬號信息,建立數據庫連接。Discuz! 支持數據表的前綴,如需獲得表的全名,可使用“DB::table('tablename')”方式。
- 判斷用戶是否登錄,如登錄標記 $_G['uid'] 為非 0,同時將 $_G['username'](加了 addslashes 的用戶名,可用于不加修改的插入數據庫)、 $_G['member']['username'](原始的用戶名,可用于頁面顯示)、$_G['member']['password'](用戶密碼的MD5串)等相應用戶信息賦值,其他用戶信息存放于 $_G['member'],更多信息可通過“getuserprofile()”獲取。
- 判斷用戶管理權限,將管理權限標記 $_G['adminid'] 為 1~3 中間的值。0 代表普通用戶;1 代表論壇管理員;2 代表超級版主;3 代表論壇版主。 將用戶權限按照其所在的主用戶組 ID 標記為 $_G['groupid'],相關權限從該 $_G['groupid'] 所對應的系統緩存中讀出,存放于 $_G['group']。
預置讀入了每個模塊的各種設置變量。 - [X2.5變更內容] $_G['username'] 將不進行 addslashes 處理。
原則
所有與插件的程序,包括其全部的前后臺程序,請全部放入 source/plugin/ 目錄中,同時在插件的安裝說明中指出,插件的文件需要復制到哪些目錄。為了避免與其他插件沖突,請盡量建立 source/plugin/ 下的子目錄,并將插件程序放置于子目錄下,這樣您編寫的插件將獲得更好的兼容性。
如果您的插件包含“導航欄”模塊,該模塊將統一用 plugin.php?identifier=xxx&module=yyy 的方式調用,請在相應鏈接、表單中使用此方式。其中 xxx 為插件的惟一標識符,yyy 為模塊名稱。前臺插件外殼程序 plugin.php 已經加載了通用初始化模塊/source/class/class_core.php,不需再次引用。
如果您的插件包含“管理中心”模塊,該模塊將統一用 admin.php?action=plugins&identifier=xxx&pmod=yyy 的方式調用,請在相應鏈接、表單中使用此方式。其中 xxx 和 yyy 的定義與“導航欄”模塊中的相同。系統還允許用 admin.php?action=plugins&edit=$edit&pmod=$mod 的方式來生成鏈接和表單地址,$edit 和 $mod 變量已經被插件后臺管理接口賦值,因此將這兩個變量值帶入 URL 中也是被支持的。由于后臺模塊是被 admin.php 調用,因此已加載了通用初始化模塊 /source/class/class_core.php 并進行了后臺管理人員權限驗證,因此模塊程序中可直接寫功能代碼,不需再進行驗證。
請勿繞過插件的前后臺外殼(plugin.php 和 admin.php)而以直接調用某程序的方式編寫插件,因為這樣既導致了用戶使用不便,代碼冗余和不規范,同時又產生了因驗證程序考慮不周到而帶來的安全隱患。您可以在任何地方,包括鏈接、表單等處方便的使用上述 URL 地址對插件模塊進行調用。
所有與插件有關的程序,包括全部的前臺程序,因全部使用外殼調用,請務必在第一行加入
if(!defined('IN_DISCUZ')) {
exit('Access Denied');
}
后臺程序第一行加入
if(!defined('IN_DISCUZ') || !defined('IN_ADMINCP')) {
exit('Access Denied');
}
以免其被 URL 直接請求調用,產生安全問題。
一般情況下,您發布插件請使用插件導出的功能,以方便使用者一次性導入插件的配置數據,極特殊的情況下,也可以分步驟告知使用者如何進行插件配置管理和安裝此插件。
如果功能獨立,請盡量使用單獨程序的方式編寫插件(即外掛型插件),而盡量少的對論壇本身代碼進行修改,這將為使用者今后的升級帶來很大方便。
您可以修改 Discuz! 本身的數據結構,但更推薦在不很影響效率的前提下將插件數據用另外的數據表存儲,因為不能排除您增加的字段或索引和今后版本 Discuz! 核心數據字段重名的可能。在任何情況下,請不要刪除 Discuz! 標準版本數據結構中已有的字段或索引。
請在插件說明書中對插件做以詳盡的描述,例如增加了哪些字段、哪些表,修改了或新增了哪些程序,版本兼容性,后續支持的提供方式(例如不提供支持,或以什么樣的方式提供)。如果方便,請盡可能提供插件的卸載方法,例如去除哪些字段、刪除哪些新增的程序、將哪些被插件修改的程序恢復原狀等等,使用者會感激您為此付出的辛勤勞動,甚至愿意支付相應的費用支持您未來的發展。如果插件使用另外的數據表存儲,請在插件管理中準確的設置插件所使用的數據表名稱(不包含前綴),這樣用戶在備份數據的時候,能夠把插件數據一同備份。
Discuz! 內置了 8 種自定義積分,存儲于 common_member 表中的 extcredits1 至 extcredits8 字段中,類型為有符號整數。