热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

DiscuzX3插件制作菜鸟入门教程

一、开发插件所需资料与工具1、DiscuzX2插件机制http://dev.discuz.org/wiki/#.E6.8F.92.E4.BB.B6.E6.9C.BA.E5.88.B62、语言包编码转换工具convertz【百度一下】(专门用来处理多种编码的插件安装)3、数据库管理工具navicat【百度一下】(方便数据
一、开发插件所需资料与工具
         1、DiscuzX2 插件机制   http://dev.discuz.org/wiki/#.E6.8F.92.E4.BB.B6.E6.9C.BA.E5.88.B6
         2、语言包编码转换工具 convertz  【百度一下】(专门用来处理多种编码的插件安装 )
         3、数据库管理工具 navicat   【百度一下】(方便数据库的查看与操作)
 4、网站的基本数据,这些数据包括:系统常量、全局变量、系统调用 ,首先从系统常量说起
            4.1、系统常量

                  DISCUZ_ROOT     //网站根目录

                  TIMESTAMP          //程序执行的时间戳

                  CHARSET             //程序的语言编码类型

    IS_ROBOT           //是否是机器访问
    FORMHASH          //HASH值
    其余的可直接打印出来查看,如:

require_once './source/class/class_core.php';

$discuz = & discuz_core::instance();

$discuz->init();

print_r(get_defined_constants());

?>

            4.2、全局变量
   直接打印$_G即可得知,如:  

require_once './source/class/class_core.php';

$discuz = & discuz_core::instance();

$discuz->init();

print_r($_G);

?>

            4.3、数据库配置参数
    直接打印$_G['config']['db']即可,如:

require_once './source/class/class_core.php';

$discuz = & discuz_core::instance();

$discuz->init();

print_r($_G['config']['db']);

?>

            4.4、数据库操作
    DB::table()           //增加了pre的数据库表名
    DB::delete()           //删除表中数据
    DB::insert()           //向表中插入数据
    DB::update()           //更新表中数据
    DB::fetch()           //配合DB::query来实现数据资源数据的获取
    DB::query()           //执行一条数据库语句
    DB::fetch_first()  //获取结果集的第一条记录

               更多操作请查看文档:http://dev.discuz.org/wiki/index.php?title=Discuz%E6%95%B0%E6%8D%AE%E5%BA%93%E7%B1%BB

         5、熟悉 ./source/function/function_admincp.php 管理后台文件里的函数,知道具体函数是实现什么功能效果
 6、了解和掌握基础通用的类、函数  http://dev.discuz.org/wiki/#.E5.9F.BA.E7.A1.80.E6.A1.86.E6.9E.B6.E3.80.81.E7.B1.BB.E3.80.81.E5.87.BD.E6.95.B0

       二、安全性处理
          1、文件的安全性
所有与插件有关的程序,包括全部的前后台程序,因全部使用外壳调用,请务必在第一行加入 
   if(!defined('IN_DISCUZ')) {
          exit('Access Denied');
 }
             以免其被 URL 直接请求调用,产生安全问题。

          2、对数值处理
             2.1、 intval();    //处理非负整数 ,如:$uid=intval($uid);
    注意,使用intval后,一定要想一想,自己这个变量是不是应该非负的?如果是的话,得加个判断语句,或者用abs,max等函数处理下
             2.2、 trim();      //去除左右空格, 如:$username=trim($username);
             2.3、 对于文字内容,记得使用htmlspecialchars(dhtmlspecialchars)
             2.4、 写入数据库时的注意事项
要进数据库的变量一定得addslashes(DZ内为daddslashes,如用DZ无须再次过滤,DZ已将所有$_POST和$_GET过滤),当然,如果你进的是数字(比如uid,并且已经intval过),或者是其他一些肯定不会出错的,那么你可以不做这一步。
             2.5、 在写sql语句时,变量一定得记得用’框起来。如果变量是字符串,不这么做会出错。如果是数字不这么做不会提示出错,但是有可能有注入的危险。
             2.6、 数组在运用前记得写$xxx = array();  原因很简单,防止用户提交恶意的值。

          3、语句查询优化
   在写SQL语句是尽量符合SQL规则,语句查询要相应的优化,有先有后;数据表要相应的创建索引,加快查询速度,这里不多说。

       三、实例讲解之插件的前兆
   1、最先清楚需要开发什么功能的插件,插件机制是否能够开发,最后能否达到预期效果,否则一切都免谈了
   2、需要使用什么菜单、什么参数,配置哪些选项、数据结构如何设计、前后台实现哪些功能等等
   3、需要哪些函数,discuz内部是否有这功能的函数,尽量用内部的函数来达到预期效果
   4、最好不要改动discuz原有的布局,宁愿Coty一段代码出来也不要在原有的函数上添加功能,防止以后的升级问题
   5、尽最大能力去开发智能的插件,多用变量代替常量,增强程序的移植性,可维护性

       四、实例讲解之基本配置
   1、安装全新的DiscuzX2
           2、打开 config/config_global.php 文件,在文件结尾添加以下代码开启插件设计者模式

