Discuz!官方免费开源建站系统

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

一个插件的编写过程,社区红包For5.0[11/27更新]

[复制链接]
xuesharp 发表于 2006-11-10 17:49:19 | 显示全部楼层 |阅读模式
昨天看到一个哥们说插件的教程太少,今天正好准备写个插件,就把整个过程写下来...
其实我对插件的制作也是刚刚开始,使用php的时间也不长,有很多都是尝试着弄得,有不会的地方都是在baidu或google上搜索,
里面肯定存在一些不是十分理想的地方,请各位老鸟能够帮助,各位菜鸟共同进步!
还有,就是从第一贴开始,我才开始做这个插件,时间可能会比较久,如果大家有什么建议和意见,或者我有不能搞清楚的地方,请大家帮助!

在开始之前,让大家先关注几个帖子
第一个是关于php和mysql的基础文章,mastermind007PHP & MySQL 初级教程,这个文章比较长了,如果有一定基础的朋友可以跳过,而基础薄弱的朋友就该看看了,也许比较枯燥,但是没有基础肯定是不行的了.
第二个是关于正则的,在插件的设计开发过程中,难免有些需要到正则的地方,泡哥如何能提高插件编写能力(一)这个帖子讲的就比较清楚了,当然有时我们可以直接拿别人的正则过来直接就使用了,说实话,我经常就是这样,不会写,但是一定要会改!
第三个文章还是泡哥 的,玩转Discuz!——七天学会插件制作!,虽然更新没有完成,但是在我的这篇文章之前,一定要看看这个文章,这个图文并茂的教程挺不错的,而且讲解的十分透彻..
第四个是sw08 (老龙)[资料库]DZ程序文件目录含义整理表,这篇文章有助于我们寻找一些程序原有的文件,这样有的时候我们可以看看官方在某些细节上是如何处理的,有助于我们自己的学习..
第五个还是关于DZ的,就是M55 斑斑的收集 DZ 全局变量、常量以及数组名称及说明,这里收集了常用的DZ的变量和数组,便于我们的使用.PS:希望M55斑斑的眼疾早日康复!
最后一个也是相对重要的,是关于插件的安全问题的,是cnstudent插件安全如何保证(FOR 插件作者版),DZ的安全性由官方来保证,但是千万别因为插件的安全问题,影响了整个论坛啊,而且你个人编写的插件是公布源码的,如果高手轻易的找到了漏洞,那使用这个插件的朋友就遭殃了,搞不好就成了旁注的大门...所以还是尽量的保证插件的安全性....


现在我遇到的问题:
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语句,因为在这里并没有创建数据库,只是数据库结构的设计,包括字段的类型和长度都在设计后确定.

[ 本帖最后由 xuesharp 于 2006-11-27 11:35 编辑 ]

评分

1

查看全部评分

 楼主| xuesharp 发表于 2006-11-10 17:49:44 | 显示全部楼层
2006年11月11日更新
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之前的....
  关于类似的流程,大家也可以看看我之前的一个插件,里面有很详尽的注释,那个插件的判断过程比这个多很多,希望你能有些收获.
https://discuz.dismall.com/thread-437163-1-2.html

5.插件制作过程(三)论坛后台增加插件
现在我们来看看泡哥 的文章玩转Discuz!——七天学会插件制作!,这里介绍了很多的基础知识,对于我们的进步很有帮助.
为了方便下面的东西,有部分文字直接摘录了上面的文章!

现在我们开始在后台增加我们的红包插件
5.1.进入论坛的后台(系统设置)-扩展设置—插件管理—新增—插件名称—唯一标识—提交,见图001
插件名称:插件的中文名字,也可以是其他语言,不过我是中国人只写中文,名字最好通俗易懂便于理解,例如:社区红包。
唯一标识:插件的英文代码,没办法计算机程序是外国人写的,必须遵守他们的规矩,唯一标识最好是翻译插件名称。例如:社区红包——hongbao
图001

5.2.编辑插件 - 社区红包 (点击插件后面的详情),见图002
版权信息(copyright):这个信息只要填写了,之后就不能修改了,当然,没有太多的用处,随便写一个就OK了.
后台权限等级:这是设定谁可以管理插件设置里的插件!一般当然是管理员,除非你有后台模块需要版主帮你管理!
插件目录:就是放插件程序地方,./plugins/这个文件夹在根目录下,如果插件多了文件一大堆分不清文件是那个插件的就不好了!所以要在这个目录下做个插件的文件夹。这里我们就建立一个hongbao文件夹,别忘了hongbao/后面有个斜杠的符号
插件数据表:这个是discuz在备份数据库的时候,会把插件的数据库一起备份了,按照上面程序的设计,有两个数据库表,我们填写plugins_hongbao_info,plugins_hongbao_log
插件描述:地球人都知道,插件作用的简单描述!
图002

之后提交就可以了!填完这些那么你就创建了一个插件,但是这是不过是表面文章,接下来我们继续创建插件!
5.3.添加模板和PHP文件
在进行插件模块和自定义菜单之前,我们先要建立插件所使用的php文件和模版文件
首先看一下discuz的根目录文件夹,如图003
图003

5.3.1.在根目录—plugins文件夹下—创建hongbao文件夹(这就对应了前面插件目录的填写),如图004
图004

5.3.2.在hongbao文件夹里创建hongbao.inc.php文件,如图005
图005

