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

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

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

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

  1、插件开发步骤:架构

  一、下载插件开发工具并建立插件:函数

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

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

  建立完成之后能够经过设计脚本,导出插件包。开发工具

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

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

  开启开发者模式,在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不熟悉的同窗这将是一个巨大的坑。至此特殊主题的骨架能够说已经搭建好了,那么怎样才能够发帖呢?这个地方找了好久才知道是什么缘由,最后发现是权限的问题。

  三、设置板块权限

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

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

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

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

  2、我范的愚蠢错误?仍是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是程序猿的宿命。

  3、问题的反思

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

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

  二、难道不一样插件相同的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

相关文章
相关标签/搜索