Discuz系统学习:道具-Discuz教程下载

Discuz系统学习:道具

开通本站Svip会员,全站资源免费下
Discuz系统提供了二十多种道具,第三方还可以开发道具以插件的形式给Discuz网站使用。与道具有关的网页有:
  • 管理中心运营里的道具中心页(source/admincp/admincp_magics.php)让管理员设置给道具的使用规则,详见 https://www.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:
  1. if(!defined('IN_DISCUZ')) {
  2.     exit('Access Denied');
  3. }

  4. $lang = array (
  5.     'updateline_name' => '救生圈',
  6.     'updateline_desc' => '把自己日志的发布时间更新为当前时间',
  7.     'updateline_info' => '把自己日志的发布时间更新为当前时间',
  8. );
复制代码
3)脚本文件 source/class/magic/magic_updateline.php:
  1. if(!defined('IN_DISCUZ')) {
  2.     exit('Access Denied');
  3. }

  4. class magic_updateline {
  5.     var $version = '1.0';
  6.     var $name = 'updateline_name';
  7.     var $description = 'updateline_desc';
  8.     var $price = '20';
  9.     var $weight = '20';
  10.     var $useevent = 0;
  11.     var $targetgroupperm = false;
  12.     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>';
  13.     var $magic = array();
  14.     var $parameters = array();

  15.     function getsetting(&$magic) {}

  16.     function setsetting(&$magicnew, &$parameters) {}

  17.     function usesubmit() {
  18.         global $_G;
  19.         $id = intval($_GET['id']);
  20.         $idtype = $_GET['idtype'];
  21.         magic_check_idtype($id, $idtype);
  22.         $tablename = gettablebyidtype($idtype);
  23.         C::t($tablename)->update_dateline_by_id_idtype_uid($id, $idtype, $_G['timestamp'], $_G['uid']);
  24.         C::t('home_feed')->update($id, array('dateline'=>$_G['timestamp']), $idtype, $_G['uid']);
  25.         usemagic($this->magic['magicid'], $this->magic['num']);
  26.         updatemagiclog($this->magic['magicid'], '2', '1', '0', '0', $idtype, $id);
  27.         showmessage('magics_use_success', '', array('magicname'=>$_G['setting']['magics']['updateline']), array('alert' => 'right', 'showdialog' => 1));
  28.     }

  29.     function show() {
  30.         global $_G;
  31.         $id = intval($_GET['id']);
  32.         $idtype = $_GET['idtype'];
  33.         magic_check_idtype($id, $idtype);
  34.         magicshowtips(lang('magic/updateline', 'updateline_info'));
  35.         echo '<p><input type="hidden" name="id" value="'.$id.'" /><input type="hidden" name="idtype" value="'.$idtype.'" /></p>';
  36.     }
  37. }
复制代码
这个道具类只包含两个主要规定名字的函数:
1)show,它将该道具特有的内容加入道具使用页,让这些信息送到服务器端供使用该插件时用。这个插件将当前网页的类型(如日志)和ID(如日志ID)作为隐藏项加入了道具使用页。插入点在文件 template/default/home/space_magic_mybox_operation.htm 里:
  1. <!--{if method_exists($magicclass, 'show')}-->
  2.     <!--{eval $magicclass->show();}-->
  3. <!--{/if}-->
复制代码
2)usesubmit,它定义了使用该道具时要做的事,或者说就是用该道具要到达的目的。它是在文件 source/module/home/home_magic.php 中插入的:
  1. if(submitcheck('usesubmit')) {
  2.     if($useperoid !== true && $useperoid <= 0) {
  3.         showmessage('magics_outofperoid_'.$magic['useperoid'], '', array('usenum' => $magic['usenum']));
  4.     }
  5.     if(method_exists($magicclass, 'usesubmit')) {
  6.         $magicclass->usesubmit();
  7.     }
  8.     dexit();
  9. }
复制代码
道具开发
第三方开发者可以以插件的形式开发道具。和系统道具一样,它的文件也有一定规范,但和系统道具的规范又有所不同:
系统道具插件道具
道具图标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.phpsource/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.phpsource/plugin/txgz_magic_test/magic/magic_earth.php
道具语言包source/language/magic/lang_updateline.phpdata/plugindata/txgz_magic_test.lang.php

接下来是对应文件内容的对比,只列出不同的部分:
1) 道具类文件
source/class/magic/magic_updateline.phpsource/plugin/txgz_magic_test/magic/magic_earth.php
  1. class magic_updateline {
  2.     var $version = '1.0';
  3.     var $name = 'updateline_name';
  4.     var $description = 'updateline_desc';
复制代码
  1. class magic_earth {
  2.     var $version = '1.0';
  3.     var $name = 'earth_name';
  4.     var $description = 'earth_desc';
复制代码
  1. showmessage('magics_use_success', '', array('magicname'=>$_G['setting']['magics']['updateline']), array('alert' => 'right', 'showdialog' => 1));
复制代码
  1. showmessage('magics_use_success', '', array('magicname'=>$_G['setting']['magics']['txgz_magic_test_earth']), array('alert' => 'right', 'showdialog' => 1));
复制代码
  1. magicshowtips(lang('magic/updateline', 'updateline_info'));
复制代码
  1. magicshowtips(lang('plugin/txgz_magic_test', 'earth_info'));
复制代码
2) 道具语言包
source/language/magic/lang_updateline.php data/plugindata/txgz_magic_test.lang.php
  1. $lang = array
  2. (
  3.     'updateline_name' => '救生圈',
  4.     'updateline_desc' => '把自己日志的发布时间更新为当前时间',
  5.     'updateline_info' => '把自己日志的发布时间更新为当前时间',
复制代码
  1. $scriptlang['txgz_magic_test'] = array (
  2.     'earth_name' => '地球仪',
  3.     'earth_desc' => '道具开发测试',
  4.     'earth_info' => '道具开发测试',
复制代码
最后是使用方法的对照,在文件 template/default/home/space_blog_view.htm 中。特别注意如何检查插件道具是可用的和如何调用插件道具的:
  1. <!--{if $_G[setting][magics][updateline]}-->
  2.     <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>
  3. <!--{/if}-->
复制代码
  1. <!--{if $_G[setting][magics][txgz_magic_test_earth]}-->
  2.     <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>
  3. <!--{/if}-->
复制代码
注:本文中的代码里的<符号后和a相连时加了一个不应该有的空格,以避免Discuz在保存日志时自动改变日志内容。


全部评论 0

您需要登录后才可以回帖 立即登录
登录
0
0
0
返回顶部