paip.DISCUZ道具開發指南-attilax總結-
今天我要開發一款DISCUZ X2.5 道具,名字就叫“強烈抗議”,情境如下:一天,某個人看了別人一篇貼子,覺得滿篇都是胡說八道, 只要用了“強烈抗議”這個道具,這個貼子就會被隱藏起來一段時間,所有人都看不到了。。
說動手就動手。
道具管理後台:http://127.0.0.1/m_dx/admin.php
管理中心>運營>道具中心..
先去道具中心看了款“喧囂卡”,這個道具,就以這個為原形了,它的圖片地址是static/image/magic/open.gif ,於是我也弄了個 “強烈抗議”圖片,名為 del.gif ,放入其目錄下,
其中還有個小圖片*.small.gif,應該是前台顯示小圖用的,也做了個小圖片del.small.gif 。
然後,要增加道具了,搜尋了下可先看看官方道具開發手冊,位置:歡迎來到 Discuz! 技術文庫>3.歡迎來到 Discuz! 技術文庫>3.3 3.3 外掛程式機制 >第三方拓展類的開發 > 道具類
主要說明有下:
指令碼位置:source/class/magic/*.php
語言套件位置:source/language/magic/*.php
..........................
............................
於是,來到source/class/magic/目錄,把open.php,這個是“喧囂卡”的PHP,我直接copy了下,改名為del.php,這樣我的指令碼就差不多了,開啟del.php,看了下,主要有三行要注意看下..
var $name = 'open_name'; //道具名稱
var $description = 'open_desc'; //道具描述
'title' => 'open_forum', //道具描述
然後,我到語言套件位置:source/language/magic/*.php ,下copy了lang_open.php,這個是“喧囂卡”的語言套件,改名為lang_del.php,然後把open_name,open_desc等描述改動成自己的...
然後在 del.php 中 usesubmit(),這個是重點,指名道具使用後的動作代碼。。。寫了下。。把動作代碼寫好。。
接著,我在後台道具中心測試道具,發現已經多了一行,道具已經顯示出來了,名字是“強烈抗議”,不過圖片沒有顯示出來..啊,
只好先調試解決圖片不出來的問題:
---------------後台不能顯示道具圖片的調試-------------
1.admin.php
require discuz_admincp->admincpfile($action);
return './source/admincp/admincp_'.$action.'.php';
2. source/admincp/admincp_magics.php
line 52 (file_exists(DISCUZ_ROOT.'./static/image/magic/'.$magic['identifier'].'.gif') ? '<img class="vmiddle" src="static/image/magic/'.$magic['identifier'].'.gif" />' : '') ,
其中這裡有圖片的URL,可斷點打出來看具體情況...
3 .其中我看了下讀取圖片的代碼 ,讀取道具圖片流程--------------
DISCUZ讀取道具圖片的名字,主要根據指令碼位置:source/class/magic/*.php,來的,,,
主要代碼如下:
source/admincp/admincp_magics.php
function getmagics() {
global $_G;
$dir = DISCUZ_ROOT.'./source/class/magic';
$magicdir = dir($dir);
$magics = array();
while($entry = $magicdir->read()) {
經過我的調試,原來是圖片檔案名稱拼錯了,回到static/image/magic/下,把圖片名字改好了。就OK了。。
此時,後台道具中心介面,新加的道具圖片顯示出來了,然後儲存了下設定。。。發現有個英文字串open_desc改不掉。。可是我明明在語言套件都設定好了啊。查了下PHP檔案,發現沒問題,我估計應該在資料庫表裡,所以我要檢索整個資料庫查出來。。先將資料庫匯出為SQL檔案,然後檢索,發現open_desc在pre_common_magic這個表裡,開啟表一看,啊,道具設定都儲存在這裡了...我推測,應該是首次儲存道具設定的時候,就把資料儲存在這裡了。。然後改了open_desc,再回後台重新整理,果然ok了。。。
然後,就要在前台顯示道具了,在後台把道具的顯示許可權,“允許使用本道具的版塊:”,這裡設定下顯示的板塊, 道具許可權 ,我通通全選了..
可是在前台,我開啟一個貼子,準備使用道具是,卻發現沒有我的“強烈抗議”道具。。再次開始調試,為了方便,我從前台CSS,HTML開始跟蹤,我用的IE9,直接F12,跟蹤到 “使用道具“,這個這串附近,代碼如下:
<p>
<a href="javascript:;" id="mgc_post_1" onmouseover="showMenu(this.id)" class="showmenu">使用道具</a>
</p>
<ul id="mgc_post_1_menu" class="p_pop mgcmn" style="display: none;">
<li><a href="home.php?mod=magic&mid=bump&idtype=tid&id=1" id="a_bump" onclick="showWindow(this.id, this.href)"><img src="static/image/magic/bump.small.gif" />提升卡</a></li>
<li><a href="home.php?mod=magic&mid=stick&idtype=tid&id=1" id="a_stick" onclick="showWindow(this.id, this.href)"><img src="static/image/magic/stick.small.gif" />置頂卡</a></li>
重點是這個<ul>,我把它的ID mgc_post_1_menu 檢索了所有檔案沒發現,又在資料庫裡檢索,也沒發現....我推測可能是拼接成的,於是只檢索前半部分mgc_post, 果然在PHP檔案中發現了,template\default\forum\viewthread_node.htm ,這個是在模板裡啊。開啟一看,附近代碼如下,再綜合class="p_pop mgcmn" 這個判斷,就是它了..
<ul id="mgc_post_$post[pid]_menu" class="p_pop mgcmn" style="display: none;">
<!--{if $post['first']}-->
<!--{if !empty($_G['setting']['magics']['del'])}-->
<li><a href="。。。。。。“><img >。。。。。。。。</a></li>
<!--{/if}-->
其中的<!--{/if}-->,我覺得有問題,寫法,寫HTML注釋不用這麼麻煩,又想了下,應該是模組專用文法,好從中提取HTML。。
於是我也複製了其中的一個<li>,照著改動了下,就好了。然後前台貼子片一看,YH,終於OK了。顯示出來了,可以使用了..
這樣我的第一個discuz X2.5道具開發,就取得了完美的結果.. .......................
Attilax 寫於2012.7.9 PM