昨天看到一个哥们说插件的教程太少,今天正好准备写个插件,就把整个过程写下来...
其实我对插件的制作也是刚刚开始,使用php的时间也不长,有很多都是尝试着弄得,有不会的地方都是在baidu或google上搜索,
里面肯定存在一些不是十分理想的地方,请各位老鸟能够帮助,各位菜鸟共同进步!
还有,就是从第一贴开始,我才开始做这个插件,时间可能会比较久,如果大家有什么建议和意见,或者我有不能搞清楚的地方,请大家帮助!
在开始之前,让大家先关注几个帖子
第一个是关于php和mysql的基础文章,
mastermind007的
PHP & MySQL 初级教程,这个文章比较长了,如果有一定基础的朋友可以跳过,而基础薄弱的朋友就该看看了,也许比较枯燥,但是没有基础肯定是不行的了.
第二个是关于正则的,在插件的设计开发过程中,难免有些需要到正则的地方,
泡哥 的
如何能提高插件编写能力(一)这个帖子讲的就比较清楚了,当然有时我们可以直接拿别人的正则过来直接就使用了,说实话,我经常就是这样,不会写,但是一定要会改!
第三个文章还是
泡哥 的,
玩转Discuz!——七天学会插件制作!,虽然更新没有完成,但是
在我的这篇文章之前,一定要看看这个文章,这个图文并茂的教程挺不错的,而且讲解的十分透彻..
第四个是
sw08 (老龙) 的
[资料库]DZ程序文件目录含义整理表,这篇文章有助于我们寻找一些程序原有的文件,这样有的时候我们可以看看官方在某些细节上是如何处理的,有助于我们自己的学习..
第五个还是关于DZ的,就是
M55 斑斑的
收集 DZ 全局变量、常量以及数组名称及说明,这里收集了常用的DZ的变量和数组,便于我们的使用.PS:希望M55斑斑的眼疾早日康复!
最后一个也是相对重要的,是关于插件的安全问题的,是
cnstudent的
插件安全如何保证(FOR 插件作者版),DZ的安全性由官方来保证,但是千万别因为插件的安全问题,影响了整个论坛啊,而且你个人编写的插件是公布源码的,如果高手轻易的找到了漏洞,那使用这个插件的朋友就遭殃了,搞不好就成了旁注的大门...所以还是尽量的保证插件的安全性....
QUOTE:
现在我遇到的问题:
1.我现在需要一个"我要领取红包"字样的按钮,请哪位仁兄帮做一个,PL一点的,谢谢~~!2006年11月11日
好了,下面就开始我的正式内容.
2006年11月10日更新1.插件简介a.插件名次:社区红包
b.插件类别:积分类
c.插件说明:由管理员添加于特定日期给予论坛会员发放论坛扩展积分作为奖励(特定日期为春节,五一,十一,情人节,圣诞节......)
d.插件优势:相对于过去使用银行的发放节日奖励方式,要求会员在特定的日期内登录社区,才能领取奖励.
2.插件功能创意a.可定制奖励积分的扩展积分项
b.可定制红包内钱数(可选择固定值或随机值)
c.管理人员可设置为普通会员的N倍
d.可以限制红包的总数量,意思就是先到先得,后到没有
e.可以通过领取红包者的注册时间和积分底线,防止马甲领取
3.插件制作过程(一)数据库部分如果没有修改过表前缀的话,我们设计的数据库表以cdb_为前缀,这个插件我们需要2个数据库表,表的命名方式尽量应该明确,且与原论坛的表有明显的区分,我个人在开发的过程中习惯把数据库表名定为cdb_plugins_XXX_YYY的格式,(XXX为插件名,YYY为插件中某具体用途的表)
插入一个关于插件名的问题,当然也涉及到整个插件中的变量等命名的规则,插件的名字最好使用大家都熟悉的英文,实在不知道英文,就使用拼音好了,例如这次的红包插件,我就把插件的名字定为hongbao,在插件中的变量,也尽量使用此名次开头的变量,便于区分.
进入正题,我们开始考虑这个红包需要的数据库表
a.红包信息表,表名cdb_plugins_hongbao_info (好像比较长,但是看上去就很明确了,前缀_插件_插件名_信息)
该表需要记录哪些字段呢?
hid,红包的id,这个是表的主键,几乎每个数据表都有这么字段,自增型,int(10)
hname,红包名称,所发放红包的名称,一般这个不会太长,varchar(30),not null
hexplain,红包说明,红包的介绍,
hstart,红包开始发放时间
hend,红包发放结束时间
hcredits,红包对应扩展积分
htype,红包类型,固定值或随机值,1=随机;0=固定
hnummin,红包最小值
hnummax,红包最大值
hrand,论坛管理人员红包倍数
hregdeny,注册时间限制
hpostsdeny,发帖数量限制
hcreditsdeny,用户积分限制值
htimesdeny,红包个数限制
hgettimes,红包领取次数
hgetnumcount,红包已发放数额
hishide,红包是否隐藏,用途是如果期次太多,就将已过时间很久的红包信息隐藏,在前台不显示.1=隐藏;0=显示
b.红包领取日志,表名cdb_plugins_hongbao_log
hlid,红包日志id
hid,红包id
uid,领取者id
hltime,领取时间
hlnum,领取值
hlip,领取者ip
数据库的设计暂时这样,这个只是初步定的,数据库的字段还有可能变化,要在插件开发的过程中看看还有没有什么变化.
这里看到的并不是通常插件开发人员提供的sql语句,因为在这里并没有创建数据库,只是数据库结构的设计,包括字段的类型和长度都在设计后确定.
4.插件制作过程(二)插件功能流程设计a.管理人员管理红包功能,这里需要个比较普通的页面即可.没有什么特殊的东西,主要是防止管理人员录入的数据发生错误,会有较多的判断.该部分会在后面详细介绍.
需要的页面:增加,编辑,删除(注1:添加红包时应考虑2个红包的发放时间是不允许有重合部分的.可考虑人工提示或程序控制,如果技术可以达到的,就靠程序来控制)
b.会员前台的红包插件页面
b1.首先是把取出所有的红包信息(注2:条件hishide=0)
b2.循环,将当前的当前时间timestamp与红包发放的开始hstart和结束时间hend对比(注3:类似这种与时间有紧密联系的插件,一定要考虑用户时差timeoffset的问题)
b2.1 timestamp>hend 红包已发放结束
b2.2 hend>timestamp>hstart 红包发放中,当有此情况时,置变量hongbaonow为1,供模版判断是否显示领取红包按钮用.
b2.3 timestamp<hstart 红包发放未开始
c.会员领取红包功能,这里是核心功能了,流程相对复杂(其实是比较简单的,主要都是一些判断)
c1.根据红包id,取该红包的所有信息,如果id不存在,提示错误.
c2.为防止有人通过链接直接访问红包领取页面,仍要再次判断是否hend>timestamp>hstart,否->领取失败,时间错误(注4:这里的语言为暂时使用,程序中会使用一些比较客气的话!)
c3.是否设置了红包个数限制htimesdeny,如果设置是否htimesdeny>=hgettimes,是->领取失败,红包已发完
c4.查询当前用户是否已经领取过本次红包,查询表cdb_plugins_hongbao_log中是否存在uid='$discuz_uid' and hid='$hid',是->领取失败,已领取过.
c5.是否设置了 注册时间限制hregdeny 或 发帖数量限制hpostsdeny 或 用户积分限制值hcreditsdeny ,是->c6 否->c7
c6.取当前用户信息"SELECT regdate,posts,credits FROM {$tablepre}members WHERE uid='$discuz_uid'",判断用户是否符合领取条件.
c7.所有判断已通过,根据红包类型htype,得到用户置变量用户本次红包数量hongbaoget htype=0 ->hongbaoget=hnummin ; htype=1 ->hongbaoget=rand(hnummin,hnummax)
c8.判断用户是否为管理员组,是->hongbaoget=hongbaoget*hrand
c9.将领取日志写入表cdb_plugins_hongbao_log,并更新表cdb_plugins_hongbao_info的红包领取次数hgettimes和红包已发放数额hgetnumcount
c10.*考虑是否发生短消息
c11.提示领取成功,返回插件首页.
今天说的是流程设计,由于我不是一个真正的程序员,所以有些东西并不是很清楚,我想跟大家说的是一个概念.
1.流程中都应该考虑些什么事情,应该尽可能多的想到各种各样的情况,甚至应该是想到所有可能发生的情况.
2.关于数据库的查询,我觉得应该使用尽可能少的查询次数.而且流程是有先后顺序的,如这次流程中的c2,c3,c4,c5,顺序看起来是无所谓的,举个简单的例子,如果c3和c4换了位置,假设我们设置了红包的个数是100个,当用户领取次数达到100后,程序就会先执行在c3之前的c4,取log表中的信息,用数字的方法表达应该更加明确一些,在上述情况下c3在c4前出去DZ自己默认的查询,插件的查询次数是1次,而如果c4在c3前,查询次数是2次.
不知道关于这个问题我解释的是否清楚,只是根据我的理解应该是这样.
如果不考虑查询次数的话,我倒是觉得c4和c5都应该在c3之前的....
关于类似的流程,大家也可以看看我之前的一个插件,里面有很详尽的注释,那个插件的判断过程比这个多很多,希望你能有些收获.
http://www.discuz.net/thread-437163-1-2.html