$_config['plugindeveloper'] = 2;   // 1 表示开启插件设计者模式 ; 2 表示开启插件设计者模式且显示前台页面的潜入点

  
   3、更新缓存(为了显示潜入点),刷新前台页面看看就知道什么叫嵌入点了,有嵌入点得地方就可以顺便输出内容,包括源码
 
       五、实例讲解之管理中心
 1、这里以“会员注册后自动送100个金币”为例 (主要传授对数据库的操作)
            2、填写插件最基本信息
  
(注意:提交完后记得在插件目录下建以标识符为名的文件夹,如: ./source/plugin/send_jinbi)
            3、选择插件语言包
   
  

            4、添加插件变量配置
  
   具体可以点最后面的"详细"进入编辑
 5、在插件列表中找到"新注册会员送100个金币"插件并启用

六、实例讲解之页面嵌入
         1、插件页面嵌入-普通版
            

         2、在 ./source/plugin/send_jinbi/ 目录下建立 send_jinbi.class.php 文件,目的为了页面嵌入

if(!defined('IN_DISCUZ')) {

        exit('Access Denied');

}

class plugin_send_jinbi { 

       function global_header() {

            global $_G;

            $sendCOnfig= array();

            $sendCOnfig= $_G['cache']['plugin']['send_jinbi'];  //缓存插件变量值

            if( intval($sendConfig['status']) == 1 ) {  //是否启动插件

                 if( isset($_POST['regsubmit']) ) { //会员注册后

                      $uid = intval($_G['member']['uid']);

                      if( $uid ){

                         $jinbi_num = intval($sendConfig['jinbi_num']);  //送金币数量

              updatemembercount($uid,array("extcredits2" => $jinbi_num)); //更新金币数 (这个是function_core.php的现成函数)

               //这里可以进行任何数据库的操作

                      }

                 }

             }

      }

}

?>

 3、基本上已经完成一大半了,你只要开启插件,然后更新缓存(可靠点),然后到前台去注册一个会员,则会自动送上100金币。
           

       七、实例讲解之安装、卸载及升级
            1、 安装(install.php)、卸载(uninstall.php)程序中可随意设计页面的跳转,只要在插件安装、卸载结束时候输出添加 $finish = TRUE; 即可,脚本中可用 runquery() 函数执行 SQL 语句。

if(!defined('IN_DISCUZ')) {

       exit('Access Denied');

}

/*任意执行代码:开始*/

//..........

//..........

/*任意执行代码:结束*/

$finish = TRUE;

?>

2、升级(upgrade.php)程序中可通过 $fromversion 和 $toversion 变量判断升级的具体版本号,并随意设计页面的跳转,只要在插件升级结束时候输出添加 $finish = TRUE; 即可,脚本中可用 runquery() 函数执行 SQL 语句。

if(!defined('IN_DISCUZ')) {

        exit('Access Denied');

}

/*任意执行代码:开始*/

//..........

//..........

/*任意执行代码:结束*/

$finish = TRUE;

?>

3、其他功能请参考其他插件

八、实例讲解之插件语言包
   1、打开之前所创建的语言包文件(data/plugindata/send_jinbi.lang.php),添加以下代码,红色部分为插件的唯一标识符:
//程序脚本文件的语言包
$scriptlang['send_jinbi'] = array(
     'info' => '程序脚本文件的语言包'
);

//模版文件的语言包
$templatelang['send_jinbi'] = array(
     'info' => '模板文件的语言包'
);

//安装、升级、卸载脚本用的语言包
$installlang['send_jinbi'] = array(
     'info' => '安装、升级、卸载脚本用的语言包'
);
?> 

