discuz作为国内流行的论坛系统,可谓造福了不少趣味相投的网友们。它让天南地北、国内外有着共同兴趣爱好的人们聚集在一起,分享彼此的喜怒哀乐、心得体会。然而作为discuz的使用者之一,还是个码农,然而对discuz的系统架构和二次开发了解得并不多。前段时间有个朋友找到我说能不能帮忙开发一个特殊主题插件,虽然自己没开发过discuz的插件,但就discuz的流行程度而言,相信开发资料和开发群体应该不少,于是就答应了。

  开发之前网上搜索了一通资料,找到discuz官方二次开发文档看了看,然后又找来一些其它插件参考了下,于是就开干了。由于开发的是一个特殊主题的插件,因此参考官方的开发文档http://faq.comsenz.com/library/plug/plugin/plugin_specialthread.htm,并利用discuz官方提供的开发工具生成了个简单的插件(插件开发工具可在此下载:http://addon.discuz.com/resource/develop.zip)。

  我们看看怎么开发一个特殊主题的插件吧,要是想直接看我犯了哪样的愚蠢错误,你可以直接拉到文章的末尾。

  一、插件开发步骤:

  1、下载插件开发工具并创建插件:

  插件开发工具下载并解压至web根目录。然后通过http://你的域名/develop.php访问插件开发工具,我的是http://127.0.0.1:8080/develop.php。点击“创建新插件”,然后一步步根据提示填写即可。

  此处,你还可以检测插件前缀是否被占用,方便后续发布到插件市场。编辑脚本这一步填写自身的特殊脚本名称即可。

  创建完成以后可以通过设计脚本,导出插件包。

  这样就已经将一个插件的原型都生成了,将它拷贝到/source/plugin/目录并解压。

  2、开启开发者模式并设置特殊主题

  开启开发者模式,在config/config_global.php 后边填一行$_config['plugindeveloper'] = 1;值为1表示开启开发者模式,为2则表示同时开启潜入点提示。填写完成之后刷新后台管理界面,依次找到应用-->插件-->找到刚刚创建的插件并点击设计,即可编辑刚刚创建的插件脚本了。这里仍然需要设置一下特殊主题。

  程序模块名称为前面插件创建时填写的名称。我们可以看看gfpaimai.class.php的具体代码

  1. <?php
  2. /**
  3. * [gfpaimai(gfpaimai.{modulename})] (C)2015-2099 Powered by 版权所有.
  4. * Version: 1.0.0
  5. * Date: 2015-7-11 10:05
  6. */
  7.  
  8. if(!defined('IN_DISCUZ')) {
  9. exit('Access Denied');
  10. }
  11. class plugin_gfpaimai {
  12. //TODO - Insert your code here
  13.  
  14. }
  15.  
  16. class threadplugin_gfpaimai {
  17.  
  18. public $name = 'XX主题'; //主题类型名称
  19. public $iconfile = 'icon.gif'; //发布主题链接中的前缀图标
  20. public $buttontext = '发布xx主题'; //发帖时按钮文字
  21.  
  22. /**
  23. * 发主题时页面新增的表单项目
  24. * @param Integer $fid: 版块ID
  25. * @return string 通过 return 返回即可输出到发帖页面中
  26. */
  27. public function newthread($fid) {
  28. //TODO - Insert your code here
  29.  
  30. return 'TODO:newthread';
  31. }
  32.  
  33. /**
  34. * 主题发布前的数据判断
  35. * @param Integer $fid: 版块ID
  36. */
  37. public function newthread_submit($fid) {
  38. //TODO - Insert your code here
  39.  
  40. }
  41.  
  42. /**
  43. * 主题发布后的数据处理
  44. * @param Integer $fid: 版块ID
  45. * @param Integer $tid: 当前帖子ID
  46. */
  47. public function newthread_submit_end($fid, $tid) {
  48. //TODO - Insert your code here
  49.  
  50. }
  51.  
  52. /**
  53. * 编辑主题时页面新增的表单项目
  54. * @param Integer $fid: 版块ID
  55. * @param Integer $tid: 当前帖子ID
  56. * @return string 通过 return 返回即可输出到编辑主题页面中
  57. */
  58. public function editpost($fid, $tid) {
  59. //TODO - Insert your code here
  60.  
  61. return 'TODO:editpost';
  62. }
  63.  
  64. /**
  65. * 主题编辑前的数据判断
  66. * @param Integer $fid: 版块ID
  67. * @param Integer $tid: 当前帖子ID
  68. */
  69. public function editpost_submit($fid, $tid) {
  70. //TODO - Insert your code here
  71.  
  72. }
  73.  
  74. /**
  75. * 主题编辑后的数据处理
  76. * @param Integer $fid: 版块ID
  77. * @param Integer $tid: 当前帖子ID
  78. */
  79. public function editpost_submit_end($fid, $tid) {
  80. //TODO - Insert your code here
  81.  
  82. }
  83.  
  84. /**
  85. * 回帖后的数据处理
  86. * @param Integer $fid: 版块ID
  87. * @param Integer $tid: 当前帖子ID
  88. */
  89. public function newreply_submit_end($fid, $tid) {
  90. //TODO - Insert your code here
  91.  
  92. }
  93.  
  94. /**
  95. * 查看主题时页面新增的内容
  96. * @param Integer $tid: 当前帖子ID
  97. * @return string 通过 return 返回即可输出到主题首贴页面中
  98. */
  99. public function viewthread($tid) {
  100. //TODO - Insert your code here
  101.  
  102. return 'TODO:viewthread';
  103. }
  104. }
  105.  
  106. ?>

  这样可以清晰地看到哪个函数是干什么用的,我们只需要将业务逻辑处理好即可。然而现实总是残酷的,对于discuz不熟悉的同学这将是一个巨大的坑。至此特殊主题的骨架可以说已经搭建好了,那么怎样才可以发帖呢?这个地方找了很久才知道是什么原因,最后发现是权限的问题。

  3、设置板块权限

  论坛-->板块管理,找到对应的板块-->编辑-->帖子选项、权限相关

  4、设置用户组和管理组权限

  用户-->用户组(管理组)-->选择需要编辑的用户组-->批量编辑-->勾选可以发布特殊主题的用户组

  至此,没什么意外的话,就可以发帖了;相信大部分开发者到这一步也可以发帖了。可是偷懒的我,必然要为这个偷懒付出代价的。

  二、我范的愚蠢错误?还是discuz本身的bug呢?

  上诉步骤完成以后,为了快速地看看效果。直接从别的插件里面复制了一个模板newthread.htm到template目录下,然后修改了gfpaimai.class.php的newthread函数,让其加载自定义模板。

  1. public function newthread($fid) {
  2. //TODO - Insert your code here
  3.  
  4. include template("gfpaimai:newthread");
  5. //return 'TODO:newthread';
  6. return $return;
  7. }

  修改验证函数

  1. public function newthread_submit($fid) {
  2. //TODO - Insert your code here
  3.  
  4. $message=getgpc('message');
  5. //对内容判断
  6. if( empty($message) || strlen($message)<15 ) {
  7. showmessage("对不起,请填写交易内容和具体要求,不少于15字!");
  8. }
  9. }

  此时,无论我编辑框里面输入多少个字符都显示,"对不起,请填写交易内容和具体要求,不少于15字!"。用var_dump($message)查看,message确实为空,$_GET的结果也为空。无论我怎么测试都是如此,对比了下其它插件,发现他们也都是这么写的。我就郁闷了,怎么会有这样的问题出来呢?难道又是权限问题?可是检查了一遍又一遍,没发现哪里有问题。这么来回不知道折腾了多少回,实在没辙,加几个Q群请教请教这方面的老大吧。加了几个群,大多都没人回。后来一个discuz插件开发群的老大“风子”的指点下找到了问题所在。

  去掉自定义模板查看是否可以获取message的内容,也就是去掉newthread函数的

  1. include template("gfpaimai:newthread");

  测试发现可以获取到message的内容,瞬间千万个草泥马在奔腾。

  好了,既然知道是自定义模板的问题。那么接下来看看是模板什么地方导致无法获取message吧。于是一段段代码去掉,最后的最后。你们也想到了的,它出现了。你可以想象下我当时的表情,欲哭无泪以外便是千万个草泥马在奔腾。最后居然是一个hidden名称导致的,代码如下。

  1. <input type="hidden" name="tradeflag" id="tradeflag" value="1"/>

  于是删掉,再次测试。尼玛的,果然出来了。于是改个名字再次测试,尼玛的,还是出来了。看到这,你有什么感受?反正我是欲哭无泪了,看来解决bug和产生新的bug是程序猿的宿命。

  三、问题的反思

  问题解决了,好吧,接下来反思下为什么会这样呢?

  1、万恶的习惯,复制的代码,偷懒不得呀!越是想偷懒,越是花更多的时间来调试。

  2、难道不同插件相同的name会导致其中一个用不了?如果是这样,为什么其他的相同又没事,偏偏就这个name为tradeflag的hidden值就如此呢?搞不懂,tell me why?不知道有没有哪位碰到过这样的问题,如果知道是什么原因不妨告诉我(又在偷懒了。。。。)。

  

  参考资料:

    http://faq.comsenz.com/library/plug/plugin/plugin_specialthread.htm

    http://www.discuz.1314study.com/t/78913.html

