跳至主要内容
版本:5.1

插件工作原理

Plugins Overview

该图展示了 Joomla 插件的工作原理。

左侧的箭头表示通过 Joomla 代码的控制流。每隔一段时间就会到达一个重要的点,被认为是适当的插件参与点。例如:

  • 在 Joomla 完成初始化例程后
  • 每当检索到文章时
  • 每当从 XML 表单定义构建表单时
  • 在将项目保存到数据库之前

其理念是将相关数据传递到插件代码,然后它可以修改数据项以更改最终的用户体验。例如,文章的文本可能会被更改,或者表单可能会被扩展以捕获更多数据。

有时插件会返回一个数据项;这可能被触发事件的代码用于控制后续代码执行,或者可能被添加到 HTML 输出中,例如。

包含插件的过程包含 2 个步骤:

  1. 导入给定类型的全部插件
  2. 触发事件

导入插件类型由代码实现

PluginHelper::importPlugin($pluginType,);

插件被分类为类型,这些类型与 Joomla 实例的插件文件夹内的子目录相匹配。

例如,在 Joomla 初始化后,系统插件会被导入(即那些在 plugins/system 目录中的插件)。

导入插件类型涉及:

  • 从数据库中查找与特定类型关联的所有插件 - 类型与文件系统中 /plugins 文件夹的关联子文件夹匹配。在图中,这些插件显示为 plugin1plugin2plugin3
  • 实例化每个插件。
  • 确定每个插件要订阅哪些事件。
  • 将订阅写入图中 Listeners 框表示的数据存储中。

以这种方式按插件类型拆分插件使 Joomla 性能更高 - 它不需要处理那些不会对即将触发的事件感兴趣的插件。

第二步是通过调用事件调度器来触发事件。Joomla 查找其 Listeners 存储,以确定哪些插件已订阅该事件类型。然后,它调用订阅插件的关联方法,并将事件数据传递给它,通常允许插件代码修改该数据。

每个已订阅该事件的插件都会依次被调用(基于优先级方案),并且插件返回的任何结果都会被整理到与该事件关联的数组中。

例如,在 Joomla 初始化后,系统插件会被导入,并且 onAfterInitialise 事件会被触发。“记住我”插件(位于 plugins/system/remember 中)会收到此通知,并且可以登录之前在登录表单上选中“记住我”复选框的用户。

一旦插件被导入,并且其订阅被记录在 Listeners 数据存储中,那么它就会继续接收对其订阅的所有事件的通知。例如,考虑以下场景:

  • 系统插件会被导入,并且 onAfterInitialise 事件会被触发
  • 一段时间后,内容插件会被导入,并且 onContentPrepare 事件会被触发。

在第一步中导入的系统插件可以订阅 onContentPrepare 事件,即使它与内容插件关联,并且如果它们订阅了它,即使没有再次导入,也会收到 onContentPrepare 事件。

您还应该知道,与组件和模块不同,没有不同的网站插件和管理员插件。您安装的插件将在所有不同的上下文(网站、管理员和 API 应用程序)中运行,因此最好在插件中检查应用程序上下文。

对于那些想要更详细地了解插件工作原理的人,请查看下面的时序图。