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

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

插件编写规范和流程[12.13日更新]

[复制链接]
索克 发表于 2007-1-18 19:28:25 | 显示全部楼层
请LZ继续更新吧
回复

使用道具 举报

wolf5i58 发表于 2007-1-18 21:15:19 | 显示全部楼层
难啊!!!!!看看我的签名 看看我的签名QQ395648512
回复

使用道具 举报

温度 发表于 2007-1-22 20:45:04 | 显示全部楼层
超级菜鸟一名,想偷师,但怎么看都学不会。。。
回复

使用道具 举报

Clwarm 发表于 2007-1-22 22:52:02 | 显示全部楼层
楼主 好久没更新了……
回复

使用道具 举报

冷寒轩2202 发表于 2007-1-24 20:09:39 | 显示全部楼层
支持这样的帖子 支持技术交流
回复

使用道具 举报

dotku 发表于 2007-1-31 03:41:28 | 显示全部楼层
有源码下载吗?
想要完整代码
回复

使用道具 举报

kelystor 发表于 2007-2-2 14:29:57 | 显示全部楼层
  看了Maple-x的这篇贴子,深受启发,以前都是编写那种功能增强型的插件,将插件作为独立的文件存放。这几天,慢慢地按照贴子的步骤熟悉了一下开发的流程,发现不算难,但也碰到了一些问题,下面详细地说一下。
  看到前面一些朋友对代码的质疑,我在编写的时候,综合了一下意见,进行了改进。

  下面是apply.inc.php的代码:



  1. <?php
  2. if(!defined('IN_DISCUZ'))
  3. {
  4. exit('Access Deined');
  5. }
  6. //建议:在每个插件程序的开头加上上面的代码.这是为了防止禁止直接外部访问文件


  7. @include_once DISCUZ_ROOT.'./forumdata/cache/plugin_apply.php';
  8. /*
  9. 调用DISCUZ生成的插件参数的缓存文件.调用缓存文件以后,就可以调用里面的变量了.
  10. Discuz生成的插件参数的配置文件是保存在一个二维的数组里的。$_DPLUGIN[‘apply’][‘vars’];
  11. 这里我们为了美观,对这个二维数组进行一下简化
  12. */
  13. $applycount = $_DPLUGIN['apply']['vars']['applycount'];
  14. $lowestregdates = $_DPLUGIN['apply']['vars']['lowestregdates'];
  15. $integral = $_DPLUGIN['apply']['vars']['integral'];
  16. $extcredit = $_DPLUGIN['apply']['vars']['extcredit'];
  17. $lowestposts = $_DPLUGIN['apply']['vars']['lowestposts'];


  18. /*
  19. 这里需要强调的一点:
  20. Discuz是对提交过来的变量的值进行了转义,我们可以认为他过来的值就是一个字符串,那么在使用他的时候,要尽量放在一个不会解析变量的单引号内.这样无论是安全还是效率都会有所提高.尤其是在SQL语句中.一定要把变量放在单引号呢。例如
  21. $db->query("SELECT * FROM {$tablepre}members WHERE uid='$discuz_uid'");
  22. */


  23. @include_once DISCUZ_ROOT.'./forumdata/cache/plugin_apply.php';
  24. @include language('apply');
  25. if(!$discuz_uid) {
  26.         showmessage('not_loggedin','logging.php?action=login');
  27. }


  28. $applys = $apply = '';
  29. $applylist = array();
  30. //注意:记得对变量初始化,这是一个好的习惯,也可以避免安全问题。


  31. $page = !ispage($page) ? 1 : $page;
  32. $start_limit = ($page - 1) * 10;


  33. if($action == 'apply') {                //申请斑竹
  34.     $query = $db->query("SELECT COUNT(appid) FROM {$tablepre}plugin_apply WHERE uid='$discuz_uid'");  //查看申请用户的申请次数
  35.     $applys = $db->result($query,0);                //$db->result($query,0)可以用来取得一个记录值
  36.     if($applys >= $applycount) {                        //判断是否申请次数
  37.             showmessage($language['applys_max'], 'plugin.php?identifier=apply&module=apply');
  38.     } else {
  39.             require_once DISCUZ_ROOT.'./include/forum.func.php';        //包含相关与论坛帖子相关的文件。这里因为下面的forumselect()函数需要用到
  40.             require_once DISCUZ_ROOT.'./forumdata/cache/cache_forums.php';
  41.             $forumselect = "<select name="fid">\n<option value="">  >请选择版块</option><option value=""> </option>".str_replace('%', '%%', forumselect()).'</select>';                //这里是生成下拉采单式的版块选择,你可以看看DZ的操作方式
  42.             include_once DISCUZ_ROOT . './plugins/apply/apply/apply.php';        //到apply目录下用对应的程序来处理申请的过程
  43.     }
  44. } elseif ($action == 'del') {                //这里是删除用户申请的过程
  45.     if(($discuz_uid == $uid || $adminid == 1) && $formhash == FORMHASH) {        //只有用户和管理员才有权限删除
  46.             $db->query("DELETE FROM {$tablepre}plugin_apply WHERE uid='$discuz_uid' AND fid='$fid'");
  47.             showmessage($language['operate_success'], 'plugin.php?identifier=apply&module=apply');
  48.     } else  {
  49.             showmessage($language['operate_invalid']);
  50.     }
  51. } else {
  52.     $action = "view";
  53. $query = $db->query("SELECT * FROM {$tablepre}plugin_apply LIMIT $start_limit,10"); //取得记录,并格式化时间
  54.     while($apply = $db->fetch_array($query)) {
  55.             $apply['dateline'] = gmdate("$dateformat $timeformat", $apply['dateline'] + $timeoffset * 3600);
  56.             $applylist[] = $apply;
  57.     }
  58.     $query = $db->query("SELECT COUNT(*) FROM {$tablepre}plugin_apply");        //分页显示
  59.     $applynum = $db->result($query,0);
  60.     $multipage = multi($applynum, 10, $page, "plugin.php?identifier=apply&module=apply");


  61.     include template('apply');
  62. }
  63. ?>


