广告

兔源码网 - 专注DZ模版分享、DZ插件分享!

 找回密码
 立即注册
PS教程

Discuz系统学习:道具

[复制链接]
tuyuanma 发表于 2017-1-16 06:50:38 | 显示全部楼层 |阅读模式
温馨提醒:禁止内容附带广告图片、二维码图片,否则将在不通知情况下永久禁言账号!
欢迎加入兔源码站长交流群,您的加入是我们前行的动力!

DZ站长建站交流群:493651246

[ 温馨提示:点击上方群文字,可快速加入QQ群 ]


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在保存日志时自动改变日志内容。



版权声明
1、转摘或引用本站内容资源须注明原网址,并标明本站网址(兔源码www.tuyuanma.com);
2、对于转摘或引用本站内容资源而引起的民事纠纷、行政处罚或其他损失,本站不承担责任;
3、对于不遵守本声明或其他违法、恶意使用本站内容者,本站保留其追究法律责任的权利。




自动排版 | 高级模式
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

兔源码网 ( 赣ICP备17001544号 公网安备36112102000036号 )

兔源码 QQ交流群:493651246  GMT+8, 2018-12-18 02:07
←站长统计工具 查看密码:tuyuanma

兔源码DZ模板下载 站长邮箱:tuyuanma@qq.com 站长QQ:3197813386 网站地图

© 2001-2013 本站内容皆来自互联网及用户分享,如需删除请提供软著或商标证书。

     
快速回复 返回顶部 返回列表