我要创建一个插件,该插件应该响应不属于插件安装文件中指定的组的事件。
所以我需要一个关于如何在不创建单独插件的情况下完成此任务的建议。
如果我创建一个新的插件组(通过在xml文件中指定一个新组),是否可以这样做?真的,我尝试过这样做,但没有任何成功。我甚至尝试手动注册事件。 我得到的是:
<?php
defined('_JEXEC') or die('Restricted Access');
jimport('joomla.plugin.plugin');
global $mainframe;
$mainframe->registerEvent('onAuthenticate', 'plgGroupNamePluginName');
$mainframe->registerEvent('onAfterDisplayTitle', 'plgGroupNamePluginName');
class plgGroupNamePluginName extends JPlugin {
function plgGroupNamePluginName(& $subject, $config) {
parent::__construct($subject, $config);
}
function onAfterDisplayTitle(& $article, & $params, $limitstart=0) {
// TODO: Code
}
function onAuthenticate($credentials, $options, &$response) {
// TODO: Some business logic
}
}
我觉得Joomla文档在这方面并不清楚,或者我错过了一些东西。
如果不清楚,请告诉我。 任何帮助表示赞赏。
答案 0 :(得分:0)
首先,您不需要registerEvent
来电。如果您扩展JPlugin
,它会自动为您执行此操作。 (因此不需要global $mainframe;
)
其次,不要使用PHP4样式的构造函数。 J 1有一个对象类,它将使你的工作:
function __construct(& $subject, $config) {
parent::__construct($subject, $config);
}
现在,至于你的问题,组只在加载插件时很重要。它们与执行无关。因此,如果您将其创建为系统插件,它将始终加载并将响应您拥有方法的所有事件。除非您想要控制它何时被实例化,否则实际上不需要创建自己的组...
这有意义吗?
答案 1 :(得分:0)
身份验证插件是极少数例外情况之一 - 它们必须单独完成。任何系统插件之前都会运行身份验证插件,所以在系统插件运行时为时已晚。
插件基于Dispatcher / Listener模式。加载时插件告诉“Dispatcher”它有兴趣了解哪些事件以及在该事件发生时要调用的函数。另一方面,Joomla在事件发生时告诉Dispatcher并向其发送处理事件可能需要的一些数据,Dispatcher告诉已注册的听众。
群组[系统,用户,内容]仅仅是听众感兴趣的事件集合 - Joomla!将在不同的时间加载不同的组。因此,系统组中的侦听器始终在身份验证后加载 - 只有在有内容等情况下才会加载内容组中的侦听器。
“调度员”通常是正确的 - 但是Joomla!允许多个调度员。在授权用户之前,会加载一个特殊的身份验证调度程序,该调度程序在身份验证后被丢弃并由“真正的”调度程序替换。