discuz特殊主题插件开发步骤和犯的愚蠢错误

  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的具体代码

<?php
/**
 *    [gfpaimai(gfpaimai.{modulename})] (C)2015-2099 Powered by 版权所有.
 *    Version: 1.0.0
 *    Date: 2015-7-11 10:05
 */

if(!defined(‘IN_DISCUZ‘)) {
    exit(‘Access Denied‘);
}
class plugin_gfpaimai {
    //TODO - Insert your code here

}

class threadplugin_gfpaimai {

    public $name = ‘XX主题‘;            //主题类型名称
    public $iconfile = ‘icon.gif‘;    //发布主题链接中的前缀图标
    public $buttontext = ‘发布xx主题‘;    //发帖时按钮文字

    /**
     * 发主题时页面新增的表单项目
     * @param Integer $fid: 版块ID
     * @return string 通过 return 返回即可输出到发帖页面中
     */
    public function newthread($fid) {
        //TODO - Insert your code here

        return ‘TODO:newthread‘;
    }

    /**
     * 主题发布前的数据判断
     * @param Integer $fid: 版块ID
     */
    public function newthread_submit($fid) {
        //TODO - Insert your code here

    }

    /**
     * 主题发布后的数据处理
     * @param Integer $fid: 版块ID
     * @param Integer $tid: 当前帖子ID
     */
    public function newthread_submit_end($fid, $tid) {
        //TODO - Insert your code here

    }

    /**
     * 编辑主题时页面新增的表单项目
     * @param Integer $fid: 版块ID
     * @param Integer $tid: 当前帖子ID
     * @return string 通过 return 返回即可输出到编辑主题页面中
     */
    public function editpost($fid, $tid) {
        //TODO - Insert your code here

        return ‘TODO:editpost‘;
    }

    /**
     * 主题编辑前的数据判断
     * @param Integer $fid: 版块ID
     * @param Integer $tid: 当前帖子ID
     */
    public function editpost_submit($fid, $tid) {
        //TODO - Insert your code here

    }

    /**
     * 主题编辑后的数据处理
     * @param Integer $fid: 版块ID
     * @param Integer $tid: 当前帖子ID
     */
    public function editpost_submit_end($fid, $tid) {
        //TODO - Insert your code here

    }

    /**
     * 回帖后的数据处理
     * @param Integer $fid: 版块ID
     * @param Integer $tid: 当前帖子ID
     */
    public function newreply_submit_end($fid, $tid) {
        //TODO - Insert your code here

    }

    /**
     * 查看主题时页面新增的内容
     * @param Integer $tid: 当前帖子ID
     * @return string 通过 return 返回即可输出到主题首贴页面中
     */
    public function viewthread($tid) {
        //TODO - Insert your code here

        return ‘TODO:viewthread‘;
    }
}

?>

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

  3、设置板块权限

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

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

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

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

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

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

    public function newthread($fid) {
        //TODO - Insert your code here

        include template("gfpaimai:newthread");
        //return ‘TODO:newthread‘;
        return $return;
    }

  修改验证函数

    public function newthread_submit($fid) {
        //TODO - Insert your code here

        $message=getgpc(‘message‘);
        //对内容判断
        if( empty($message) || strlen($message)<15  ) {
            showmessage("对不起,请填写交易内容和具体要求,不少于15字!");
        }
    }

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

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

include template("gfpaimai:newthread");

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

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

<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

时间: 2024-08-03 22:39:41

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

神箭手Discuz发布插件安装步骤

Discuz发布插件安装步骤 强烈建议在安装前加入神箭手官方Discuz云采集 QQ群:157430999.我们会及时解答您的疑问. 1.  两种方式获取神箭手插件(Discuz插件版本有两个版本:utf8和gbk) a)   从Discuz应用中心官网获取:http://addon.discuz.com/[email protected] b)   其他渠道下载插件 2.  安装插件步骤: a)  如从Discuz应用中心官网获取,请正常安装并修改配置config: 找到网站根目录下的conf

java继承会犯的小错误

