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