discuz特殊主題插件開發步驟和犯的愚蠢錯誤

  discuz做爲國內流行的論壇系統,可謂造福了很多趣味相投的網友們。它讓天南地北、國內外有着共同興趣愛好的人們彙集在一塊兒,分享彼此的喜怒哀樂、心得體會。然而做爲discuz的使用者之一,仍是個碼農,然而對discuz的系統架構和二次開發瞭解得並很少。前段時間有個朋友找到我說能不能幫忙開發一個特殊主題插件,雖然本身沒開發過discuz的插件,但就discuz的流行程度而言,相信開發資料和開發羣體應該很多,因而就答應了。php

  開發以前網上搜索了一通資料,找到discuz官方二次開發文檔看了看,而後又找來一些其它插件參考了下,因而就開幹了。因爲開發的是一個特殊主題的插件,所以參考官方的開發文檔http://faq.comsenz.com/library/plug/plugin/plugin_specialthread.htm,並利用discuz官方提供的開發工具生成了個簡單的插件(插件開發工具可在此下載:http://addon.discuz.com/resource/develop.zip)。html

  咱們看看怎麼開發一個特殊主題的插件吧,要是想直接看我犯了哪樣的愚蠢錯誤,你能夠直接拉到文章的末尾。web

  1、插件開發步驟:架構

  一、下載插件開發工具並建立插件:函數

  插件開發工具下載並解壓至web根目錄。而後經過http://你的域名/develop.php訪問插件開發工具,個人是http://127.0.0.1:8080/develop.php。點擊「建立新插件」,而後一步步根據提示填寫便可。工具

  此處,你還能夠檢測插件前綴是否被佔用,方便後續發佈到插件市場。編輯腳本這一步填寫自身的特殊腳本名稱便可。post

  建立完成之後能夠經過設計腳本,導出插件包。開發工具

  這樣就已經將一個插件的原型都生成了,將它拷貝到/source/plugin/目錄並解壓。測試

  二、開啓開發者模式並設置特殊主題url

  開啓開發者模式,在config/config_global.php 後邊填一行$_config['plugindeveloper'] = 1;值爲1表示開啓開發者模式,爲2則表示同時開啓潛入點提示。填寫完成以後刷新後臺管理界面,依次找到應用-->插件-->找到剛剛建立的插件並點擊設計,便可編輯剛剛建立的插件腳本了。這裏仍然須要設置一下特殊主題。

  程序模塊名稱爲前面插件建立時填寫的名稱。咱們能夠看看gfpaimai.class.php的具體代碼

<?php
/**
 *    [gfpaimai(gfpaimai.{modulename})] (C)2015-2099 Powered by 版權全部.
 *    Version: 1.0.0
 *    Date: 2015-7-11 10:05
 */

if(!defined('IN_DISCUZ')) {
    exit('Access Denied');
}
class plugin_gfpaimai {
    //TODO - Insert your code here

}

class threadplugin_gfpaimai {

    public $name = 'XX主題';            //主題類型名稱
    public $iconfile = 'icon.gif';    //發佈主題連接中的前綴圖標
    public $buttontext = '發佈xx主題';    //發帖時按鈕文字

    /**
     * 發主題時頁面新增的表單項目
     * @param Integer $fid: 版塊ID
     * @return string 經過 return 返回便可輸出到發帖頁面中 
     */
    public function newthread($fid) {
        //TODO - Insert your code here
        
        return 'TODO:newthread';
    }

    /**
     * 主題發佈前的數據判斷 
     * @param Integer $fid: 版塊ID
     */
    public function newthread_submit($fid) {
        //TODO - Insert your code here
        
    }

    /**
     * 主題發佈後的數據處理 
     * @param Integer $fid: 版塊ID
     * @param Integer $tid: 當前帖子ID
     */
    public function newthread_submit_end($fid, $tid) {
        //TODO - Insert your code here
        
    }

    /**
     * 編輯主題時頁面新增的表單項目
     * @param Integer $fid: 版塊ID
     * @param Integer $tid: 當前帖子ID
     * @return string 經過 return 返回便可輸出到編輯主題頁面中 
     */
    public function editpost($fid, $tid) {
        //TODO - Insert your code here
        
        return 'TODO:editpost';
    }

    /**
     * 主題編輯前的數據判斷 
     * @param Integer $fid: 版塊ID
     * @param Integer $tid: 當前帖子ID
     */
    public function editpost_submit($fid, $tid) {
        //TODO - Insert your code here
        
    }

    /**
     * 主題編輯後的數據處理 
     * @param Integer $fid: 版塊ID
     * @param Integer $tid: 當前帖子ID
     */
    public function editpost_submit_end($fid, $tid) {
        //TODO - Insert your code here
        
    }

