關於嵌入點:
除了常見的模板的嵌入點以外,Discuz! X2 還有一些比較冷門的嵌入點,給大家總結下:
showmessage 函式中的嵌入點
function_message.php 的 25 行左右
- hookscript(CURMODULE, $_G['basescript'], 'messagefuncs', array('param' => $_G['messageparam']));
對應的呼叫函式命名為 XXX_message(),可以接受一個傳遞引數。
引數的值為 showmessage 函式的所有引數的集合的一個陣列。
該嵌入點可以用於輸出成功提示之前執行操作。
discuzcode 函式中的嵌入點
function_discuzcode.php 的 87 行左右
- hookscript('discuzcode', 'global', 'funcs', array('param' => $param, 'caller' => 'discuzcode'), 'discuzcode');
function_post.php 的 529 行左右
- hookscript('discuzcode', 'global', 'funcs', array('param' => $param, 'caller' => 'messagecutstr'), 'discuzcode');
對應的呼叫函式命名應為 discuzcode(),與 showmessage 的嵌入點類似,接受一個引數,引數為 discuzcode 函式所有引數的集合的一個陣列。
'caller' 指明瞭入口函式是'discuzcode'還是'messagecutstr'。
該嵌入點通常用於處理 discuzcode 輸出,可以定義外掛專有的 code 替換程式碼。
deletethread 和 deletepost 函式中的嵌入點
function_delete.php 中
- hookscript('deletepost', 'global', 'funcs', array('param' => $hookparam, 'step' => 'check'), 'deletepost');
- hookscript('deletepost', 'global', 'funcs', array('param' => $hookparam, 'step' => 'delete'), 'deletepost');
- hookscript('deletethread', 'global', 'funcs', array('param' => $hookparam, 'step' => 'check'), 'deletethread');
- 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 目錄下比較合適
關於外掛開發的細節眾多,本人也會在將來開發的路上,不斷補充~