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-11-03 12:52:46

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

掌握IT游戏规则 CIO勿犯十个愚蠢错误

信息化工作如此紧张,不容许CIO们犯任何愚蠢的错误,如果能将那些老练的CIO们的思想和智慧以及失败的教训加以总结,将可以避免很多CIO被淘汰出局的命运. 1.只呆在公司里让你的助理以先来先服务的原则安排你的时间,使得你每半个小时就要去和你的直接主管或是供应商开会.尽管心底有微弱的声音在升起:"你应该把主要时间花在客户和一线业务人员身上."但你已无暇理会,于是就把这些事情全权委托给你的手下. 2.讲究战略,而不是战术对管理高层们所说的"我们要的是能够领导我们进行业务变革的CIO

浅析网站改版期间我们容易犯的SEO错误

对于我们每个SEOer来说都必须经历的过程就是网站的改版,本文将介绍一些常见在改版网站时容易犯的SEO错误以及我们如何避免它们. 以下是我们常见的网站改版的内容的一部分: 更改web发布软件,例如你可能使用Blogger替换Wordpress. 改变你的URL地址,比如你的网站在URL使用查询字符串(?/ example.php ID = 9),你可能会会改变它们,使他们变短对搜索引擎更加的友好. 改变你的网站的外观和感觉,这涉及到改变网站的主题和布局. 改变域名,你的团队可能因为市场营销或者品

初创型团队容易在用户体验方面犯的十个错误

中介交易 SEO诊断 淘宝客 云主机 技术大厅 "怎样才能提升我的网站(或应用)的用户体验?" 这是一个即常见又没有标准答案的问题.特别是对于初创型团队及产品来说,这个问题所涉及到的影响因素更是多种多样.幸好,有一些实践准则可以帮助我们朝着正确的方向前进.在本文中,我们将了解一下初创团队在塑造产品体验的过程中有可能犯下的错误,以及怎样避免这些问题的发生. 为什么初创型团队要特别关注用户体验 良好的用户体验可以增加用户的满意度,提升产品自身的质量及形象气质,进而推动你的业务更好的向前发展

SEO易犯的十八种错误集锦

最近在网上泡了很长时间,阅读了大量有关SEO的文章,感觉受益匪浅.对于SEO的错误方法,网上也应有很多相关介绍,今天老徐就把众多高手的经验总结一下,方便新手学习.不管你是一位网站管理员或者一位SEO从业者,相信下边所列举的各种SEO易犯的错误,您都有涉及一二,如果感觉本文有价值,欢迎搜藏,如果认为本文是画蛇添足,也请不要拍板,这都是各位资深老师们的经验,拍本文您拍的不是老徐,是大家: 一:建站初期匆忙间就提交给搜索引擎收录.其实这样很不好,因为您的新站才建成肯定有很多地方需要改动,而这个时候又很

分享站长seo优化过程中容易犯的细节错误

互联网进入人们生活后,网络营销已经成为企业主要的营销方式,seo优化的技术也被各大企业所重视,鉴于搜索引擎算法的不断更新,站长们在优化过程中可能会犯一些细节错误,笔者给大家总结了些常见的seo优化错误,分享给大家共同学习,也欢迎大家补充交流. 一.百度快照不代表关键词排名 百度快照是百度蜘蛛对当前页面抓取返回的存档,很多站长的优化观点中存在:快照日期越新,网站权重值越高,关键词排名越好,反之越低.事实可证明肯定的说,快照与排名关系不大,网站快照的更新频率与权重并不存在任何直接的关系. 二.黑帽s

在进行关键词分析时人们最容易犯的五大错误

关键词研究往往在SEO领域没有得到正确的认识.我已经写过几篇有关关键词研究的文章并将它发表在了SEOmoz上,并且我相信它将来肯定会成为指导一场成功的SEO运动的内容.这些是我在进行关键词研究时发现的人们经常犯的一些常见错误. 错误1 -你没有实事求是  "最好是有一个大的小馅饼而不是只有一个大馅饼的一小块儿." 关键字的研究似乎是一个很简单的任务.你使用关键词搜索工具并且找到了那些搜索量巨大且和你网站相关性较高的关键词.可悲的是,如果你想看真实的结果的话就不要这么做.  对于很多企业

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

常见错误1:错误地将表达式作为函数的默认参数 在Python中,我们可以为函数的某个参数设置默认值,使该参数成为可选参数.虽然这是一个很好的语言特性,但是当默认值是可变类型时,也会导致一些令人困惑的情况.我们来看看下面这个Python函数定义: >>> def foo(bar=[]):        # bar是可选参数,如果没有提供bar的值,则默认为[],  ...    bar.append("baz")    # 但是稍后我们会看到这行代码会出现问题.  ..

年轻求职者在面试时不应该犯的十个错误

曾经有一位年轻的求职者,参加面试迟到15分钟,不仅没能向面试官道歉,还问有没有垃圾桶要扔掉他的口香糖.还有一位20多岁的求职者,在和招聘经理电话沟通到一半的时候突然掉线.这位女士过了两个小时才回电话,只是解释,她在剪指甲的时候不小心把手机掉到了一盆水里,却没有表达出丝毫歉意.还有一位求职者的母亲,在得知自己的儿子实习结束后并未转正,要求知道原因. 59岁的达尼·特克汀·科普利克(Dani Ticktin Koplik)是新泽西州恩格尔伍德的一位高管兼绩效辅导教练,在她这里,类似的案例数不胜数.在

Coverity谈“开发中测试”与程序员最常犯的编码错误

Coverity公司位于美国加州旧金山,他们的产品包括Coverity Integrity Control.Coverity Static Analysis等一系列代码分析工具与解决方案.日前,Coverity公司产品副总Ezi Boteach先生就"开发中测试".代码复查和开发人员最常犯的编码错误接受了采访. 问题:能否介绍下Coverity的"开发中测试"理念和你们的Development Testing Platform? Ezi:"开发中测试&qu