复制代码


代码改进的说明:(按照代码出现的顺序)
1.将cdb_用{$tablepre}来代替——这样具有更好的通用性,如果表前缀不一样,只要在建表的sql语句修改一下即可。(在apply.php的改进中也是如此)
2.增加了@include language('apply');语句——使用语言包来规定提示信息
3.将$applylist = '';改为$applylist = array();——虽然效果一样,但意义比较明了
4.在showmessage函数中,使用$language['applys_max']这样的语句来从语言包中导入提示信息,并且将原来语句中javascript:history.go(-1)实现返回上级的方式,改成直接在提示信息中包含“返回”字样,从而实现显示回到上一级的方式。(在apply.php的改进中也是如此)
5.对$action == 'del'这段处理代码,有比较多的疑惑:
$discuz_uid == $uid || $admin == 1 && $formhash == FORMHASH
说实话,这里$discuz_uid == $uid有点怪,没有体现它的用处,不过,到后面可以跟模板网页中的传值结合起来用,可以说这是一个加强保险的语句。
这个语句有问题,因为按照运算符的俦顺序它相当于:$discuz_uid == $uid || ($admin == 1 && $formhash == FORMHASH)应改为:($discuz_uid == $uid || $admin == 1) && $formhash == FORMHASH 比较符合逻辑。这个语句中$admin有问题,实际上应该是$adminid,$adminid为1时,该用户就是管理员,所以这里正确应该是:($discuz_uid == $uid || $adminid == 1) && $formhash == FORMHASH
另外,这里应该改进一下,因为从道理上来说管理员应该能删除其他人发的申请,但作为一个范例,为免过于复杂,还是保留原样。
6.$action = "view";——新增这个语句,是与模板结合使用的,意思是如果没有明确的$action动作,那么就将用户带到查看申请的页面。


  接下来是apply.php的代码:



  1. <?php
  2. if(!defined('IN_DISCUZ')) {
  3. exit('ACCESS Diened');
  4. }


  5. $userinfo = '';


  6. $query = $db->query("SELECT posts,$extcredit,regdate FROM {$tablepre}members WHERE uid='$discuz_uid'");
  7. $userinfo = $db->fetch_array($query);
  8. $userinfo['regdate'] = $timestamp - $userinfo['regdate'];
  9. $userinfo['regdate'] = ceil($userinfo['regdate'] / (3600*24));


  10. if(submitcheck('forumsubmit')) {
  11.         if($userinfo['regdate'] < $lowestregdates || $userinfo[$extcredit] < $integral || $userinfo['posts'] < $lowestposts) {
  12.                 showmessage($language['condition_invalid'],'plugin.php?identifier=apply&module=apply&action=apply');
  13.         }
  14.         
  15.         $query = $db->query("SELECT name FROM {$tablepre}forums WHERE fid='$fid'");
  16.         $fname = $db->result($query,0);
  17.         if(empty($fname)){
  18.                 showmessage($language['forum_invalid']);
  19.         } else {
  20.                 $query = $db->query("SELECT COUNT(*) FROM {$tablepre}plugin_apply WHERE uid='$discuz_uid' AND fid='$fid'");
  21.                 if($db->result($query,0)) {
  22.                         showmessage($language['forum_repeat']);
  23.                 }
  24.         }
  25.         
  26.         if(empty($nettime)) {
  27.                 showmessage($language['nettime_invalid']);
  28.         } else {
  29.                 $nettime = intval($nettime);
  30.         }
  31.         
  32.         if(!empty($description) && strlen($description) >= 16) {
  33.                 $description = nl2br(dhtmlspecialchars($description));
  34.         } else {
  35.                 showmessage($language['description_invalid']);
  36.         }
  37.         
  38.         if(!(empty($suggest) && strlen($suggest) >= 16)) {
  39.                 $suggest = nl2br(dhtmlspecialchars($suggest));
  40.         } else {
  41.                 showmessage($language['suggest_invalid']);
  42.         }
  43.         if (!isset($agreeapply)) {
  44.           showmessage($language['$agreeapply_invalid']);
  45.         }
  46.         $db->query("INSERT INTO {$tablepre}plugin_apply (`uid`,`username`,`fid`,`fname`,`suggest`,`description`,`nettime`,`dateline`,`agreeapply`)
  47.                 VALUES ('$discuz_uid','$discuz_user','$fid','$fname','$suggest','$description','$nettime','$timestamp','$agreeapply')");
  48.         showmessage($language['apply_success'],'plugin.php?identifier=apply&module=apply');
  49. }


  50. include template('apply');
  51. ?>


复制代码


代码改进的说明:(按照代码出现的顺序)
1.去掉$total的定义和如下两句代码:
$query = $db->query("SELECT count(uid) FROM cdb_plugin_apply WHERE uid='$discuz_uid'");
$total = $db->result($query,0);
从整个代码来看,这两句代码没什么用处,申请最大次数已经在apply.inc.php中处理了。
2.增加是否同意版主章程的判断($agreeapply)


从整个代码流程来看,觉得有些地方需要改进,列举如下:
1.判断该用户是否已经是所申请的版块的版主了
2.每页显示数目,版主章程(这个是我自己加的^-^)等都可以放到后台插件设置里
3.投票功能——对参加申请的会员进行投票选举。
4.一次同时申请多个版块


  这个教程看起来还没有写完(没有看到adminapply这个模块的编写),看到前面有人要源码和相关文件,我就把我自己做出来(有相关的模板,建表的SQL语句和导出的discuz_plugin_apply.txt插件信息文件)的贡献给大家。这个做的还是比较一般,有不少需要改进的地方,望大家多多指教。
压缩包使用说明:
1.将整个apply文件夹拷贝到bbs目录下的plugins
2.apply\images目录下的图片拷贝到bbs目录下的images\common
3.apply\templates目录下的所有文件拷贝到bbs目录下的templates\default
4.在后台导入apply目录下的discuz_plugin_apply.txt文件,并更新缓存即可使用(如果要直接使用此插件就进行这个步骤)
  插件下载及界面截图:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

iowrww 发表于 2007-2-26 20:53:53 | 显示全部楼层
请问一下,在apply.htm文件中有一个变量$applist是怎么来的,谢谢!
回复

使用道具 举报

oliverdis 发表于 2007-5-17 15:38:33 | 显示全部楼层
目前写得最接近完成的教程,和袍哥的帖子搭配看,很是不错!
回复

使用道具 举报

jeep2007 发表于 2007-5-19 21:44:11 | 显示全部楼层
唉~不要个个高手是搞得虎头蛇尾哪。来来来继续搞定它。
感激!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-16 07:44 , Processed in 0.033512 second(s), 5 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

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