Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Discuz插件设计

Discuz插件设计

作者头像
心平气和
发布于 2020-09-11 03:34:50
发布于 2020-09-11 03:34:50
3.4K00
代码可运行
举报
运行总次数:0
代码可运行

一、Discuz介绍

Discuz是国内比较知名的开源论坛了,后来被腾讯收购,Discuz在设计时就考虑了生态体系的建设,支持插件设计,可以让广大开发者朋友来一起建设生态,不得不说设计者是很有商业头脑的。

回到话题,我们为什么要学习Discuz的插件设计呢,因为假如我们哪天自己想做一套系统,也要支持插件,可以借鉴下相关的设计。

源代码:

https://gitee.com/ComsenzDiscuz/DiscuzX/tree/v3.4-20190917/

插件市场:https://addon.dismall.com/

具体如何安装就不在这里说明了,可以参考官网的说明。

二、插件系统的需 求和场景

在分析Discuz的插件设计之前,我们还是要大概分析下如果设计一个支持插件的系统,系统应该支持哪些功能。

1、安装和反安装

插件安装的过程可能是Mysql中加一些表、将插件的代码覆盖放置到系统可以调用到的地方;

反安装是反过来,如何干净地将插件从系统中删除自己。

2、插件的启用和禁用

这个就不用说了,有些插件可能有些bug,或者和其它插件冲突了,需要临时禁用掉,后面修复问题再启用。

3、插件的加载顺序

因为插件之间可能有加载先后顺序,或者说一个插件依赖另一个插件,就需要设置插件的加载顺序了,这个应该算是用的比较少的场景。

4、插件的自我描述

提供插件名称等信息来描述自己。

5、可以在某个地方以可视化的方式设置插件的参数

插件一般来说是比较通用的,有一些自定义的参数配置,需要在一个地方设置这些插件。

6、能够将自己的接口注入到系统中

插件可能会提供一些接口,这些接口能够被前台的页面调用到,即在浏览器中可以访问。

7、模版的渲染能力

插件必须能渲染自己的页面,可以直接生成页面让前台用户访问。

8、傻瓜式的安装

因为使用网站的人不一定都懂代码,尽量简单、傻瓜式安装,不要有太多安装和运维成本。

9、完善的扩展点

一个设计好的插件应该提供很多扩展点,让插件能够在系统的原有流程上扩充一些能力。

举个例子,支付方式,可以一个插件提供微信,另一个插件提供支付宝的。

在发布帖子后,系统应该要有一种机制让插件捕捉到这个事件,以便做一些操作,像提高用户活跃度,增加积分等操作。

做的更灵活些,甚至可以提供一种机制替换系统的默认实现。

三、Discuz插件机制实现分析

Discuz插件都是放在 upload/source/plugin目录下,我们一个个来分析实现机制。

以下是其中一个插件的代码目录截图:

1、安装和反安装

在插件的根目录提供 install.php和uninstall.php,系统安装和反安装的时候调用相应的文件就行了。

2、插件配置

主要是以xml的方式提供。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?xml version="1.0" encoding="ISO-8859-1"?>
<root>
  <item id="Title"><![CDATA[Discuz! Plugin]]></item>
  <item id="Data">
    <item id="plugin">
      <item id="available"><![CDATA[1]]></item>
      <item id="adminid"><![CDATA[1]]></item>
      <item id="name"><![CDATA[微信登录]]></item>
      <item id="identifier"><![CDATA[wechat]]></item>
      <item id="description"><![CDATA[]]></item>
      <item id="datatables"><![CDATA[]]></item>
      <item id="directory"><![CDATA[wechat/]]></item>
      <item id="copyright"><![CDATA[Comsenz Inc.]]></item>
      <item id="version"><![CDATA[1.1.7]]></item>
      <item id="__modules">
        <item id="1">
          <item id="name"><![CDATA[wechat]]></item>
          <item id="param"><![CDATA[]]></item>
          <item id="menu"><![CDATA[]]></item>
          <item id="url"><![CDATA[]]></item>
          <item id="type"><![CDATA[11]]></item>
          <item id="adminid"><![CDATA[0]]></item>
          <item id="displayorder"><![CDATA[0]]></item>
          <item id="navtitle"><![CDATA[]]></item>
          <item id="navicon"><![CDATA[]]></item>
          <item id="navsubname"><![CDATA[]]></item>
          <item id="navsuburl"><![CDATA[]]></item>

xml中可以对插件加以说明,关键参数是identifier,这个是插件唯一标识,不能重复。

并且提供参数配置的能力,所有这些符合相应的规范,Discuz自动会加载相应的参数,并且提供保存参数和获取参数的能力。

3、接口注入及页面访问

https://www.xxx.com/plugin.php?id=wechat:sign&operation=qiandao&infloat=1&inajax=1

上面是访问插件 wechat中sign模块,模块以.inc.php结尾,即在插件中查找 sign.inc.php,然后把请求转由该文件处理。

