Discuz系统提供了二十多种道具,第三方还可以开发道具以插件的形式给Discuz网站使用。与道具有关的网页有:- 管理中心运营里的道具中心页(source/admincp/admincp_magics.php)让管理员设置给道具的使用规则,详见 https://tuyuanma.com/news-2149-1-1的介绍
- 道具商店(template/default/home/space_magic_shop.htm)供网站用户购买道具,一般在快捷导航里进入
- 我的道具(template/default/home/space_magic_mybox.htm)让用户查看自己拥有的道具,在那里还能赠送和出售道具,和上面的道具商店属于同一网页的不同TAB
- 道具记录(template/default/home/space_magic_log.htm)让用户查看以往自己的道具的使用记录,购买记录,赠送记录和获赠记录,和上面的道具商店属于同一网页的不同TAB
- 道具购买页(template/default/home/space_magic_shop_operation.htm),在这页上填写购买的数量。这页可以从道具商店里选择道具购买时显示,也可以在某些使用道具的地方按需出现(如日志页里点击'使用道具'来选择某道具后)
- 道具使用页(template/default/home/space_magic_mybox_operation.htm),一个跳出窗口让用户确认要使用某道具
以上网页除道具中心外,都由脚本文件 source/module/home/home_magic.php 经处理用户发的请求后选择合适的模版来调用的。
系统道具
道具的写作很有规范,可谓观一例而知全貌。下面以救生圈道具为例看看道具是如何作用的,这个道具将日志的发表时间改为当前使用道具时的时间。这个道具由四个文件产生:
1)一大一小两个图标文件 static/image/magic/updateline.gif (74*74) 和 static/image/magic/updateline.small.gif (16*16) :2)语言包文件 source/language/magic/lang_updateline.php:
- if(!defined('IN_DISCUZ')) {
- exit('Access Denied');
- }
- $lang = array (
- 'updateline_name' => '救生圈',
- 'updateline_desc' => '把自己日志的发布时间更新为当前时间',
- 'updateline_info' => '把自己日志的发布时间更新为当前时间',
- );
复制代码 3)脚本文件 source/class/magic/magic_updateline.php:- if(!defined('IN_DISCUZ')) {
- exit('Access Denied');
- }
- class magic_updateline {
- var $version = '1.0';
- var $name = 'updateline_name';
- var $description = 'updateline_desc';
- var $price = '20';
- var $weight = '20';
- var $useevent = 0;
- var $targetgroupperm = false;
- var $copyright = '<a href="http://www.comsenz.com" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank">Comsenz Inc.</a>';
- var $magic = array();
- var $parameters = array();
- function getsetting(&$magic) {}
- function setsetting(&$magicnew, &$parameters) {}
- function usesubmit() {
- global $_G;
- $id = intval($_GET['id']);
- $idtype = $_GET['idtype'];
- magic_check_idtype($id, $idtype);
- $tablename = gettablebyidtype($idtype);
- C::t($tablename)->update_dateline_by_id_idtype_uid($id, $idtype, $_G['timestamp'], $_G['uid']);
- C::t('home_feed')->update($id, array('dateline'=>$_G['timestamp']), $idtype, $_G['uid']);
- usemagic($this->magic['magicid'], $this->magic['num']);
- updatemagiclog($this->magic['magicid'], '2', '1', '0', '0', $idtype, $id);
- showmessage('magics_use_success', '', array('magicname'=>$_G['setting']['magics']['updateline']), array('alert' => 'right', 'showdialog' => 1));
- }
- function show() {
- global $_G;
- $id = intval($_GET['id']);
- $idtype = $_GET['idtype'];
- magic_check_idtype($id, $idtype);
- magicshowtips(lang('magic/updateline', 'updateline_info'));
- echo '<p><input type="hidden" name="id" value="'.$id.'" /><input type="hidden" name="idtype" value="'.$idtype.'" /></p>';
- }
- }
复制代码 这个道具类只包含两个主要规定名字的函数:
1)show,它将该道具特有的内容加入道具使用页,让这些信息送到服务器端供使用该插件时用。这个插件将当前网页的类型(如日志)和ID(如日志ID)作为隐藏项加入了道具使用页。插入点在文件 template/default/home/space_magic_mybox_operation.htm 里:- <!--{if method_exists($magicclass, 'show')}-->
- <!--{eval $magicclass->show();}-->
- <!--{/if}-->
复制代码 2)usesubmit,它定义了使用该道具时要做的事,或者说就是用该道具要到达的目的。它是在文件 source/module/home/home_magic.php 中插入的:- if(submitcheck('usesubmit')) {
- if($useperoid !== true && $useperoid <= 0) {
- showmessage('magics_outofperoid_'.$magic['useperoid'], '', array('usenum' => $magic['usenum']));
- }
- if(method_exists($magicclass, 'usesubmit')) {
- $magicclass->usesubmit();
- }
- dexit();
- }
复制代码 道具开发
第三方开发者可以以插件的形式开发道具。和系统道具一样,它的文件也有一定规范,但和系统道具的规范又有所不同: | 系统道具 | 插件道具 | 道具图标 | static/image/magic/道具ID.gif
static/image/magic/道具ID.small.gif | source/plugin/道具插件ID/magic/magic_道具ID.gif
source/plugin/道具插件ID/magic/magic_道具ID.small.gif | 道具类文件 | source/class/magic/magic_道具ID.php | source/plugin/道具插件ID/magic/magic_道具ID.php | 道具语言包 | source/language/magic/lang_道具ID.php | 在开发时写在插件语言包文件 ( data/plugindata/道具插件ID.lang.php ) 内,导出后成了插件设置文件的一部分 |
没想出很合适的插件道具,我就将上述救生圈道具试试改写成插件道具,意在比较下两者开发规范的异同。 我加了个名叫 txgz_magic_test 的插件
先是文件列表对照: | 系统道具 | 插件道具 | 道具图标 | static/image/magic/updateline.gif
static/image/magic/updateline.small.gif | source/plugin/txgz_magic_test/magic/magic_earth.gif
source/plugin/txgz_magic_test/magic/magic_earth.small.gif | 道具类文件 | source/class/magic/magic_updateline.php | source/plugin/txgz_magic_test/magic/magic_earth.php | 道具语言包 | source/language/magic/lang_updateline.php | data/plugindata/txgz_magic_test.lang.php |
接下来是对应文件内容的对比,只列出不同的部分:
1) 道具类文件
source/class/magic/magic_updateline.php | source/plugin/txgz_magic_test/magic/magic_earth.php |
- class magic_updateline {
- var $version = '1.0';
- var $name = 'updateline_name';
- var $description = 'updateline_desc';
复制代码 | - class magic_earth {
- var $version = '1.0';
- var $name = 'earth_name';
- var $description = 'earth_desc';
复制代码 | - showmessage('magics_use_success', '', array('magicname'=>$_G['setting']['magics']['updateline']), array('alert' => 'right', 'showdialog' => 1));
复制代码 | - showmessage('magics_use_success', '', array('magicname'=>$_G['setting']['magics']['txgz_magic_test_earth']), array('alert' => 'right', 'showdialog' => 1));
复制代码 | - magicshowtips(lang('magic/updateline', 'updateline_info'));
复制代码 | - magicshowtips(lang('plugin/txgz_magic_test', 'earth_info'));
复制代码 | 2) 道具语言包
source/language/magic/lang_updateline.php | data/plugindata/txgz_magic_test.lang.php | - $lang = array
- (
- 'updateline_name' => '救生圈',
- 'updateline_desc' => '把自己日志的发布时间更新为当前时间',
- 'updateline_info' => '把自己日志的发布时间更新为当前时间',
复制代码 | - $scriptlang['txgz_magic_test'] = array (
- 'earth_name' => '地球仪',
- 'earth_desc' => '道具开发测试',
- 'earth_info' => '道具开发测试',
复制代码 | 最后是使用方法的对照,在文件 template/default/home/space_blog_view.htm 中。特别注意如何检查插件道具是可用的和如何调用插件道具的:- <!--{if $_G[setting][magics][updateline]}-->
- <li>< a href="home.php?mod=magic&mid=updateline&idtype=blogid&id=$blog[blogid]" id="a_magic_updateline" onclick="showWindow('magics', this.href, 'get', 0);"><img src="{STATICURL}image/magic/updateline.small.gif" alt="updateline" class="vm" /> {$_G[setting][magics][updateline]}</a></li>
- <!--{/if}-->
复制代码- <!--{if $_G[setting][magics][txgz_magic_test_earth]}-->
- <li>< a href="home.php?mod=magic&mid=txgz_magic_test:earth&idtype=blogid&id=$blog[blogid]" id="a_magic_earth" onclick="showWindow('magics', this.href, 'get', 0);"><img src="source/plugin/txgz_magic_test/magic/magic_earth.small.gif" alt="earth" class="vm" /> {$_G[setting][magics][txgz_magic_test_earth]}</a></li>
- <!--{/if}-->
复制代码 注:本文中的代码里的<符号后和a相连时加了一个不应该有的空格,以避免Discuz在保存日志时自动改变日志内容。
|