2、调用语言包
模版中调用模板文件语言包,通过 {lang send_jinbi:info} 方式调用。 
程序脚本中调用脚本文件语言包,通过 lang('plugin/send_jinbi', 'info') 方式调用。 
安装脚本中调用安装脚本文件语言包,通过 $installlang 变量直接获取。如 $installlang['info']。 

          3、语言包的导出
 
 导出后的语言包是:discuz_plugin_send_jinbi.xml
 接下来我们用编码转换工具 convertz  对discuz_plugin_send_jinbi.xml 分别转为:
 discuz_plugin_send_jinbi_SC_GBK.xml(简体中文GBK)
 discuz_plugin_send_jinbi_SC_UTF8.xml(简体中文UTF8)
 discuz_plugin_send_jinbi_TC_BIG5.xml(繁体中文BIG5)
 discuz_plugin_send_jinbi_TC_UTF8.xml(繁体中文UTF8)
 把这四个文件放到该插件 ./source/plugin/send_jinbi/  目录下

           4、安装时的效果图:
 

       九、实例讲解之增加页面功能           

           1、在原有的页面上添加功能(这里以 注册 页面为例)
 

           2、在之前那个 ./source/plugin/send_jinbi/send_jinbi.class.php 的最后添加以下代码:
class plugin_send_jinbi_member extends plugin_send_jinbi {//类名称plugin_send_jinbi_member 最后面的 member 应该是相应的模块名称吧!具体本人不怎么清楚,还望高人指点!总之它是会改变的,如果是论坛,则是 forum
        function register_input() {  //函数名称其实就是前台页面嵌入点的名称
$lang = lang('plugin/send_jinbi');  //获取此插件的语言包
$bind = "".$lang['info']."";  //调用语言包显示
return $bind;
        }
}
   3、更新下缓存,再到前台注册页面看看效果
   


推荐阅读
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • PHP 编程疑难解析与知识点汇总
    本文详细解答了 PHP 编程中的常见问题,并提供了丰富的代码示例和解决方案,帮助开发者更好地理解和应用 PHP 知识。 ... [详细]
  • 深入理解OAuth认证机制
    本文介绍了OAuth认证协议的核心概念及其工作原理。OAuth是一种开放标准,旨在为第三方应用提供安全的用户资源访问授权,同时确保用户的账户信息(如用户名和密码)不会暴露给第三方。 ... [详细]
  • 本文详细分析了JSP(JavaServer Pages)技术的主要优点和缺点,帮助开发者更好地理解其适用场景及潜在挑战。JSP作为一种服务器端技术,广泛应用于Web开发中。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 在计算机技术的学习道路上,51CTO学院以其专业性和专注度给我留下了深刻印象。从2012年接触计算机到2014年开始系统学习网络技术和安全领域,51CTO学院始终是我信赖的学习平台。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • PHP 5.2.5 安装与配置指南
    本文详细介绍了 PHP 5.2.5 的安装和配置步骤,帮助开发者解决常见的环境配置问题,特别是上传图片时遇到的错误。通过本教程,您可以顺利搭建并优化 PHP 运行环境。 ... [详细]
  • QUIC协议:快速UDP互联网连接
    QUIC(Quick UDP Internet Connections)是谷歌开发的一种旨在提高网络性能和安全性的传输层协议。它基于UDP,并结合了TLS级别的安全性,提供了更高效、更可靠的互联网通信方式。 ... [详细]
  • 本文详细介绍了如何使用PHP检测AJAX请求,通过分析预定义服务器变量来判断请求是否来自XMLHttpRequest。此方法简单实用,适用于各种Web开发场景。 ... [详细]
  • Linux 系统启动故障排除指南:MBR 和 GRUB 问题
    本文详细介绍了 Linux 系统启动过程中常见的 MBR 扇区和 GRUB 引导程序故障及其解决方案,涵盖从备份、模拟故障到恢复的具体步骤。 ... [详细]
  • 本文总结了汇编语言中第五至第八章的关键知识点,涵盖间接寻址、指令格式、安全编程空间、逻辑运算指令及数据重复定义等内容。通过详细解析这些内容,帮助读者更好地理解和应用汇编语言的高级特性。 ... [详细]
  • 本文介绍了如何使用jQuery根据元素的类型(如复选框)和标签名(如段落)来获取DOM对象。这有助于更高效地操作网页中的特定元素。 ... [详细]
  • 使用C#开发SQL Server存储过程的指南
    本文介绍如何利用C#在SQL Server中创建存储过程,涵盖背景、步骤和应用场景,旨在帮助开发者更好地理解和应用这一技术。 ... [详细]
author-avatar
咸菜地瓜的丽质人生知_467
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有