注意事项:阅读本文前应该先了解java的继承.本文定位为已经继承基础知识. 一:试图覆盖私有方法 先上代码 1 public class Father { 2 3 private void print() { 4 System.out.println("private print"); 5 } 6 7 public static void main(String[] args) { 8 Father father = new Son(); 9 father.print(); 10 }

否定中医者多犯这个根本错误

否定中医者多犯这个根本错误 拿西方现代科学体系来评价所有的事物,包括中医.这是对西方现代科学体系的迷信. 无论是中医还是西医,都是为了解决人类健康问题.就像2个娃娃在妈妈面前,不是说娃娃A说娃娃B的做派不符合娃娃A,那你娃娃B就完全错了.而是在问题妈妈面前,谁能解决问题,谁即是可取. 无论是中医还是西医,都有其长短.拿亲身的经历举个中医行,西医不行的例子:本人由一次感冒引发肺炎,经西医抗生素治疗,病征消失大半,但咳嗽一直不得好转.西医对此解释是"炎症引起气道高反应",从而刺激咳嗽回路因

web开发易犯的低级错误

web开发过程中,我们经常会犯一些小错误,但是却浪费了大量的时间,这里总结几个错误,以示警醒. 1.调试js的时候,明明设置了断点,但是就是不走断点.期初遇到这个问题,我不停的修改js代码,修改网页的html,不停的刷新浏览器,以为缓存的问题.结果后来发现,是因为有多出引入js,当我设置了一个断点,而程序走的却是其他的js,这个问题如果发现了,就根本不是问题,但是如果没发现,就要浪费你很长的时间咯. 2.提交表单,有的field的值却没有传递到后台.明明写了name属性啊,明明其他的field都

再聪明,你也会常犯的数据分析错误 &nbsp;

如果你不了解大数据,你就不会明白大数据的核心价值有多大.当然你不光要了解大数据,还要学会科学的数据分析方法,才能让大数据产生价值.而在数据分析过程中,聪明的数据分析师也会常犯些错误,纽带线CRM小编跟大家分享这些常犯的错误,在以后应用过程中尽量避免. 错把相关性当成因果性  correlation vs. causation 经典的冰淇凌销量和游泳溺水人数成正比的数据,这并不能说明冰淇凌销量的增加会导致更多的人溺水,而只能说明二者相关,比如因为天热所以二者数量都增加了.这个例子比较明显,说起来可

我(作为一名开发者)所犯过的错误[转]

投递人 itwriter 发布于 2016-11-10 17:49 评论(6) 有657人阅读 原文链接 [收藏] ? ? 英文原文:Mistakes I made (as a developer) 我 2006 年开始工作,至今已经 10 年.10 年是个里程碑,我开始回顾自己曾经犯过的错误,以及我希望从同行那里得到什么类型的忠告.一切都在快速改变,10 年了,我不能确定这些秘诀是否还有用. 不管您是新人还是老手,您都会发现我的话是有用的.我期待听到您的观点,所以请不吝赐教给我回信. 坚持使用

Python程序员最常犯的十个错误

不管是在学习还是工作过程中,人都会犯错.虽然Python的语法简单.灵活,但也一样存在一些不小的坑,一不小心,初学者和资深Python程序员都有可能会栽跟头.本文是Toptal网站的程序员梳理的10大常见错误,非常有参考意义.大家在开发过程中需要格外注意.译文中如有理解错误的地方,可以在网站留言或通过微信公众号编程派回复. 常见错误1:错误地将表达式作为函数的默认参数 在Python中,我们可以为函数的某个参数设置默认值,使该参数成为可选参数.虽然这是一个很好的语言特性,但是当默认值是可变类型时

SQLSERVER DBA容易犯的十个错误

SQLSERVER DBA容易犯的十个错误 翻译自:http://sqlsentry.tv/top-10-administrative-mistakes-on-sql-server/ 除了排名前十的错误之外,其他排名靠前的错误 抛开SQL Server方面的错误,这些错误主要体现在开发或者是设计的时候: 1.不合理的规范和不合理的数据库设计 2.没有设计好可伸缩性的需求 3.没有数据库性能基线或基准 4.索引的问题 5.对语句调优不够重视 错误倒数第十位(磁盘-只要磁盘空间充足就不理会磁盘IO了

JavaScript中易犯的小错误-------常见错误五:低效的DOM操作

JavaScript中易犯的小错误-------常见错误五:低效的DOM操作js中的DOM基本操作非常简单,但是如何能有效地进行这些操作一直是一个难题.这其中最典型的问题便是批量增加DOM元素.增加一个DOM元素是一步花费很大的操作.而批量增加对系统的花销更是不菲.一个比较好的批量增加的办法便是使用 document fragments :var div = document.getElementsByTagName("my_div");var fragment = document.