?? plugins_design.htm
字號:
pluginvarid 插件配置的惟一 ID,自動地增
pluginid 本項配置所隸屬的插件 ID
displayorder 本項配置的顯示順序,數值低的排在前面
title 插件配置的名稱
description 插件配置的簡介
variable 插件配置的變量名
type 插件配置的類型
value 插件配置的值
extra 當本項配置為“選擇(select)”時,可選的取值范圍
</pre></td></tr></table>
<p>如果您使用自行編寫的插件后臺管理模塊進行插件參數配置,請盡量將配置項目按照 pluginid 的對應關系,將參數存儲于 pluginvars 表中,這樣系統就可以自動將您增加的配置參數緩存起來,以供插件程序進行調用。
</ul><p class="subtitle">插件參數讀取<ul>
<p>了解了 Discuz! 插件存儲的數據結構后,您可以在插件程序中根據需要選擇合適的數據讀取方式。由于數據庫讀取方式可以由數據結構推斷而來,因此這里只介紹緩存讀取的方式,這種方式是我們強烈推薦的插件數據讀取方式。
<p>在管理者配置好插件信息,或用戶進行插件的參數設置之后,系統將根據插件設置的惟一標識符,自動生成一個插件數據的緩存文件,例如惟一標識符為 comsenz_virtual_bank,則緩存文件位于 ./forumdata/cache/plugin_comsenz_virtual_bank.php,您可以打開此文件查看其中的數據內容和格式。緩存采用數組的方式進行存儲,引用此文件即可將所需的插件參數一次性賦值。
<p>其中,$_DPLUGIN['comsenz_virtual_bank'] 這個數組下標,為插件的惟一標識符,所有插件緩存數據,一經被引用,就會賦值到 $_DPLUGIN 這個多維數組中。modules 描述了這個插件的模塊信息,其中 type 為 1~4 的整數值,從小到大依次為“直接鏈接(前臺菜單)”、“前臺調用(前臺菜單)”、“后臺調用(后臺菜單)”、“包含運行(無菜單)”;vars 描述了這個插件的配置變量,前面為變量名,后面為使用者賦予這個變量的值。
</ul><br></td></tr><tr><td class="title">編寫插件的原則與注意事項</td></tr>
<tr><td><br>
<p>請在您動手編寫插件之前,還需要仔細的閱讀以下原則,遵循這些原則,將有效的避免可能發生的問題:
<p><ul>
<li>所有與插件的程序,包括<b>其全部的前后臺程序</b>,請全部放入 ./plugins 目錄中,同時在插件的安裝說明中指出,插件的文件需要復制到哪些目錄。為了避免與其他插件沖突,請盡量建立 ./plugins 下的子目錄,并將插件程序放置于子目錄下,這樣您編寫的插件將獲得更好的兼容性。
<li>如果您的插件包含“前臺調用(前臺菜單)”模塊,該模塊將統一用 plugin.php?identifier=xxx&module=yyy 的方式調用,請在相應鏈接、表單中使用此方式。其中 xxx 為插件的惟一標識符,yyy 為模塊名稱。前臺插件外殼程序 plugin.php 已經加載了通用初始化模塊(./include/common.inc.php),不需再次引用。
<li>如果您的插件包含“后臺調用(后臺菜單)”模塊,該模塊將統一用 admincp.php?action=plugins&identifier=xxx&mod=yyy 的方式調用,請在相應鏈接、表單中使用此方式。其中 xxx 和 yyy 的定義與“前臺調用(前臺菜單)”模塊中的相同。系統還允許用 admincp.php?action=plugins&edit=$edit&mod=$mod 的方式來生成鏈接和表單地址,$edit 和 $mod 變量已經被插件后臺管理接口賦值,因此將這兩個變量值帶入 URL 中也是被支持的。由于后臺模塊是被 admincp.php 調用,因此已加載了通用初始化模塊(./include/common.inc.php)并進行了后臺管理人員權限驗證,因此模塊程序中可直接寫功能代碼,不需再進行驗證。
<li>請勿繞過插件的前后臺外殼(plugin.php 和 admincp.php)而以直接調用某程序的方式編寫插件,因為這樣既導致了用戶使用不便,代碼冗余和不規范,同時又產生了因驗證程序考慮不周到而帶來的安全隱患。您可以在任何地方,包括鏈接、表單等處方便的使用上述 URL 地址對插件模塊進行調用。
<li>所有與插件有關的程序,包括全部的前后臺程序,因全部使用外殼調用,請務必在第一行加入
<table width="80%" cellpadding="0" cellspacing="0" border="0" class="code">
<tr><td><pre>
if(!defined('IN_DISCUZ')) {
exit('Access Denied');
}
</pre></td></tr></table>
以免其被 URL 直接請求調用,產生安全問題。
<li>一般情況下,您發布插件請使用插件導出的功能,以方便使用者一次性導入插件的配置數據,極特殊的情況下,也可以分步驟告知使用者如何進行插件配置管理和安裝此插件。
<li>如果功能獨立,請盡量使用單獨程序的方式編寫插件(即外掛型插件),而盡量少的對論壇本身代碼進行修改,這將為使用者今后的升級帶來很大方便。
<li>您可以修改 Discuz! 本身的數據結構,但更推薦在不很影響效率的前提下將插件數據用另外的數據表存儲,因為不能排除您增加的字段或索引和今后版本 Discuz! 核心數據字段重名的可能。<b>在任何情況下,請不要刪除 Discuz! 標準版本數據結構中已有的字段或索引</b>。
<li>請在插件說明書中對插件做以詳盡的描述,例如增加了哪些字段、哪些表,修改了或新增了哪些程序,版本兼容性,后續支持的提供方式(例如不提供支持,或以什么樣的方式提供)。如果方便,請盡可能提供插件的卸載方法,例如去除哪些字段、刪除哪些新增的程序、將哪些被插件修改的程序恢復原狀等等,使用者會感激您為此付出的辛勤勞動,甚至愿意支付相應的費用支持您未來的發展。
<li>如果插件使用另外的數據表存儲,請在插件管理中準確的設置插件所使用的數據表名稱(不包含前綴),這樣用戶在備份數據的時候,能夠把插件數據一同備份。
<li>Discuz! 自 4.0.0 版本起,內置了 8 種自定義積分,存儲于 members 表中的 extcredits1 至 extcredits8 字段中,類型為有符號整數,您可以在引用 common.inc.php 后,在 $extcredits 或 $_DCACHE['settings']['extcredits'] 中讀取 8 種積分的啟用信息(詳情請參考 ./forumdata/cache/cache_settings.php)。插件程序中如需更新用戶積分,可直接 UPDATE 相應的積分字段,無需其他操作。
</ul><br></td></tr>
<tr><td class="title">插件鉤子的設計</td></tr>
<tr><td><br>
<p>插件鉤子的設計,需要您具有一定編程基礎,比較了解 Discuz! 論壇程序的結構,并能夠使用 PHP 語言撰寫代碼。對于普通用戶,可以略過以下內容。 插件鉤子(以下簡稱“鉤子”)屬于插件的一部分,因此在設計鉤子之前應當首先進入后臺——插件管理,新增插件或者編輯一個現有的插件,即可看到相關設置。
<p class="subtitle">鉤子的添加<ul>
<li>鉤子名稱:在一個插件內,鉤子的名稱是唯一的,不可重復。名稱可以由英文字母、數字和“_”組成,不支持中文,最長255個字符。為了便于理解和記憶鉤子的作用, 名稱應當盡量簡潔清晰,能夠表述一定的含義。注意:鉤子名稱對字母大小敏感,例如:Index_start 和 index_start 將視為兩個不同的鉤子。
<li>鉤子描述:對鉤子的詳細說明,如功能介紹、調用方法、使用方法等。
<li>PHP代碼:這里是鉤子的核心內容,也是一段PHP代碼,需要您自行設計,完成鉤子需要處理的數據或者需要執行的操作。
<li>可用:每個插件允許有多個鉤子,您可以自由選擇關閉或者開啟某個鉤子。
</ul><p class="subtitle">鉤子的刪除<ul>
<p>在鉤子管理界面,您可以隨時刪除某一個鉤子。 鉤子刪除以后,您應當及時修正放置鉤子的程序文件,清除鉤子標記,以免影響您論壇的正常使用。</ul>
<p class="subtitle">鉤子的編輯與升級<ul>
<li>編輯:插件設計階段,您可能需要隨時編輯鉤子,每次更改,系統會自動更新緩存文件,您可以立即看到更改的效果。如果是更改鉤子名稱,那么您可能需要調整鉤子放置的程序,修改鉤子調用的名稱。
<li>升級:論壇程序進行升級之前,您應當使用插件的導出功能,導出插件備份。論壇升級并正常運行后,再導入插件備份,修改相關程序,重新安放鉤子。
</ul><p class="subtitle">鉤子的放置與調用<ul>
<p>鉤子設計完成以后,您需要在相應的程序中安放鉤子,不同鉤子由于作用的不同,放置的位置也是不同的。 安放鉤子,您僅僅需要將鉤子的調用代碼放入即可。調用代碼格式如下:
<table width="80%" cellpadding="0" cellspacing="0" border="0" class="code">
<tr><td> <pre>
eval($hooks['插件唯一標識符(identifier)_鉤子名稱']); </pre>
</td></tr></table>
<p>例如:調用 插件demo 的鉤子 testhook, 我們需要在程序中適當的地方加入下面的代碼
<table width="80%" cellpadding="0" cellspacing="0" border="0" class="code">
<tr><td><pre>
eval($hooks['demo_testhook']); </pre>
</td></tr></table>
</ul><p class="subtitle">設計范例<ul>
<p>此處我們為您提供一個使用鉤子技術的插件范例,完成功能十分簡單,旨在使您直觀的了解鉤子的使用。此范例實現了當游客訪問論壇首頁時,強制用戶登錄的功能。
<ul>
<li>進入系統設置中的插件管理,添加一個名稱和惟一標識符均為 <b>demo</b> 的插件。
<li>編輯插件 <b>demo</b> 詳情,找到“插件鉤子設置”,添加一個名為 <b>index_force_loggedin</b> 的鉤子,然后提交。
<li>編輯鉤子 <b>index_force_loggedin</b>,按如下內容填寫設置:
<ul>
<li>鉤子描述:當游客訪問論壇首頁的時候,程序會彈出提示框,并自動跳轉到登陸頁面。
<li>PHP代碼:
<table width="80%" cellpadding="0" cellspacing="0" border="0" class="code">
<tr><td><pre>
if(!$discuz_uid) {
showmessage('請您登陸后訪問本站,現在將轉入登錄頁面。', 'logging.php?action=login');
}
</pre></td></tr></table>
</ul>
<li>提交后,回到此插件的設置頁面。將鉤子 <b>index_force_loggedin</b> 設置為可用。
<li>點擊左側導航,進入插件管理,將插件 <b>demo</b> 設置為可用。
<li>編輯論壇程序 <b>index.php</b> 安放鉤子,方法如下:
<ul>
<li>查找代碼:
<table width="80%" cellpadding="0" cellspacing="0" border="0" class="code">
<tr><td><pre>
$discuz_action = 1;
</pre></td></tr></table><br>
<li>在上述代碼下放添加代碼:
<table width="80%" cellpadding="0" cellspacing="0" border="0" class="code">
<tr><td><pre>
eval($hooks['demo_index_alter']);
</pre></td></tr></table>
</ul>
<li>保存文件后將文件上傳到服務器。
<li>至此,一個簡單的使用鉤子實現的插件已經徹底完成。您可以退出登陸并訪問論壇首頁,測試一下插件的效果。</ul>
</ul><p>Discuz! 插件的鉤子技術,為廣大的插件開發者提供了一個更加靈活的插件設計機制。當 Discuz! 升級后,用戶只需重新將鉤子調用代碼安放到程序中原來的位置,就幾乎可以繼續使用原來已安裝的插件,降低了對于程序修改的幅度和插件安裝的難度,更加有利于插件程序的規范、管理、維護、相互交流。因此我們強烈建議插件開發者能夠深入研究個應用這一機制,創作出越來越多的優秀插件。
</ul><br></td></tr><tr><td class="title">意見反饋</td></tr>
<tr><td><br>
<p>插件接口是 Discuz! 開發組為了方便插件設計、安裝和使用而專門開發,雖然經過長期的優化和改進,可能仍然會有不夠合理或不夠完善的地方,歡迎各位插件程序員在使用此接口的過程中,為我們提出意見和建議,感謝您的支持。
</td></tr></table>
<script language="JavaScript" src="footer.js"></script>
</body>
</html>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -