本篇博客将介绍现行Discuz! X3.4软件中插件的概念、插件的工作原理以及如何自己创建新插件或者修改插件模板。
本文内容来自我们团队项目开发过程中对Discuz! X3.4软件的学习理解,博客既是对我们小组项目成果的记录,同时也希望在Discuz! X3.4二次开发上能够帮助到大家。
本篇博客包括以下内容:
- Discuz! X3.4插件的优缺点
- Discuz! X3.4插件的主要功能
- Discuz! X3.4插件的底层逻辑
- Discuz! X3.4插件的一般创建流程
- 编写插件时需要注意的几个原则
一、Discuz! X3.4插件的优缺点
要介绍使用插件的优缺点,首先我们要先了解什么是插件:插件,是一种计算机程序。通过和应用程序或系统的互动,用来替应用程序或系统增加一些所需要的特定的功能。最常见的有游戏辅助插件、网页浏览器辅助插件和媒体播放器解码插件等。 比如竞技游戏中的血条显示插件,Microsoft Edge浏览器中的广告屏蔽插件等。
Discuz!软件官方为我们提供了插件下载安装的商店,搜索几个优质插件可谓是非常方便便捷。
那么插件的优点有哪些呢?主要由以下几个方面:
- 体积小巧,功能强大
- 易于分发
- 易于修改、升级
- 开启、关闭方便
- 不会污染系统原始代码
比如下图所展示的我们小组所使用的一款插件:论坛版权插件
可以看到它的文件体积仅有64kb左右。
当然使用插件也会有几个缺点:
- 基于系统开发,不可脱离系统
- 功能由系统API决定,受到限制
- 系统升级的兼容性问题
- 执行效率降低
二、Discuz! X3.4插件的主要功能
主要功能可以分为三个:用户功能、管理功能、数据功能:
用户功能:
- 页面显示嵌入点(关于嵌入点会在文章最后进行简单介绍)
- 前台功能入口(比如实现打卡小程序)
- 菜单选项模块(比如实现论坛页面上的连接跳转)
管理功能:
- 后台管理功能入口(配置插件的各种效果)
以上文提到的论坛版权插件为例
数据功能:
- 论坛主题数据处理模块 (对发帖中的数据进行处理)
三、Discuz! X3.4插件的底层逻辑
首先我们介绍一下插件系统开发的三种状态:
- NULL:不开启插件开发模式,不开启嵌入点
- 1:开启插件开发模式,不开启嵌入点
- 2:开启插件开发模式,开启嵌入点
我们可以在config_global.php文件中添加图中所示的变量,这个变量是一个多维数组,当我们向这个变量赋不同的值,如null或1、2数字时会进入不同的开发状态。
然后我们更新css缓存,插件页面就会出现“设计新插件”这一选项,只有系统处于插件开发模式中才会出现这一选项:
那么在这里我简单介绍一下什么是嵌入点:嵌入点是Discuz!X程序提供的底层功能接口。开发者通过在插件中定义嵌入点,可以实现-一页面变化、数据处理、代码功能修改等程序效果。 也就是说我们可以在页面特定位置查看特定的数据、代码,然后进行特定的修改。
嵌入点有以下类型:
- 页面嵌入点 作用:修改页面显示
- 信息提示嵌入点 作用:修改showmessage()
- 广告嵌入点 作用:处理广告位数据
- 功能嵌入点 作用:处理主题帖子,头像数据等
四、Discuz! X3.4插件的一般创建流程
如图,在“设计新插件”选项中我们要填入插件名称、插件版本号、版权信息、唯一标识符等信息。然后我们点击提交,系统会回显一下信息:
之后我们可以继续进行详细设置,设置完毕后我们在插件中点击启用,这样一个创建了一个新插件。接下来介绍一下如何创建插件模板:
插件模板的创建规则
我们可以进入后台,找到对应插件的模块,然后开始设计插件模块和导航,这里需要注意插件模块里的程序模块要与后台创建出来的文件相对应。最后是创建插件变量:
这样我们就完成了一个新插件的创建。
五、编写插件时需要注意的几个原则
- 所有与插件的程序,包括其全部的前后台程序,请全部放入 source/plugin/ 目录中,同时在插件的安装说明中指出,插件的文件需要复制到哪些目录。为了避免与其他插件冲突,请尽量建立 source/plugin/ 下的子目录,并将插件程序放置于子目录下,这样编写的插件将获得更好的兼容性。
- 如果编写的插件包含“导航栏”模块,该模块将统一用 plugin.php?identifier=xxx&module=yyy 的方式调用,请在相应链接、表单中使用此方式。其中 xxx 为插件的惟一标识符,yyy 为模块名称。前台插件外壳程序 plugin.php 已经加载了通用初始化模块 /source/class/class_core.php,不需再次引用。
- 如果编写的插件包含“管理中心”模块,该模块将统一用 admin.php?action=plugins&identifier=xxx&pmod=yyy 的方式调用,请在相应链接、表单中使用此方式。其中 xxx 和 yyy 的定义与“导航栏”模块中的相同。系统还允许用 admin.php?action=plugins&edit=$edit&pmod=$mod 的方式来生成链接和表单地址,$edit 和 $mod 变量已经被插件后台管理接口赋值,因此将这两个变量值带入 URL 中也是被支持的。由于后台模块是被 admin.php 调用,因此已加载了通用初始化模块 /source/class/class_core.php 并进行了后台管理人员权限验证,因此模块程序中可直接写功能代码,不需再进行验证。