插件工作原理
该图展示了 Joomla 插件的工作原理。
左侧的箭头表示通过 Joomla 代码的控制流。每隔一段时间就会到达一个重要的点,被认为是适当的插件参与点。例如:
- 在 Joomla 完成初始化例程后
- 每当检索到文章时
- 每当从 XML 表单定义构建表单时
- 在将项目保存到数据库之前
其理念是将相关数据传递到插件代码,然后它可以修改数据项以更改最终的用户体验。例如,文章的文本可能会被更改,或者表单可能会被扩展以捕获更多数据。
有时插件会返回一个数据项;这可能被触发事件的代码用于控制后续代码执行,或者可能被添加到 HTML 输出中,例如。
包含插件的过程包含 2 个步骤:
- 导入给定类型的全部插件
- 触发事件
导入插件类型由代码实现
PluginHelper::importPlugin($pluginType, …);
插件被分类为类型,这些类型与 Joomla 实例的插件文件夹内的子目录相匹配。
例如,在 Joomla 初始化后,系统插件会被导入(即那些在 plugins/system 目录中的插件)。
导入插件类型涉及:
- 从数据库中查找与特定类型关联的所有插件 - 类型与文件系统中
/plugins
文件夹的关联子文件夹匹配。在图中,这些插件显示为plugin1
、plugin2
和plugin3
。 - 实例化每个插件。
- 确定每个插件要订阅哪些事件。
- 将订阅写入图中
Listeners
框表示的数据存储中。
以这种方式按插件类型拆分插件使 Joomla 性能更高 - 它不需要处理那些不会对即将触发的事件感兴趣的插件。
第二步是通过调用事件调度器来触发事件。Joomla 查找其 Listeners
存储,以确定哪些插件已订阅该事件类型。然后,它调用订阅插件的关联方法,并将事件数据传递给它,通常允许插件代码修改该数据。
每个已订阅该事件的插件都会依次被调用(基于优先级方案),并且插件返回的任何结果都会被整理到与该事件关联的数组中。
例如,在 Joomla 初始化后,系统插件会被导入,并且 onAfterInitialise
事件会被触发。“记住我”插件(位于 plugins/system/remember 中)会收到此通知,并且可以登录之前在登录表单上选中“记住我”复选框的用户。
一旦插件被导入,并且其订阅被记录在 Listeners
数据存储中,那么它就会继续接收对其订阅的所有事件的通知。例如,考虑以下场景:
- 系统插件会被导入,并且
onAfterInitialise
事件会被触发 - 一段时间后,内容插件会被导入,并且
onContentPrepare
事件会被触发。
在第一步中导入的系统插件可以订阅 onContentPrepare
事件,即使它与内容插件关联,并且如果它们订阅了它,即使没有再次导入,也会收到 onContentPrepare
事件。
您还应该知道,与组件和模块不同,没有不同的网站插件和管理员插件。您安装的插件将在所有不同的上下文(网站、管理员和 API 应用程序)中运行,因此最好在插件中检查应用程序上下文。
对于那些想要更详细地了解插件工作原理的人,请查看下面的时序图。