1. 程式人生 > >外掛__discuzX2外掛製作教程__最菜鳥級別的入門坎

外掛__discuzX2外掛製作教程__最菜鳥級別的入門坎

一、開發外掛所需資料與工具
         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值
                  其餘的可直接打印出來檢視,如:
  1. <?php
  2. require_once './source/class/class_core.php';
  3. $discuz = & discuz_core::instance();
  4. $discuz->init();
  5. print_r(get_defined_constants());
  6. ?>
複製程式碼             4.2、全域性變數
                 直接列印$_G即可得知,如:  
  1. <?php
  2. require_once './source/class/class_core.php';
  3. $discuz = & discuz_core::instance();
  4. $discuz->init();
  5. print_r($_G);
  6. ?>
複製程式碼             4.3、資料庫配置引數
                  直接列印$_G['config']['db']即可,如:
  1. <?php
  2. require_once './source/class/class_core.php';
  3. $discuz = & discuz_core::instance();
  4. $discuz->init();
  5. print_r($_G['config']['db']);
  6. ?>
複製程式碼
            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 檔案,在檔案結尾新增以下程式碼開啟外掛設計者模式
  1. $_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 檔案,目的為了頁面嵌入
  1. <?php
  2. if(!defined('IN_DISCUZ')) {
  3.         exit('Access Denied');
  4. }
  5. class plugin_send_jinbi { 
  6.        function global_header() {
  7.             global $_G;
  8.             $sendConfig = array();
  9.             $sendConfig = $_G['cache']['plugin']['send_jinbi'];  //快取外掛變數值
  10.             if( intval($sendConfig['status']) == 1 ) {  //是否啟動外掛
  11.                  if( isset($_POST['regsubmit']) ) { //會員註冊後
  12.                       $uid = intval($_G['member']['uid']);
  13.                       if( $uid ){
  14.                          $jinbi_num = intval($sendConfig['jinbi_num']);  //送金幣數量
  15.                          updatemembercount($uid,array("extcredits2" => $jinbi_num)); //更新金幣數 (這個是function_core.php的現成函式)
  16.                         //這裡可以進行任何資料庫的操作
  17.                       }
  18.                  }
  19.              }
  20.       }
  21. }
  22. ?>
複製程式碼          3、基本上已經完成一大半了,你只要開啟外掛,然後更新快取(可靠點),然後到前臺去註冊一個會員,則會自動送上100金幣。
           

       七、例項講解之安裝、解除安裝及升級
            1、 安裝(install.php)、解除安裝(uninstall.php)程式中可隨意設計頁面的跳轉,只要在外掛安裝、解除安裝結束時候輸出新增 $finish = TRUE; 即可,指令碼中可用 runquery() 函式執行 SQL 語句。
  1. <?php
  2. if(!defined('IN_DISCUZ')) {
  3.        exit('Access Denied');
  4. }
  5. /*任意執行程式碼:開始*/
  6. //..........
  7. //..........
  8. /*任意執行程式碼:結束*/
  9. $finish = TRUE;
  10. ?>
複製程式碼 2、升級(upgrade.php)程式中可通過 $fromversion 和 $toversion 變數判斷升級的具體版本號,並隨意設計頁面的跳轉,只要在外掛升級結束時候輸出新增 $finish = TRUE; 即可,指令碼中可用 runquery() 函式執行 SQL 語句。
  1. <?php
  2. if(!defined('IN_DISCUZ')) {
  3.         exit('Access Denied');
  4. }
  5. /*任意執行程式碼:開始*/
  6. //..........
  7. //..........
  8. /*任意執行程式碼:結束*/
  9. $finish = TRUE;
  10. ?>
複製程式碼 3、其他功能請參考其他外掛

八、例項講解之外掛語言包
           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、更新下快取,再到前臺註冊頁面看看效果