外掛__discuzX2外掛製作教程__最菜鳥級別的入門坎
阿新 • • 發佈:2019-02-10
一、開發外掛所需資料與工具
1、DiscuzX2 外掛機制 http://dev.discuz.org/wiki/#.E6.8F.92.E4.BB.B6.E6.9C.BA.E5.88.B6
2、語言包編碼轉換工具 convertz 【百度一下】(專門用來處理多種編碼的外掛安裝 )
3、資料庫管理工具 navicat 【百度一下】(方便資料庫的檢視與操作)
4、網站的基本資料,這些資料包括:系統常量、全域性變數、系統呼叫 ,首先從系統常量說起
4.1、系統常量 DISCUZ_ROOT //網站根目錄 TIMESTAMP //程式執行的時間戳 CHARSET //程式的語言編碼型別 IS_ROBOT //是否是機器訪問
FORMHASH //HASH值
其餘的可直接打印出來檢視,如:
直接列印$_G即可得知,如:
直接列印$_G['config']['db']即可,如:
4.4、資料庫操作
DB::table() //增加了pre的資料庫表名
DB::delete() //刪除表中資料
DB::insert() //向表中插入資料
DB::update() //更新表中資料
DB::fetch() //配合DB::query來實現資料資源資料的獲取
DB::query() //執行一條資料庫語句
DB::fetch_first() //獲取結果集的第一條記錄
更多操作請檢視文件:http://dev.discuz.org/wiki/index.php?title=Discuz%E6%95%B0%E6%8D%AE%E5%BA%93%E7%B1%BB
5、熟悉 ./source/function/function_admincp.php 管理後臺檔案裡的函式,知道具體函式是實現什麼功能效果
6、瞭解和掌握基礎通用的類、函式 http://dev.discuz.org/wiki/#.E5.9F.BA.E7.A1.80.E6.A1.86.E6.9E.B6.E3.80.81.E7.B1.BB.E3.80.81.E5.87.BD.E6.95.B0
二、安全性處理
1、檔案的安全性
所有與外掛有關的程式,包括全部的前後臺程式,因全部使用外殼呼叫,請務必在第一行加入
if(!defined('IN_DISCUZ')) {
exit('Access Denied');
}
以免其被 URL 直接請求呼叫,產生安全問題。
2、對數值處理
2.1、 intval(); //處理非負整數 ,如:$uid=intval($uid);
注意,使用intval後,一定要想一想,自己這個變數是不是應該非負的?如果是的話,得加個判斷語句,或者用abs,max等函式處理下
2.2、 trim(); //去除左右空格, 如:$username=trim($username);
2.3、 對於文字內容,記得使用htmlspecialchars(dhtmlspecialchars)
2.4、 寫入資料庫時的注意事項
要進資料庫的變數一定得addslashes(DZ內為daddslashes,如用DZ無須再次過濾,DZ已將所有$_POST和$_GET過濾),當然,如果你進的是數字(比如uid,並且已經intval過),或者是其他一些肯定不會出錯的,那麼你可以不做這一步。
2.5、 在寫sql語句時,變數一定得記得用’框起來。如果變數是字串,不這麼做會出錯。如果是數字不這麼做不會提示出錯,但是有可能有注入的危險。
2.6、 陣列在運用前記得寫$xxx = array(); 原因很簡單,防止使用者提交惡意的值。
3、語句查詢優化
在寫SQL語句是儘量符合SQL規則,語句查詢要相應的優化,有先有後;資料表要相應的建立索引,加快查詢速度,這裡不多說。
三、例項講解之外掛的前兆
1、最先清楚需要開發什麼功能的外掛,外掛機制是否能夠開發,最後能否達到預期效果,否則一切都免談了
2、需要使用什麼選單、什麼引數,配置哪些選項、資料結構如何設計、前後臺實現哪些功能等等
3、需要哪些函式,discuz內部是否有這功能的函式,儘量用內部的函式來達到預期效果
4、最好不要改動discuz原有的佈局,寧願Coty一段程式碼出來也不要在原有的函式上新增功能,防止以後的升級問題
5、盡最大能力去開發智慧的外掛,多用變數代替常量,增強程式的移植性,可維護性
四、例項講解之基本配置
1、安裝全新的DiscuzX2
2、開啟 config/config_global.php 檔案,在檔案結尾新增以下程式碼開啟外掛設計者模式
3、更新快取(為了顯示潛入點),重新整理前臺頁面看看就知道什麼叫嵌入點了,有嵌入點得地方就可以順便輸出內容,包括原始碼
五、例項講解之管理中心
1、這裡以“會員註冊後自動送100個金幣”為例 (主要傳授對資料庫的操作)
2、填寫外掛最基本資訊
(注意:提交完後記得在外掛目錄下建以識別符號為名的資料夾,如: ./source/plugin/send_jinbi)
3、選擇外掛語言包
4、新增外掛變數配置
具體可以點最後面的"詳細"進入編輯
5、在外掛列表中找到"新註冊會員送100個金幣"外掛並啟用
六、例項講解之頁面嵌入
1、外掛頁面嵌入-普通版
2、在 ./source/plugin/send_jinbi/ 目錄下建立 send_jinbi.class.php 檔案,目的為了頁面嵌入
七、例項講解之安裝、解除安裝及升級
1、 安裝(install.php)、解除安裝(uninstall.php)程式中可隨意設計頁面的跳轉,只要在外掛安裝、解除安裝結束時候輸出新增 $finish = TRUE; 即可,指令碼中可用 runquery() 函式執行 SQL 語句。
八、例項講解之外掛語言包
1、開啟之前所建立的語言包檔案(data/plugindata/send_jinbi.lang.php),新增以下程式碼,紅色部分為外掛的唯一識別符號:
<?php
//程式指令碼檔案的語言包
$scriptlang['send_jinbi'] = array(
'info' => '程式指令碼檔案的語言包'
);
//模版檔案的語言包
$templatelang['send_jinbi'] = array(
'info' => '模板檔案的語言包'
);
//安裝、升級、解除安裝指令碼用的語言包
$installlang['send_jinbi'] = array(
'info' => '安裝、升級、解除安裝指令碼用的語言包'
);
?>
2、呼叫語言包
模版中呼叫模板檔案語言包,通過 {lang send_jinbi:info} 方式呼叫。
程式指令碼中呼叫指令碼檔案語言包,通過 lang('plugin/send_jinbi', 'info') 方式呼叫。
安裝指令碼中呼叫安裝指令碼檔案語言包,通過 $installlang 變數直接獲取。如 $installlang['info']。
3、語言包的匯出
匯出後的語言包是:discuz_plugin_send_jinbi.xml
接下來我們用編碼轉換工具 convertz 對discuz_plugin_send_jinbi.xml 分別轉為:
discuz_plugin_send_jinbi_SC_GBK.xml(簡體中文GBK)
discuz_plugin_send_jinbi_SC_UTF8.xml(簡體中文UTF8)
discuz_plugin_send_jinbi_TC_BIG5.xml(繁體中文BIG5)
discuz_plugin_send_jinbi_TC_UTF8.xml(繁體中文UTF8)
把這四個檔案放到該外掛 ./source/plugin/send_jinbi/ 目錄下
4、安裝時的效果圖:
九、例項講解之增加頁面功能
1、在原有的頁面上新增功能(這裡以 註冊 頁面為例)
2、在之前那個 ./source/plugin/send_jinbi/send_jinbi.class.php 的最後新增以下程式碼:
class plugin_send_jinbi_member extends plugin_send_jinbi {//類名稱plugin_send_jinbi_member 最後面的 member 應該是相應的模組名稱吧!具體本人不怎麼清楚,還望高人指點!總之它是會改變的,如果是論壇,則是 forum
function register_input() { //函式名稱其實就是前臺頁面嵌入點的名稱
$lang = lang('plugin/send_jinbi'); //獲取此外掛的語言包
$bind = "<a href='javascript:void(0);' onClick=\"alert('別點我');\">".$lang['info']."</a>"; //呼叫語言包顯示
return $bind;
}
}
3、更新下快取,再到前臺註冊頁面看看效果
1、DiscuzX2 外掛機制 http://dev.discuz.org/wiki/#.E6.8F.92.E4.BB.B6.E6.9C.BA.E5.88.B6
2、語言包編碼轉換工具 convertz 【百度一下】(專門用來處理多種編碼的外掛安裝 )
3、資料庫管理工具 navicat 【百度一下】(方便資料庫的檢視與操作)
4、網站的基本資料,這些資料包括:系統常量、全域性變數、系統呼叫 ,首先從系統常量說起
4.1、系統常量 DISCUZ_ROOT //網站根目錄 TIMESTAMP //程式執行的時間戳 CHARSET //程式的語言編碼型別 IS_ROBOT //是否是機器訪問
FORMHASH //HASH值
其餘的可直接打印出來檢視,如:
- <?php
- require_once './source/class/class_core.php';
- $discuz = & discuz_core::instance();
- $discuz->init();
- print_r(get_defined_constants());
- ?>
直接列印$_G即可得知,如:
- <?php
- require_once './source/class/class_core.php';
- $discuz = & discuz_core::instance();
- $discuz->init();
- print_r($_G);
- ?>
直接列印$_G['config']['db']即可,如:
- <?php
- require_once './source/class/class_core.php';
- $discuz = & discuz_core::instance();
- $discuz->init();
- print_r($_G['config']['db']);
- ?>
DB::table() //增加了pre的資料庫表名
DB::delete() //刪除表中資料
DB::insert() //向表中插入資料
DB::update() //更新表中資料
DB::fetch() //配合DB::query來實現資料資源資料的獲取
DB::query() //執行一條資料庫語句
DB::fetch_first() //獲取結果集的第一條記錄
更多操作請檢視文件:http://dev.discuz.org/wiki/index.php?title=Discuz%E6%95%B0%E6%8D%AE%E5%BA%93%E7%B1%BB
5、熟悉 ./source/function/function_admincp.php 管理後臺檔案裡的函式,知道具體函式是實現什麼功能效果
6、瞭解和掌握基礎通用的類、函式 http://dev.discuz.org/wiki/#.E5.9F.BA.E7.A1.80.E6.A1.86.E6.9E.B6.E3.80.81.E7.B1.BB.E3.80.81.E5.87.BD.E6.95.B0
二、安全性處理
1、檔案的安全性
所有與外掛有關的程式,包括全部的前後臺程式,因全部使用外殼呼叫,請務必在第一行加入
if(!defined('IN_DISCUZ')) {
exit('Access Denied');
}
以免其被 URL 直接請求呼叫,產生安全問題。
2、對數值處理
2.1、 intval(); //處理非負整數 ,如:$uid=intval($uid);
注意,使用intval後,一定要想一想,自己這個變數是不是應該非負的?如果是的話,得加個判斷語句,或者用abs,max等函式處理下
2.2、 trim(); //去除左右空格, 如:$username=trim($username);
2.3、 對於文字內容,記得使用htmlspecialchars(dhtmlspecialchars)
2.4、 寫入資料庫時的注意事項
要進資料庫的變數一定得addslashes(DZ內為daddslashes,如用DZ無須再次過濾,DZ已將所有$_POST和$_GET過濾),當然,如果你進的是數字(比如uid,並且已經intval過),或者是其他一些肯定不會出錯的,那麼你可以不做這一步。
2.5、 在寫sql語句時,變數一定得記得用’框起來。如果變數是字串,不這麼做會出錯。如果是數字不這麼做不會提示出錯,但是有可能有注入的危險。
2.6、 陣列在運用前記得寫$xxx = array(); 原因很簡單,防止使用者提交惡意的值。
3、語句查詢優化
在寫SQL語句是儘量符合SQL規則,語句查詢要相應的優化,有先有後;資料表要相應的建立索引,加快查詢速度,這裡不多說。
三、例項講解之外掛的前兆
1、最先清楚需要開發什麼功能的外掛,外掛機制是否能夠開發,最後能否達到預期效果,否則一切都免談了
2、需要使用什麼選單、什麼引數,配置哪些選項、資料結構如何設計、前後臺實現哪些功能等等
3、需要哪些函式,discuz內部是否有這功能的函式,儘量用內部的函式來達到預期效果
4、最好不要改動discuz原有的佈局,寧願Coty一段程式碼出來也不要在原有的函式上新增功能,防止以後的升級問題
5、盡最大能力去開發智慧的外掛,多用變數代替常量,增強程式的移植性,可維護性
四、例項講解之基本配置
1、安裝全新的DiscuzX2
2、開啟 config/config_global.php 檔案,在檔案結尾新增以下程式碼開啟外掛設計者模式
- $_config['plugindeveloper'] = 2; // 1 表示開啟外掛設計者模式 ; 2 表示開啟外掛設計者模式且顯示前臺頁面的潛入點
3、更新快取(為了顯示潛入點),重新整理前臺頁面看看就知道什麼叫嵌入點了,有嵌入點得地方就可以順便輸出內容,包括原始碼
五、例項講解之管理中心
1、這裡以“會員註冊後自動送100個金幣”為例 (主要傳授對資料庫的操作)
2、填寫外掛最基本資訊
(注意:提交完後記得在外掛目錄下建以識別符號為名的資料夾,如: ./source/plugin/send_jinbi)
3、選擇外掛語言包
4、新增外掛變數配置
具體可以點最後面的"詳細"進入編輯
5、在外掛列表中找到"新註冊會員送100個金幣"外掛並啟用
六、例項講解之頁面嵌入
1、外掛頁面嵌入-普通版
2、在 ./source/plugin/send_jinbi/ 目錄下建立 send_jinbi.class.php 檔案,目的為了頁面嵌入
- <?php
- if(!defined('IN_DISCUZ')) {
- exit('Access Denied');
- }
- class plugin_send_jinbi {
- function global_header() {
- global $_G;
- $sendConfig = array();
- $sendConfig = $_G['cache']['plugin']['send_jinbi']; //快取外掛變數值
- if( intval($sendConfig['status']) == 1 ) { //是否啟動外掛
- if( isset($_POST['regsubmit']) ) { //會員註冊後
- $uid = intval($_G['member']['uid']);
- if( $uid ){
- $jinbi_num = intval($sendConfig['jinbi_num']); //送金幣數量
- updatemembercount($uid,array("extcredits2" => $jinbi_num)); //更新金幣數 (這個是function_core.php的現成函式)
- //這裡可以進行任何資料庫的操作
- }
- }
- }
- }
- }
- ?>
七、例項講解之安裝、解除安裝及升級
1、 安裝(install.php)、解除安裝(uninstall.php)程式中可隨意設計頁面的跳轉,只要在外掛安裝、解除安裝結束時候輸出新增 $finish = TRUE; 即可,指令碼中可用 runquery() 函式執行 SQL 語句。
- <?php
- if(!defined('IN_DISCUZ')) {
- exit('Access Denied');
- }
- /*任意執行程式碼:開始*/
- //..........
- //..........
- /*任意執行程式碼:結束*/
- $finish = TRUE;
- ?>
- <?php
- if(!defined('IN_DISCUZ')) {
- exit('Access Denied');
- }
- /*任意執行程式碼:開始*/
- //..........
- //..........
- /*任意執行程式碼:結束*/
- $finish = TRUE;
- ?>
八、例項講解之外掛語言包
1、開啟之前所建立的語言包檔案(data/plugindata/send_jinbi.lang.php),新增以下程式碼,紅色部分為外掛的唯一識別符號:
<?php
//程式指令碼檔案的語言包
$scriptlang['send_jinbi'] = array(
'info' => '程式指令碼檔案的語言包'
);
//模版檔案的語言包
$templatelang['send_jinbi'] = array(
'info' => '模板檔案的語言包'
);
//安裝、升級、解除安裝指令碼用的語言包
$installlang['send_jinbi'] = array(
'info' => '安裝、升級、解除安裝指令碼用的語言包'
);
?>
2、呼叫語言包
模版中呼叫模板檔案語言包,通過 {lang send_jinbi:info} 方式呼叫。
程式指令碼中呼叫指令碼檔案語言包,通過 lang('plugin/send_jinbi', 'info') 方式呼叫。
安裝指令碼中呼叫安裝指令碼檔案語言包,通過 $installlang 變數直接獲取。如 $installlang['info']。
3、語言包的匯出
匯出後的語言包是:discuz_plugin_send_jinbi.xml
接下來我們用編碼轉換工具 convertz 對discuz_plugin_send_jinbi.xml 分別轉為:
discuz_plugin_send_jinbi_SC_GBK.xml(簡體中文GBK)
discuz_plugin_send_jinbi_SC_UTF8.xml(簡體中文UTF8)
discuz_plugin_send_jinbi_TC_BIG5.xml(繁體中文BIG5)
discuz_plugin_send_jinbi_TC_UTF8.xml(繁體中文UTF8)
把這四個檔案放到該外掛 ./source/plugin/send_jinbi/ 目錄下
4、安裝時的效果圖:
九、例項講解之增加頁面功能
1、在原有的頁面上新增功能(這裡以 註冊 頁面為例)
2、在之前那個 ./source/plugin/send_jinbi/send_jinbi.class.php 的最後新增以下程式碼:
class plugin_send_jinbi_member extends plugin_send_jinbi {//類名稱plugin_send_jinbi_member 最後面的 member 應該是相應的模組名稱吧!具體本人不怎麼清楚,還望高人指點!總之它是會改變的,如果是論壇,則是 forum
function register_input() { //函式名稱其實就是前臺頁面嵌入點的名稱
$lang = lang('plugin/send_jinbi'); //獲取此外掛的語言包
$bind = "<a href='javascript:void(0);' onClick=\"alert('別點我');\">".$lang['info']."</a>"; //呼叫語言包顯示
return $bind;
}
}
3、更新下快取,再到前臺註冊頁面看看效果