discuz特殊主题插件开发步骤和犯的愚蠢错误的更多相关文章

  1. IntelliJ IDEA安装主题详细步骤

    主题下载网址:http://color-themes.com/?view=index 本文测试的软件版本:IntelliJ IDEA 2016.1.2 一.下载主题包   1 1. 打开上述网址(ht ...

  2. DedeCms如何调用Discuz论坛主题等数据方法总结

    DedeCms如何调用Discuz论坛主题等数据方法总结 同时使用Dedecms和Discuz论坛的朋友,难免要在网站内调用论坛的内容.使用Discuz论坛的JS调用方式,对搜索引擎不够友好,下面我们 ...

  3. 【转载学习前辈的经验】-- Mistakes I made (as a developer) 我(作为一名开发者)所犯过的错误

    我 2006 年开始工作,至今已经 10 年.10 年是个里程碑,我开始回顾自己曾经犯过的错误,以及我希望从同行那里得到什么类型的忠告.一切都在快速改变,10 年了,我不能确定这些秘诀是否还有用. 不 ...

  4. SQLSERVER DBA容易犯的十个错误

    SQLSERVER DBA容易犯的十个错误 翻译自:http://sqlsentry.tv/top-10-administrative-mistakes-on-sql-server/ 除了排名前十的错 ...

  5. PHP开发者常犯的MySQL错误

    PHP开发者常犯的MySQL错误   数据库是WEB大多数应用开发的基础.如果你是用PHP,那么大多数据库用的是MYSQL也是LAMP架构的重要部分. PHP看起来很简单,一个初学者也可以几个小时内就 ...

  6. SharePoint2010 部署步骤“激活功能”中出现错误:无法启动计算机“PCName”上的服务SPUserCodeV4

    在SharePoint2010开发中,选择部署类型为“部署为沙盒解决方案”,在部署代码是出现如下错误提示: 部署步骤“激活功能”中出现错误:无法启动计算机“PCName”上的服务SPUserCodeV ...

  7. 关于JDBC学习过程中的注意事项(分享自己犯过的错误,写给初学JDBC的小伙伴的八条建议)

    关于JDBC学习过程中的注意事项(分享自己犯过的错误,写给初学JDBC的小伙伴的八条建议) 前言:最近在学习JDBC,总结了几个小问题,特地分享给大家,让大家不要犯这样的错误,也希望大家养成学会总结的 ...

  8. Socket编程, 在server端read()函数调用后显示错误:Transport endpoint is not connected (犯了低级错误)

    for(;;){ socklen_t len = sizeof(client_address); connfd = accept(listenfd, (struct sockaddr *)&c ...

  9. Verilog与SystemVerilog编程陷阱:怎样避免101个常犯的编码错误

    这篇是计算机类的优质预售推荐>>>><Verilog与SystemVerilog编程陷阱:怎样避免101个常犯的编码错误> 编辑推荐 纠错式学习,从"陷阱 ...

随机推荐

  1. Jquery-控制table的奇偶数色列

    css代码 <style> .even{background:#FFF38F;} .odd{background:#FFFFEE;} .selected{background:#FF990 ...

  2. 【POJ 2243】Knight Moves

    题 Description A friend of you is doing research on the Traveling Knight Problem (TKP) where you are ...

  3. “面向对象"和"面向过程"到底有什么区别?

    链接:http://www.zhihu.com/question/27468564/answer/101951302 当软件还非常简单的时候,我们只需要面向过程编程: 定义函数函数一函数二函数三函数四 ...

  4. 从注册流程 分析如何安全退出多个Activity 多种方式(附DEMO)

      退出Activity注册Android遍历   目录(?)[+] 前言 知识结构 具体方案 方案1 方法采用FLAG_ACTIVITY_CLEAR_TOP退出整个程序多activity 方案2 方 ...

  5. httpd设置HTTPS双向认证

    去年用tomcat.jboss配置过HTTPS双向认证,那时候主要用的是JDK自带的keytool工具.这次是用httpd + openssl,区别比较大 在网上搜索了很多文章,发现全面介绍的不多,或 ...

  6. spring事务学习(转账案例)(二)

    四.通过springAop进行事务管理 继续从第一个无事务操作的项目中进行更改. 只修改applicationContext.xml配置文件,注意设置transaction引用 <?xml ve ...

  7. Chord算法

    转自:http://blog.csdn.net/wangxiaoqin00007/article/details/7374833 虽然网上搜索CHord,一搜一大堆,但大多讲得不太清楚明白.今天发现一 ...

  8. 我对 impress.js 源码的理解

    源码看了两天,删掉了一些优化,和对 ipad 的支持,仅研究了其核心功能的实现,作以下记录. HTML 结构如下: <!doctype html> <html lang=" ...

  9. 失落的C语言结构体封装艺术

    Eric S. Raymond <esr@thyrsus.com> 目录 1. 谁该阅读这篇文章 2. 我为什么写这篇文章 3.对齐要求 4.填充 5.结构体对齐及填充 6.结构体重排序 ...

  10. Object、Function、String、Array原生对象扩展方法

    JavaScript原生对象的api有些情况下使用并不方便,考虑扩展基于Object.Function.String.Array扩展,参考了prototype.js的部分实现,做了提取和修改,分享下: ...