Discuz!X2.5 插件制作教程

 

欢迎您浏览本网页,为满足站长在遇到插件的问题以及在一些插件的需求上,这个系列的插件制作教程就是特别为您准备的。本人做了一段时间的插件,希望我写的内容对你有用~当然,我不是DX的研发人员,我只是DX的爱好者。    相信对DX的安装和使用大家都已经有了初步的了解,本内容假定您已经具备如下技能:

1. 您的网站或者测试站点可以正常使用

2. 您对PHP有基本的了解

3. 您对数据库有着基本的了解

 

一旦您满足了上面的要求,那么您可以来了解DX的插件制作了。


网站的基本数据
DX的这个框架中,我们会经常用到一些使用的数据,这些数据包括:系统常量、全局变量、系统调用 ,首先我们从系统常量说起

 

系统常量
DX
里面对一些常量做了自己的定义,接下来的表格列举了,更多的变量可以使用附录里的代码获得。

常量名

说明

DISCUZ_ROOT

网站的根目录

TIMESTAMP

程序执行的时间戳

CHARSET

程序的语言编码类型

IS_ROBOT

是否是机器访问

FORMHASH

HASH

 

全局变量
DX
的全局变量事实上全部压缩到了一个变量:$_G里面,接下来的表格列举了常用的$_G数据内部的变量,更多的变量可以使用附录里的代码获得。

变量名

说明

uid

用户UID

username

用户名

groupid

用户组ID

clientip

用户IP地址

charset

语言编码

siteurl

网站地址

config

网站基本配置,这是一个数组

setting

网站基本设置,这是一个数组


    系统调用    系统调用里面,恐怕最重要的调用要数DB这个静态对象了。这是一个数据库的静态对象,对其的使用也是经常用到的,其方法包括:

变量名

说明

DB::table()

增加了pre的数据库表名

DB::delete()

删除表中数据

DB::insert()

向表中插入数据

DB::update()

更新表中数据

DB::fetch()

配合DB::query来实现数据资源数据的获取

DB::query()

执行一条数据库语句

DB::fetch_first()

获取结果集的第一条记录

    另外,系统的一些其它的系统调用,包括:获取用户信息、插入帖子等内容,都可以在:souce/function/ 文件夹下找到对应的文件来查看。    好了,经常用到的数据内容就在上面的列表里面了,附录提供了一些查看全部内容的代码!下一篇将会介绍如何编写 管理中心 插件!
附录:
    1. 查看全部常量:

1.       [indent]<?php[/indent][indent]require_once './source/class/class_core.php';[/indent][indent]require_once './source/function/function_home.php';[/indent][indent]$discuz = & discuz_core::instance();[/indent][indent]$discuz->init();[/indent][indent]print_r(get_defined_constants());[/indent][indent]?>[/indent]

 

2. 查看$_G变量中内容

1.       [indent]<?php[/indent][indent]require_once './source/class/class_core.php';[/indent][indent]require_once './source/function/function_home.php';[/indent][indent]$discuz = & discuz_core::instance();[/indent][indent]$discuz->init();[/indent][indent]print_r($_G);[/indent][indent]?>[/indent]

 

 

 

这次我们要来制作一个简单的插件来学习如何 新建插件、建立管理中心 。
    开始新建
    进入管理中心-》插件-》插件-》设计新插件 如图:
1.png 
    按照要求填写
2.png 
    填写好之后,就可以来添加管理中心的设置文件了,这里要注意:你的标识符一旦确定就不能修改!并且,你所写的程序文件都应该放在:source/plugin/标识符/ 这个文件夹下面,例如我们要设置下图的程序,文件:admincp.inc.php应该放在该目录下即可。
3.png 
    点击 提交 之后,返回插件列表,开启我们新建的插件,虽然我们还没有编写admincp.inc.php这个文件,但是因为我们要测试我们编写的内容,我们需要开启此插件才能检验该插件是否可用。
4.png 
    之后,你就会在左边的导航栏里看到 刚才填写的插件名称了,如图:
5.png 
    点击之后发现这个文件不存在
