php discuz插件开发

本文详细介绍Discuz插件开发流程,包括解决常见问题、设置钩子、编写插件代码及利用全局钩子等关键步骤。同时,文章还介绍了如何在Discuz中添加安装和卸载功能,以及在所有页面自动运行PHP代码的方法。

页面嵌入demo

问题1.discuz后台没有设计新插件!
解决方案:在config\config_global.php 最下面添加 $_config[‘plugindeveloper’] = 2; 刷新后台应用即可

问题2.怎么知道discuz在那些点设置了钩子呢?
设置完成1后 工具->清理缓存 然后刷新下页面就出现好多 类似string global_usernav_extra1的东西 这就是锚点,也是插件可以利用的点。

好了下面开始做插件:
后台 ->应用 ->设计新插件
1.jpeg

提交后 请在插件管理中 启用即可
然后点击 设计
就会进入如下图所示
2.jpeg

接着
3.jpeg

在source/plugin下新建一个文件夹,文件夹的名称要和所要创建的插件的标识符相同。
然后在创建的文件夹下面 创建您需要的文件。如下图 我在模块里面定义了 页面嵌入的 test1类文件,则需要在插件文件夹中新建一个test1.class.php的文件爱你
下面是需要注意的东西。
4.jpeg

test1.class.php中 文件的上部分 是discuz的引入部分,而下面的类名必须要和插件的名称一致。
之后在类中书写function函数。这里需要注意的是:只有function的的名称与 外面相应位置显示的名称一致的时候 才会在相应页面中的相应位置中运行。
在每次新增加或者修改文件 则尽量刷新下缓存文件
5.jpeg

在前台的相应页面刷新后 就会出现我们刚才做的简单的示例。
6.jpeg

这里需要注意的是,如果需要在指定位置进行运算的话,进行页面输出的时候尽量不要使用echo 或者var_dump进行输出,因为这样会输出到最顶部,也就是网页的外围部分上。而使用return则会在指定的地方进行输出。
值得注意的是,在编写插件的时候,如果确实要输出的话,先按照1步骤后,看下前台所需的页面上有没有。到此,简单的discuz的插件就开发完毕了。点击导出按钮后导出文件放在 当前插件文件夹的根目录下 直接的发布给别人就可以正常的使用了。

导航demo

首先,我们需要在设计模块里面增加一个导航栏
7.jpeg

有了它,我们就可以写: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");
?>

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

9.jpeg

导航栏
10.jpeg

管理中心demo

11.jpeg

12.jpeg

启用即可看到效果,不过真正的文件必须在source/plugin/标识符/ 这个文件夹下面。
13.jpeg

Potato2.inc.php:

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

扩展

功能1:让插件有安装和反安装能力
在插件目录下添加install.php和uninstall.php
[php] view plaincopy

<?php  
if(!defined('IN_DISCUZ')) {  
    exit('Access Denied');  
}    
//各种安装操作  
$sql = "show tables";  
runquery($sql);  
//或  
DB::query($sql);  
  
  
$finish = TRUE;  
  
?>  
[php] view plaincopy
<?php  
if(!defined('IN_DISCUZ')) {  
    exit('Access Denied');  
}   
 
//各种反安装操作,恢复安装时的修改  
$sql = "show tables";  
runquery($sql);  
//或  
DB::query($sql);  
  
  
$finish = TRUE;  
  
?>  

然后到设计页面导出一份xml插件配置文件
将导出的xml文件放到插件目录下
现在到后台就可以发现安装/卸载功能可以用了

功能2:想在打开所有页面时都自动运行一段PHP代码 和 在特定的脚本里嵌入钩子
[php] view plaincopy

<?php  
if(!defined('IN_DISCUZ')) {  
    exit('Access Denied');  
}   
class plugin_demo {  
    function __construct(){      
    }  
    //全局钩子  
    function common(){  
        global $_G;  
        if($_G['uid']){  
            //经验值加1点  
        }  
    }  
    function global_footer(){  
        return '<script>alert("插件我来了")</script>';  
    }      
}  
/** 
 * 只有运行member.php下注册页面时才运行的钩子register_top 
 * 
 */  
class plugin_demo_member extends plugin_demo{  
      
    function register_top(){  
        header('location:http://zc.qq.com/chs/index.html'); //引导用户去注册QQ号  
        exit;  
    }  
} 
 

网站的基本数据

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

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

常量名说明
DISCUZ_ROOT网站的根目录
TIMESTAMP程序执行的时间戳
CHARSET程序的语言编码类型
IS_ROBOT是否是机器访问
FORMHASHHASH值

全局变量
DX的全局变量事实上全部压缩到了一个变量:G里面,接下来的表格列举了常用的_G里面,接下来的表格列举了常用的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/ 文件夹下找到对应的文件来查看。 好了,经常用到的数据内容就在上面的列表里面了,附录提供了一些查看全部内容的代码!下一篇将会介绍如何编写 管理中心 插件!

附录:

查看全部常量:

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

查看$_G变量中内容

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

请关注我的订阅号

订阅号.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码哥说

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值