至于如何代码中引入其它文件,系统根目录通过 DISCUZ_ROOT 引用,plugin的目录也确定了,所以只要加上插件自己的目录就可以引用了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
require_once DISCUZ_ROOT . './source/plugin/wechat/wsq.class.php';

渲染页面也是一样,按上面的格式访问,把插件和模块传给plugin.php,然后在相应模块输出页面就可以达到渲染页面的效果了。

4、模板渲染

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
include_once template('wechat:wechat_threadqr');

用template函数就可引用自己的模板了,参数格式如下

插件:模板名

模板名以.htm结束,里面可以用PHP代码。

5、插件安装

Discuz安装插件有2种方式,1种是在线安装,1种是下载代码到本地安装。

在线安装通过在后台应用中心操作,前提是你必须登录相应的账号,因为有的插件是必须付费的。

安装的过程无非就是把远程插件代码下载到本地,然后解压缩,再按照本地的安装流程操作就行。可以看到整个安装过程是比较傻瓜式的,不需要懂太多的技术。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-07-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员升级之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
优雅草最新实战项目技术Discuz X3.5电子签约插件开发项目实施方案优雅草·卓伊凡
甲方需求:为现有Discuz X3.5系统集成电子签约功能,对接e签宝API,实现用户发起/签署合同、模板管理、签约记录查询等功能。 总预算:9,300元(含UI/前端/后端/文档) 工期:35天 技术栈:
卓伊凡
2025/05/27
690
WordPress 主题和插件的加载运行机制、Hook钩子与重要函数
本文有助于你深度了解 WordPress 主题和插件的 PHP 加载顺序,学习 Hook(钩子)Action(动作钩子) Filters(过滤钩子)的概念,弄懂 WordPress 重要函数:do_action、add_action、apply_filters 和 add_filter。
Yangsh888
2022/03/28
1.5K0
《Discuz! X3.5开发从入门到生态共建》系列教程大纲优雅草卓伊凡
第1章 Discuz! 的前世今生 1.1 从康盛创想到腾讯收购:PC时代的辉煌 1.2 移动互联网时代的沉寂与重生 1.3 X3.5版本的技术突破(PHP8支持/性能提升40%)
卓伊凡
2025/05/28
490
discuz 二次开发[通俗易懂]
转载地址:http://www.cnblogs.com/LY-leo/p/5843439.html
全栈程序员站长
2022/08/31
2K0
WordPress插件设计
如果是Php开发的同学,或者对博客和CMS有一定了解的同学都知道这个,以下是百度的解释:
心平气和
2020/09/11
8900
WordPress插件设计
Discuz! ML RCE漏洞 getshell 复现
Discuz!ML是一个由CodersClub.org创建的多语言,集成,功能齐全的开源网络平台, 用于构建像“社交网络”这样的互联网社区,漏洞版本如下:
Timeline Sec
2019/12/12
2.2K2
WordPress插件开发,从入门到精通。
WordPress插件开发手册:https://developer.wordpress.org/plugins/
房东的狗丶
2023/02/17
1.2K0
WordPress插件开发,从入门到精通。
Discuz二次开发基本知识总结
一) Discuz!的文件系统目录 注:想搞DZ开发,就得弄懂DZ中每个文件的功能。 a) Admin:后台管理功能模块 b) Api:DZ系统与其它系统之间接口程序 c) Archiver:DZ中,用以搜索引擎优化的无图版 d) Attachments:DZ中 ,用户上传附件的存放目录 e) Customavatars:DZ中,用户自定义头像的目录 f) Forumdata:DZ缓存数据的存放目录 g) Images:DZ模板中的图片存放目录 h) Include:DZ常用函数库,基本功能模块目录 i) Ipdata:DZ统计IP来路用的数据 j) Plugins:DZ插件信息的存放目录 k) Templates:DZ模板文件的存放目录 l) Wap:DZ无线,Wap程序处理目录
全栈程序员站长
2022/07/21
2.9K0
原创插件:中国博客联盟WordPress插件更新至1.2.2版本
这个周末,作为 PHP 菜鸟的张戈再次爆发,天昏地暗的开发了 3 个插件: ①、Zgboke-Nav:中国博客联盟导航插件更新至 Ver 1.22 ②、WP-Baidu-Record:WordPress 百度收录查询与显示插件 ③、WP-Dialog:WordPress 博客友好对话框&底部随机文章滚动条插件 以上插件均已上传到 WordPress 官方,并成功通过审核。所以,WordPress 博客均可以在后台插件在线搜索并安装。后 2 个插件就不多说了,感兴趣的可以点击超链接过去看个明白。 自 2014
张戈
2018/03/23
1.2K0
原创插件:中国博客联盟WordPress插件更新至1.2.2版本
如何修复网站漏洞Discuz被挂马 快照被劫持跳转该如何处理
Discuz 3.4是目前discuz论坛的最新版本,也是继X3.2、X3.3来,最稳定的社区论坛系统。目前官方已经停止对老版本的补丁更新与升级,直接在X3.4上更新了,最近我们SINE安全在对其安全检测的时候,发现网站漏洞,该漏洞是由于用户登录论坛的时候调用的微信接口,导致可以进行任意登录,甚至可以登录到管理员的账号里去。
技术分享达人
2019/02/27
1.4K0
搭建Discuz! 论坛
CentOS 7.0中,已经使用MariaDB替代了MySQL数据库,原因你懂的,MYSQL被Oracle收购以后,前景堪忧,所以MYSQL兄弟MariaDB就出来了,继续开源事业。
胡齐
2019/09/23
7.3K1
搭建Discuz! 论坛
Discuz! X3.2 二次开发基本流程
/source———————————————–程序模块功能处理目录 /source/admincp———————————–后台管理文件 /source/archiver———————————-论坛静态化程序目录 /source/class————————————-核心类库 /source/function———————————-DX自定义函数库 /source/include———————————–程序功能处理目录 /source/language———————————-程序语言包 /source/module————————————程序功能模块程序包 /source/plugin————————————插件程序扩展目录 /source/discuz_version.php————————程序版本号存放文件
全栈程序员站长
2022/08/31
1.1K0
Emlog插件简单开发文档教程,emlog插件制作指南
emlog 支持插件机制,这样使得开发者可以方便地向emlog 中添加自己需要的功能。
用户8099761
2023/05/10
8550
webman企业级管理系统框架MaDong Admin
码动管理系统。前端开发采用 Vue3.0、Vite、 TypeScript 的中后台解决方案,目标是为开发中大型项目提供开箱即用的解决方案。包括二次封装组件、utils、hooks、动态菜单、权限校验、多主题配置、按钮级别权限控制等功能。
Tinywan
2024/11/21
2270
webman企业级管理系统框架MaDong Admin
discuz优化10个小技巧
  Discuz论坛是国内使用最多的论坛系统,现在最新版为X 3.4,X3.4 从 2018 年 1 月 1 日起只在官方 Git 发布,地址:https://gitee.com/ComsenzDiscuz/DiscuzX,说明已经开源了。discuz有那么多的粉丝,跟它完善的功能有很大关系,开箱即用,很多优化可以直接在后台设置,应对高并发/大数据量,那么discuz怎么优化呢?可以从以下几点来进行,跟ytkah一起来看看吧。