6.png 
    现在我们就可以编写这个文件了,使用你常用的编辑器新建文件:source/plugin/标识符/admincp.inc.php,然后在里面写上如下代码:

1.       [indent]<?php[/indent][indent]if(!defined('IN_DISCUZ')) {[/indent][indent]

2.       exit('Access Denied');[/indent][indent]}[/indent][indent]showtips($templatelang['sitemap']['sitemap_tips']);[/indent][indent]showformheader('plugins&operation=config&do='.$pluginid.'&identifier=msign&pmod=admincp');[/indent][indent]showtableheader();[/indent][indent]showsetting('启用', 'signsetting[enable]');[/indent][indent]showsetting('关闭提示','signsetting[disable_info]','','textarea');[/indent][indent]showsubmit('submit');[/indent][indent]showtablefooter();[/indent][indent]showformfooter();[/indent][indent]?>[/indent]

 

该代码如下图显示:
7.png 
这下子,我们就做好了一个简单的可以显示的管理中心的插件了,然后我们可以在此插件的基础上来添加自己的内容了,发挥你的想象力吧~

 

 

现在我遇到一个问题:我想更改自己网站的页面内容,比如我希望能在不使用二次开发更改系统模板的情况下来更改部分布局和内容,我应该怎么做?    似乎现在的DX很强大,但是这样的功能它支持么?很高兴地告诉你:你完全可以做到!你甚至可以通过自己的内容来对页面的任意一部分内容进行更改,这就是DX插件最最强大的地方,当然前提是你需要去了解它。
    现在我们来实现一个内容,我们以我自己的一个插件:帖子导读的显示部分为例。
    首先,我们需要了解DX的一个概念:嵌入点。
    在每个标准的DX页面都有一些DX已经设定好的嵌入点,要查看这些嵌入点,我们需要对系统的代码进行一些修改,方法如下:

查找 source/class/class_template.php 中找到以下代码,去除 //for Developer 注释后,更新缓存即可查到。

$dev = '';//for Developer $dev = "echo '[$hookid]';";

   更新一下缓存,然后你就会看到如下图的内容:1.png 
    帖子导读需要我们在每个页面都进行调用,我们需要编写一个调用类:
2.png 

    同样,我们需要在我们的插件目录下来编写这个插件了,在这里,我们以我们最常见的方式来写一段JS代码:HELLO,WORLD!

<?php

if(!defined('IN_DISCUZ')) {


exit('Access Denied');

}

class plugin_mtest{


function global_footer(){


return '<script language="javascript"> alert("Hello,world!"); </script>';


}

}

?>

   保存这个文件为:source/plugin/mtest/m.class.php 假定mtest是你的标识符,然后更新缓存,再点击你的广场页面试试,看看有什么奇迹发生。
    关于具体的嵌入调用规则,这里无法完全讲解给您,您可以参考:http://www.bbsapp.com/PluginDevloper/ 来帮助您了解。当然,您也看到了,您可以随意地输出您想要的JS代码,这也就是意味着,即使在一些没有嵌入点的地方,您也可以同输出的JS代码来改变您想作出的改变,当然,嵌入点能做的远远不止如此,那得看您能想到多少了。
    现在,您基本上已经可以做常用的插件了。不过,如果您需要一个导航栏怎么办?天啊!我需要一个类似于每日签到 这样的一个签到页面,我应该怎么来做呢?
    不用着急,接下来我们就来实验一个导航栏,然后进去之后输出一个hello,world的代码。
    首先,我们需要在设计模块里面增加一个导航栏
3.png 
    有了它,我们就可以写:mtest.inc.php这个文件了,不过我们似乎还需要一点点模板的支持,那么我们在这个文件夹下,新建一个文件夹:template,然后在它的下面新建一个文件:mtest.htm,内容如下:

{template common/header}

<p>HELLO,WORLD!!!!</p>

{template common/footer}

   mtest.inc.php这个文件里,我们写入:

<?php

if(!defined('IN_DISCUZ')) {


exit('Access Denied');

}

include template("mtest:mtest");

?>

   然后,更新一下缓存,然后刷新一下站点首页,看看有什么效果?
4.png 

hello,world!


5.png 

