Discuz插件设计

一、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的方式提供。

<?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的目录也确定了,所以只要加上插件自己的目录就可以引用了。

require_once DISCUZ_ROOT . './source/plugin/wechat/wsq.class.php';

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

4、模板渲染

include_once template('wechat:wechat_threadqr');

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

插件:模板名

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

5、插件安装

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

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

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

本文分享自微信公众号 - 程序员升级之路(gh_1fab42db66cb),作者:深圳刘江华

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-07-17

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • WordPress插件设计

    如果是Php开发的同学,或者对博客和CMS有一定了解的同学都知道这个,以下是百度的解释:

    心平气和
  • Mysql中间件360 Atlas踩坑

    公司有个社区系统,和一般社区功能差不多,核心功能有发帖和回复。近年来公司业务增长较快,社区用户比较活跃,回复表记录数近1亿,为了提高系统的稳定性和可扩展性,我们...

    心平气和
  • Raft算法之日志篇

    应用操作内容:由客户端发送的请求,需要被复制状态机(replicated state machine)执行的命令,如上是一个KV系统,每一次的操作是对某个key...

    心平气和
  • WP-Sweep 插件清理 WordPress 垃圾评论和数据结构

    魏艾斯博客www.vpsss.net
  • 2008r2管理员远程桌面配置远程连接

    我们已经在Win2008 R2 VDI动手系列的上一篇文章中配置了远程桌面虚拟化主机。远程桌面会话主机,请参考下图中的拓扑。本文的任务是将RDCB配置为远程桌面...

    it妹
  • maven插件调试方法

    以IntelliJ IDEA为例,通常我们调试maven项目时,都是直接点击调试按钮即可。但maven编写的插件就不同了,由于插件需要打包成Jar加载到项目中,...

    xiaoxi666
  • 「CodeForces - 50C 」Happy Farm 5 (几何)

    有一些二维直角坐标系上的整数坐标的点,找出严格包含这些点的只能八个方向走出来步数最少的路径,输出最少步数。

    饶文津
  • 微服务与API 网关(下): Kong能为我们做什么?

    本系列内容是来自Mashape.com的Marco在nginx.conf上的一次演讲。 上一集我们介绍了为什么我们需要API网关:微服务与API 网关(上): ...

    ImportSource
  • Pipenv一键搭建python虚拟环境

    zhaoolee
  • 优酷iOS插件化页面架构方法

    随着业务不停地迭代,优酷 APP 用于分发视频资源的 UI 控件越写越多,也越来越复杂,并且同时相似相近的代码也非常多。仔细研究之后,发现是很多耦合导致的问题:

    ios-lan

扫码关注云+社区

领取腾讯云代金券