做 Discuz! X2 的插件開發也有一段時間了,不敢説對插件開發的各個細節都瞭解,總結了一些可能在開發中會遇到的問題,分享給喜好插件開發的童鞋們。

關於嵌入點:

除了常見的模板的嵌入點以外,Discuz! X2 還有一些比較冷門的嵌入點,給大家總結下:

showmessage 函數中的嵌入點
function_message.php 的 25 行左右

  1. hookscript(CURMODULE, $_G['basescript'], 'messagefuncs', array('param' => $_G['messageparam']));

對應的調用函數命名為 XXX_message(),可以接受一個傳遞參數。
參數的值為 showmessage 函數的所有參數的集合的一個數組。

該嵌入點可以用於輸出成功提示之前執行操作。

discuzcode 函數中的嵌入點
function_discuzcode.php 的 87 行左右

  1. hookscript('discuzcode', 'global', 'funcs', array('param' => $param, 'caller' => 'discuzcode'), 'discuzcode');

function_post.php 的 529 行左右

  1. hookscript('discuzcode', 'global', 'funcs', array('param' => $param, 'caller' => 'messagecutstr'), 'discuzcode');

對應的調用函數命名應為 discuzcode(),與 showmessage 的嵌入點類似,接受一個參數,參數為 discuzcode 函數所有參數的集合的一個數組。
'caller' 指明瞭入口函數是'discuzcode'還是'messagecutstr'。

該嵌入點通常用於處理 discuzcode 輸出,可以定義插件專有的 code 替換代碼。

deletethread 和 deletepost 函數中的嵌入點
function_delete.php 中

  1. hookscript('deletepost', 'global', 'funcs', array('param' => $hookparam, 'step' => 'check'), 'deletepost');
  2. hookscript('deletepost', 'global', 'funcs', array('param' => $hookparam, 'step' => 'delete'), 'deletepost');
  3. hookscript('deletethread', 'global', 'funcs', array('param' => $hookparam, 'step' => 'check'), 'deletethread');
  4. hookscript('deletethread', 'global', 'funcs', array('param' => $hookparam, 'step' => 'delete'), 'deletethread');

該嵌入點分別在刪除主題 (帖子) 操作的前後執行,區別在於'step'參數的值。
對應的調用函數命名應為 deletethread() 和 deletepost(),接受一個參數以取得 deletethread 和 deletepost 函數所有參數。

該嵌入點用於執行刪除主題 (帖子) 時,嵌入插件操作

關於返回值:

通過設置配置文件中的 $_config['plugindeveloper'] = 2; 可以在頁面上看到模板中的嵌入點。
[array XXXX] 這樣的嵌入點需要返回 array 類型的數據,而不能是其他類型的數據。
如果返回空值會導致同一個嵌入點無法被其他插件再度使用,需要特別注意一下。
正確的做法是對於 array 類型的 hook 點,如果沒有返回值,請 return array();

關於安全方面:

任何插件腳本文件,在開始判斷 IN_DISCUZ 是必須的,如果是後台執行的腳本,需要判斷 IN_ADMINCP 。
對於任何形式的提交數據,請使用 $_G['gp_XXX'] 的形式取得值,並且最好是做一些 is_array 、 is_numeric 的判斷,減少一些意外的錯誤。
儘量不使用插件目錄作為讀寫文件的目錄,如果有讀寫文件的操作,放到 data 目錄下比較合適

關於插件開發的細節眾多,本人也會在將來開發的路上,不斷補充~