做 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 目錄下比較合適

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