    /**
     * 回帖後的數據處理 
     * @param Integer $fid: 版塊ID
     * @param Integer $tid: 當前帖子ID
     */
    public function newreply_submit_end($fid, $tid) {
        //TODO - Insert your code here
        
    }

    /**
     * 查看主題時頁面新增的內容
     * @param Integer $tid: 當前帖子ID
     * @return string 經過 return 返回便可輸出到主題首貼頁面中
     */
    public function viewthread($tid) {
        //TODO - Insert your code here
        
        return 'TODO:viewthread';
    }
}

?>

  這樣能夠清晰地看到哪一個函數是幹什麼用的,咱們只須要將業務邏輯處理好便可。然而現實老是殘酷的,對於discuz不熟悉的同窗這將是一個巨大的坑。至此特殊主題的骨架能夠說已經搭建好了,那麼怎樣才能夠發帖呢?這個地方找了好久才知道是什麼緣由,最後發現是權限的問題。

  三、設置板塊權限

  論壇-->板塊管理,找到對應的板塊-->編輯-->帖子選項、權限相關

  四、設置用戶組和管理組權限

  用戶-->用戶組(管理組)-->選擇須要編輯的用戶組-->批量編輯-->勾選能夠發佈特殊主題的用戶組

  至此,沒什麼意外的話,就能夠發帖了;相信大部分開發者到這一步也能夠發帖了。但是偷懶的我,必然要爲這個偷懶付出代價的。

  2、我範的愚蠢錯誤?仍是discuz自己的bug呢?

  上訴步驟完成之後,爲了快速地看看效果。直接從別的插件裏面複製了一個模板newthread.htm到template目錄下,而後修改了gfpaimai.class.php的newthread函數,讓其加載自定義模板。

    public function newthread($fid) {
        //TODO - Insert your code here

        include template("gfpaimai:newthread");
        //return 'TODO:newthread';
        return $return;
    }

  修改驗證函數

    public function newthread_submit($fid) {
        //TODO - Insert your code here
        
        $message=getgpc('message');
        //對內容判斷
        if( empty($message) || strlen($message)<15  ) {
            showmessage("對不起,請填寫交易內容和具體要求,很多於15字!");
        }
    }

  此時,不管我編輯框裏面輸入多少個字符都顯示,"對不起,請填寫交易內容和具體要求,很多於15字!"。用var_dump($message)查看,message確實爲空,$_GET的結果也爲空。不管我怎麼測試都是如此,對比了下其它插件,發現他們也都是這麼寫的。我就鬱悶了,怎麼會有這樣的問題出來呢?難道又是權限問題?但是檢查了一遍又一遍,沒發現哪裏有問題。這麼來回不知道折騰了多少回,實在沒轍,加幾個Q羣請教請教這方面的老大吧。加了幾個羣,大多都沒人回。後來一個discuz插件開發羣的老大「風子」的指點下找到了問題所在。

  去掉自定義模板查看是否能夠獲取message的內容,也就是去掉newthread函數的

include template("gfpaimai:newthread");

  測試發現能夠獲取到message的內容,瞬間千萬個草泥馬在奔騰。

  好了,既然知道是自定義模板的問題。那麼接下來看看是模板什麼地方致使沒法獲取message吧。因而一段段代碼去掉,最後的最後。大家也想到了的,它出現了。你能夠想象下我當時的表情,欲哭無淚之外即是千萬個草泥馬在奔騰。最後竟然是一個hidden名稱致使的,代碼以下。

<input type="hidden" name="tradeflag" id="tradeflag" value="1"/>

  因而刪掉,再次測試。尼瑪的,果真出來了。因而改個名字再次測試,尼瑪的,仍是出來了。看到這,你有什麼感覺?反正我是欲哭無淚了,看來解決bug和產生新的bug是程序猿的宿命。

  3、問題的反思

  問題解決了,好吧,接下來反思下爲何會這樣呢?

  一、萬惡的習慣,複製的代碼,偷懶不得呀!越是想偷懶,越是花更多的時間來調試。

  二、難道不一樣插件相同的name會致使其中一個用不了?若是是這樣,爲何其餘的相同又沒事,恰恰就這個name爲tradeflag的hidden值就如此呢?搞不懂,tell me why?不知道有沒有哪位碰到過這樣的問題,若是知道是什麼緣由不妨告訴我(又在偷懶了。。。。)。

  

  參考資料:

    http://faq.comsenz.com/library/plug/plugin/plugin_specialthread.htm

    http://www.discuz.1314study.com/t/78913.html

相關文章
相關標籤/搜索