2011-02-11 45 views
0

我必須創建一個插件,它應該響應不屬於插件安裝文件中指定的組的事件。插件來響應多個羣組事件

所以我需要一個關於如何在不創建單獨插件的情況下完成此任務的建議。

如果我創建一個新的插件組(通過在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

首先,您不需要撥打registerEvent。如果你延長JPlugin,它會自動爲你做。 (因此不需要global $mainframe;

其次,不要使用PHP4風格的構造函數。 J 1有對象類,將使你的工作:

function __construct(& $subject, $config) { 
    parent::__construct($subject, $config); 
} 

現在,至於你的問題,組只有當加載插件時很重要。他們執行無關緊要。因此,如果您將其作爲系統插件創建,它將始終加載並將響應您有方法的所有事件。除非你想控制何時實例化,否則真的不需要創建你自己的組...

這是否合理?

+0

我會盡快做到這一點,並讓您知道結果。 – jithujose 2011-02-11 17:21:47

0

認證插件是極少數例外之一 - 它們必須單獨完成。身份驗證插件在任何系統插件運行之前都會運行,所以到系統插件運行時爲時已晚。

插件基於Dispatcher/Listener模式。加載時的插件告訴「Dispatcher」它感興趣的事件是什麼事件以及該事件發生時要調用哪個函數。另一方面,Joomla告訴Dispatcher何時發生事件,並向處理事件發送一些可能需要的數據,並且Dispatcher通知註冊的偵聽器。

羣組[系統,用戶,內容]僅僅是聽衆感興趣的事件的集合 - Joomla!將在不同的時間加載不同的組。因此,來自系統組的聽衆總是在認證之後加載 - 只有在內容等情況下才能加載來自內容組的監聽器。

「調度員」一般是正確的 - 但Joomla!確實允許多個調度員。在用戶被授權之前,加載一個專門的認證調度程序,該認證調度程序在認證後被丟棄並由「真正的」調度程序替換。