DISCUZ 外掛程式機制

2021-06-18 06:08:34 字數 4322 閱讀 7631

1、參考 

2、由第一點中的官方提供的參考庫可以基本可以了解怎麼去開發乙個外掛程式。這裡簡述幾點重要的

一、配置檔案中config_global.php中加上

$_config['plugindeveloper'] =1 ;
就可以在後台-應用-外掛程式 中設計新外掛程式。將上述變數中的值設定成為2,就可以看discuz每個頁面中存在的外掛程式鉤子

二、在設定新外掛程式的時候,注意唯一識別符號的唯一性,以及其資源檔案目錄所在是source/plugin/唯一識別符號/

三、根據官方提供的的外掛程式形式,製作:

擴充套件專案 個人設定:可在個人設定中增加乙個選單項。

擴充套件專案 個人設定 - 個人資料:可在個人設定的個人資料頁上部增加乙個選單項。

擴充套件專案 個人設定 - 積分:可在個人設定的積分頁上部增加乙個選單項。

擴充套件專案 站點幫助:可在站點幫助中增加乙個選單項。

擴充套件專案 我的帖子:可在我的帖子中增加乙個選單項。

擴充套件專案 門戶管理:可在門戶管理面板上部增加乙個選單項。

擴充套件專案 論壇管理 - 基本:可在前台論壇管理面板側邊上部增加乙個選單項。

擴充套件專案 論壇管理 - 工具:可在前台論壇管理面板側邊下部增加乙個選單項。

擴充套件專案 管理中心:可在後台外掛程式欄目中為此外掛程式增添乙個管理模組。

程式指令碼 頁面嵌入 - 普通版:設定乙個包含頁面嵌入指令碼的模組,該模組用於在普通電腦訪問的頁面顯示。模組檔名指派為 source/plugin/外掛程式目錄/外掛程式模組名.class.php」。(頁面嵌入將在後面的《頁面嵌入模組開發》中詳細說明)

程式指令碼 頁面嵌入 - 手機版:設定乙個包含頁面嵌入指令碼的模組,該模組用於在手機訪問的頁面顯示。

程式指令碼 特殊主題:設定乙個特殊主題指令碼的模組,模組檔名指派為 source/plugin/外掛程式目錄/外掛程式模組名.class.php」。(特殊主題將在後面的《特殊主題模組開發》中詳細說明)

四、在後台-應用中顯示的外掛程式,可以檢視每個外掛程式應用的基本資訊,簡單說就是每個外掛程式不同變數所對應的值。後台資料庫中存放的表為common_pluginvar

由於呼叫系統快取統一通過「loadcache()」函式呼叫,並存放於 $_g['cache'] 中,因此「loadcache('plugin')」後外掛程式的變數緩會存放於 $_g['cache']['plugin'] 中。嵌入點外掛程式和以 plugin.php 為主指令碼呼叫的外掛程式無需載入此快取,系統已自動載入了快取。變數配置型別為「版塊/*」的變數會儲存在 $_g['cache']['forums'][fid]['plugin'] 中。變數配置型別為「使用者組/*」的變數會儲存在 $_g['cache']['usergroup_groupid']['plugin'] 和 $_g['group']['plugin'] 中。所以,在後台啟用了的外掛程式的所有變數的內容都會存放在這個全域性變數中——當然這裡的好處就是進行二次開發的人在獲取資料的時候會及其簡便,無論是不是這個外掛程式資料,或者其他的內容,但是弊端也有,就是有時候並不需要太多的資料,確在後台進行過多的loadcache的操作,所以,如果對discuz二次開發並做了很大程度改版的話,同時並不打算繼續公升級discuz版本的話,可以做一些優化操作,對於頁面中不會用到的快取內容,可以省略它的載入過程,而起到加快頁面的載入速度。

指令碼位置:source/plugin/baidu_share/baidu_share.class.php(這個屬於第三部分說到的程式指令碼-頁面嵌入-普通版)。這個也是很常用的。

重點內容在類plugin_baidu_share_forum

plugin_   普通版指令碼中的類名以 plugin_ 開頭。手機版指令碼中的類名以 mobileplugin_ 開頭。

identifier(baidu_share)    外掛程式的唯一識別符號,在外掛程式設定中設定。

curscript  (forum)  嵌入點位於的指令碼名,如 forum.php 為 forum。

按照第一點設定之後,就可以發現該類中的函式都對應了論壇主題頁面中,每乙個帖子上對應的位置,function_core.php中的hookscript()就會分析當前指令碼curscript中相符合的鉤子是否存在於外掛程式中,並執行其。

3、最後再了解該外掛程式的執行過程究竟是怎樣的,那就需要了解下執行鉤子函式runhooks()和執行外掛程式指令碼的函式hookscript()。

function runhooks($scriptextra = '') 

if(defined('curmodule'))

hookscript(curmodule, $_g['basescript'], 'funcs', array(), '', $scriptextra);}}

詳情就看注釋中的說明吧

function hookscript($script, $hscript, $type = 'funcs', $param = array(), $func = '', $scriptextra = '')  elseif($script == 'spacecp') 

}if(!isset($_g['setting'][hooktype][$hscript][$script][$type]))

if(!isset($_g['cache']['plugin'])) //迴圈module陣列,陣列內部存放的是已經開啟了的外掛程式的檔案目錄,然後通過include_once載入進來。

foreach((array)$_g['setting'][hooktype][$hscript][$script]['module'] as $identifier => $include)

}if(@is_array($_g['setting'][hooktype][$hscript][$script][$type]))

if(!isset($pluginclasses[$classkey]))

if(!method_exists($pluginclasses[$classkey], $hookfunc[1]))

$return = $pluginclasses[$classkey]->$hookfunc[1]($param);//獲取鉤子函式返回的內容

if(is_array($return))

}} else else }}

}}}}

$_g['inhookscript'] = false;

}

總上可以看出外掛程式中獲取到的資料都存放在全域性變數$_g[setting][pluginhooks]中了。

而模板htm檔案中的鉤子的解析工作理所當然的要在template()來完成了,舉個簡單例子,在具體主題帖子頁面,使用者發帖後的樓層中會存在如下內容,當然這句**可以在data/template/數字_diy_forum_viewthread.tpl.php快取檔案中找到,該檔案是經過了模板解析得到的:

if(!empty($_g['setting']['pluginhooks']['viewthread_posttop'][$postcount])) echo $_g['setting']['pluginhooks']['viewthread_posttop'][$postcount];

jQuery 外掛程式機制

簡介 利用jquery提供的 fn.extend 和 extend 方法,擴充套件 extend 擴充套件jquery的類方法 作用 1.合併物件 var a var b 後面加到前面,屬性相同的後面覆蓋前面的屬性 console.log extend a,b 2.擴充套件jquery類方法 var...

jQuery外掛程式機制

為了擴充套件jquery庫函式,jquery提供了兩種方式 jquery.extend object 擴充套件jquery物件本身,主要是用來擴充套件jquery全域性函式 呼叫時直接 函式名 引數 如下例子 jquery.fn.extend object 擴充套件 jquery 元素集,主要用於擴...

JQuery外掛程式機制

jquery.extend object 擴充套件jquery物件本身,主要是用來擴充套件jquery全域性函式 呼叫時直接 函式名 引數 charset utf 8 title src js jquery 3.3.1.js script head var object 在object中定義方法mi...