导航栏


6.png 

最后的现实

 

    怎么样,是不是很棒?你可以浏览我的以下插件来学习如何使用插件:

 

    1. 每日签到 http://www.discuz.net/thread-1703440-1-1.html

    2. 帖子导读 http://www.discuz.net/thread-1799341-1-1.html

 

 

我终于写出了自己的一个伟大的插件,我希望别人也能使用这个插件!我想发布这个插件,我该如何做呢?    面对问题
    然而我们刚刚写完了一个插件,但是我们所要面临的问题才刚刚开始,我们需要考虑的内容很多,这些内容包括:
    1. 我使用的语言编码方式是UTF8,我希望那些使用GBK的站长也能使用我的插件
    2. 我可能会使用到数据库来建立我需要使用的表,我该如何建立
    3. 我怎么描述出我的使用条例或者安装条例
    4. 我怎么为我的插件进行插件描述
    5. 我的插件发布在哪里,是否需要收费
    天啊,我头都大了!我根本没有想过这个问题!如此多的问题迎面而来,我该如何解决?嘿嘿,这个时候就是体现我自己价值的时刻了,我们来慢慢的讲解吧!
    语言编码
    要解决语言编码的问题比较的麻烦,首先我们要确保我们所有程序里面没有出现中文字符,其次我们需要新建一个文件:data/plugindata/mtest.lang.php这个文件,写入内容为:

1.       <?php

2.       $scriptlang['mtest'] = array(

3.               'enable' => '启用',

4.       );

5.       $templatelang['mtest'] = array(

6.       );

7.       ?>

 

然后,在你自己的程序使用前,使用:

1.       $mlang=$scriptlang['mtest'];

 

来调用一下,这样,$mlang这个数组里存放的就是你要使用的内容了。
    接下来,我们要做不同的对应的语言编码的xml文件了。
8.png 
    我相信你一定看到导出这个按钮了,然后就是一个XML文件,把它存放到你的插件目录下面,如果您不愿意做多语言编码的插件,那么就可以直接打包插件目录为rar格式,您的插件已经完成。这里,我们还有GBK的站长需要,因此我们需要进行转码。首先我们对我们的这个:discuz_plugin_mtest.xml文件进行改名,改名为:discuz_plugin_mtest_SC_UTF8.xml ,这里:SC表示简体中文 UTF8表示UTF8编码方式,然后使用编码转换工具,经这个XML文件转码后,重命名为对应的名字,放在这个目录下即可。编码转换工具我推荐 ConvertZ 这个工具,可以在网上搜索一下。至此,我们的转换工作就做完了!
    使用数据库
    我需要使用数据库,我的插件需要新建一个数据表怎么办?
    还记得我们刚才导出的那个XML文件么?我们需要修改这个XML文件的内容来实现我们的操作了。我们需要在

1.       <item id="DATA"></item>

 

中加上如下代码:

1.       [indent]<item id="installfile"><![CDATA[install.php]]></item>[/indent][indent]<item id="uninstallfile"><![CDATA[uninstall.php]]></item>[/indent]

 

上述代码分别表示:安装|卸载插件时会运行的文件,这两个文件都放在插件目录下即可,以下是一个示例:

<?php
/*
        mguide for DISCUZ X 1.0
        editor: monkee
        version:1.0
*/
if(!defined('IN_DISCUZ')) {
        exit('Access Denied');
}
$sql = <<<EOF
DROP TABLE IF EXISTS CDB_TABLE_SETTING;
CREATE TABLE CDB_TABLE_SETTING(
  `key` varchar(20) not null primary key,
  `value` text
) ENGINE=MYISAM DEFAULT CHARSET=DCHARSET;
EOF;


$sql=str_replace(array('CDB_TABLE_SETTING','DCHARSET'),array(DB::table('mguide_setting'),$_G['charset']=='utf-8'?'utf8'_G['charset']),$sql);

foreach(explode(';',$sql) as $item){
        if(!empty($item))
                DB::query($item);
}

$finish = TRUE;
?>


 
    插件发布
    插件发布到:http://www.discuz.net/forum-26-1.html 这个板块就可以。