ytkah
2018/12/28
6.5K1
原创插件:WordPress读者排行榜插件WP Readers Ranking
貌似在上个月,我就和中国历史、梦轩丽人等几位博友提过,张戈博客分享的《WordPress 酷炫 CSS3 读者墙,排名按年度、本月、本周划分的小方法》,其实可以封装成 WordPress 插件,方便一些不会部署代码的童鞋。 最近,连续开发了 3 个 WordPress 插件,也有了些心得和经验,干脆就把之前的想法也来实现一下! 说干就干,绝不含糊,目前该插件已制作成功,并上传到了 WordPress 官方插件站,下面简单的介绍下。 一、插件名称 我在制作插件的时候下意识的取名为 WP Readers Wal
张戈
2018/03/23
1.7K0
原创插件:WordPress读者排行榜插件WP Readers Ranking
用Publish创建博客(三)——插件开发
在用Publish创建博客(一)——入门[4]中我们介绍过Publish有两个Content概念。其中PublishingContext作为根容器包含了你网站项目的全部信息(Site、Section、Item、Page等)。在对Publish进行的大多数扩展开发时,都需要和PublishingContext打交道。不仅通过它来获取数据,而且如果要对现有数据进行改动或者添加新的Item、Page时(在Content中采用不创建markdown文件的方式)也必须要调用其提供的方法。比如mutateAllSections、addItem等。
东坡肘子
2022/07/28
4690
用Publish创建博客(三)——插件开发
Discuz !Q 前端首屏加载优化记录
Discuz !Q作为一个对外开源的私域流量建站工具,在加载性能优化上会受到很多限制。因为Discuz !Q部署形态是存在于用户自己的服务器中,网络情况,服务器性能等,都有很多未知因素,经过团队共同努力出谋划策,最终成效不错,借此机会记录一下极端情况下的加载性能优化思路。
LamHo
2022/09/26
9870
Discuz !Q 前端首屏加载优化记录
Discuz!ML 3.x任意代码执行漏洞分析
漏洞原因:Discuz!ML 系统对cookie中的l接收的language参数内容未过滤,导致字符串拼接,从而执行php代码。
FB客服
2019/07/29
2.1K0
Typecho接入熊掌号附带AMP/MIP简单教程
在Typecho接入熊掌号之前,你得先去熊掌号申请开通一下。具体填写的信息就是上面页面的那么多,请准备号正面手持身份证的照片。
Erwin
2019/12/31
1.2K2
相关推荐
优雅草最新实战项目技术Discuz X3.5电子签约插件开发项目实施方案优雅草·卓伊凡
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验