为什么文件的命名有inc呢?
文件命名规范
[B]Discuz! 按照如下的规范对程序和模板进行命名,请在设计插件时尽量遵循此命名规范:[/B]
1.可以直接通过浏览器访问的普通程序文件,以 .php 后缀命名。
2.被普通程序文件引用的程序文件,以 .inc.php 后缀命名。
3.被普通程序文件,或引用程序文件引用的函数库或类库,以 .func.php(函数库) 或 .class.php(类库) 后缀命名。
4.模板文件,以 .htm 后缀命名,模板文件只存在于 ./templates 目录中。
5.模板语言包文件,以 .lang.php 后缀命名,语言包文件只存放于 ./templates 目录中,与模板文件同级目录。
6.被编译后的模板文件,以 .tpl.php 后缀命名,前面的数字是模板套系的 ID,下划线后面的是模板原名,编译模板文件只存在于 ./forumdata/templates 目录中。
7.动态缓存文件,存放于 ./forumdata/cache 目录中,依据不同的功用进行独立的命名。
8.使用后台数据备份功能生成的备份文件,通常以 .sql 为后缀,存放于 ./forumdata/ 目录中。
9.有些目录中存在内容为空白的 index.htm 文件,此类文件是为了避免 Web 服务器打开 Directory Index 时可能产生的安全问题。

5.3.3.在./templates/default/——创建hongbao.htm
好了这样我们就做好了创建插件的准备工作!
5.4.创建菜单链接—插件模块和自定义菜单如图006
图006

程序模块:这个是指./plugins/hongbao/hongbao.inc.php这个文件,我们已经做好了,所以填写hongbao
菜单名称:这是指前台的菜单显示,很多人问插件菜单名怎么变红色=>
  1. <font color=red>申请红包</font>
复制代码

填这个就行,这里你学到了第一句HTML语法:<字体设置  颜色参数=颜色代码>文字<围堵标记>,其中的颜色代码可以是16进制代码也可以固定英文代码例如:red  也就是#FF0000   你用百度搜索颜色代码表到处都是啦!
模块类型:
插件模块和自定义菜单:
插件接口默认提供四种可选的模块方式:
1.直接链接(前台菜单):可在前台右上角加入一个菜单项,可自主指派菜单链接的 URL。注意:由于引用外部程序,因此即便设置了模块的使用等级,您的程序如需权限判断,仍需要引用 common.inc.php 和插件相关的缓存文件(将在后面的《参数读取与缓存控制》中详细说明),并自行判断使用等级是否合法;
2.前台调用(前台菜单):与直接链接类似,但其调用的是插件的一个模块,模块文件名指派为“./plugins/插件目录/插件模块名.inc.php”,由 plugin.php 调用此模块,调用 URL 将在后面的《编写插件的原则与注意事项》中详细说明;
3.后台调用(后台菜单):可在后台插件设置中为此插件增添一个管理模块,模块文件名指派为“./plugins/插件目录/插件模块名.inc.php”,由 admincp.php 调用此模块,调用 URL 将在后面的《编写插件的原则与注意事项》中详细说明;
4.包含运行(无菜单):可设置一个在论坛所有页面均包含运行的脚本,此脚本在 ./include/common.inc.php 中加载,脚本文件名指派为“./plugins/插件目录/插件模块名.inc.php”。请注意,为了不导致错误的插件影响论坛运行,在 common.inc.php 加载此模块时,屏蔽了错误信息,因此请务必仔细检查是否存在语法错误,任何微小的语法错误都将不被提示出来,并且导致此模块不被正常加载。如果您配置了不正确的包含脚本而导致论坛系统设置无法使用,删除服务器上相应的脚本文件即可解决。
您可以为每个模块设置不同的使用等级,例如设置为“超级版主”,则超级版主及更高的管理者(例如论坛管理员)可以使用此模块。

看到了应该很简单前台文件、后台文件、调用外部文件、初始化文件!就这四种!那么一般的插件文件当然是前台调用
这里要说明一个调用问题,文中多次说到./include/common.inc.php是否加载,也就是说加载了这个文件,你就可以轻松的得到会员名、会员uid、会员的积分信息、论坛的分类、各级会员组用户组信息,简单说就是汽车加了汽油你可以开了,前后台调用都加载了这个文件;包含运行是把程序写入这个文件;前台链接没有加是需要你另外添加的!
使用等级:不用说了给谁用的!

[ 本帖最后由 xuesharp 于 2006-11-27 11:39 编辑 ]
回复

使用道具 举报

 楼主| xuesharp 发表于 2006-11-10 17:50:03 | 显示全部楼层
这里是第3楼~~~~~~~~!更新使用~!
回复

使用道具 举报

 楼主| xuesharp 发表于 2006-11-10 17:50:23 | 显示全部楼层
这里是第4楼~~~~~~~~!更新使用~!
回复

使用道具 举报

 楼主| xuesharp 发表于 2006-11-10 17:50:42 | 显示全部楼层
这里是第5楼~~~~~~~~!更新使用~!
回复

使用道具 举报

 楼主| xuesharp 发表于 2006-11-10 17:51:00 | 显示全部楼层
这里是第6楼~~~~~~~~!更新使用~!
回复

使用道具 举报

 楼主| xuesharp 发表于 2006-11-10 17:51:23 | 显示全部楼层
这里是第7楼~~~~~~~~!更新使用~!
回复

使用道具 举报

 楼主| xuesharp 发表于 2006-11-10 17:51:44 | 显示全部楼层
这里是第8楼~~~~~~~~!更新使用~!
回复

使用道具 举报

精彩无限 发表于 2006-11-10 17:51:49 | 显示全部楼层
写什么??????????
回复

使用道具 举报

 楼主| xuesharp 发表于 2006-11-10 17:52:18 | 显示全部楼层
这里是第9楼~~~~~~~~!更新使用~!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|Discuz! 官方站 ( 皖ICP备16010102号 )star

GMT+8, 2024-12-23 04:23 , Processed in 0.035934 second(s), 7 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

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