在元件中支援外掛

From Joomla! Documentation

This page is a translated version of the page Supporting plugins in your component and the translation is 100% complete.

Other languages:
Deutsch • ‎English • ‎Türkçe • ‎中文(台灣)‎

Joomla 的事件系統可以彈性地相容於元件、模組以及外掛之間的溝通,透過觀察者模式。這個模式可以簡單地想像成,一種簡易的溝通機制。基本前提是零個,或是多個「觀察者」或「監聽者」將自己註冊到系統,來取得特定的已知事件。在應用程序執行的某個特定時間點,「溝通者」(在我們的架構中是一個元件、模組或是外掛)會發動事件,傳送一些資訊到所有的觀察者那邊。觀察者可以對傳送的資料做出回應,回傳結果給溝通者。

背景

Joomla! 觀察者模式

Joomla! 透過JPlugin (觀察者) 以及 JEventDispatcher (Observable) classes,在全域層級使用 觀察者模式。任何想要接收事件通知的開發者,可以建立一個外掛,擴展 JPlugin class。當他們的外掛類別被載入時,JPlugin 的Subclasses會自動自行註冊到全域的JEventDispatcher class (稍後我們會講到更多)。 JEventDispatcher class is used as a dispatching mechanism that receives events from the communicators and forwards them on to the listeners that have been loaded. 要了解所有的完整說明,推薦閱讀 外掛開發者總覽

為什麼要成為溝通者

也許您曾經在開發元件的過程中,覺得假如可以通知其他的元件,某些動作被發動了,豈不是好極了。例如,如果您有一個光碟資料庫元件,當一個新的CD資料被加到資料庫時,您決定要讓其他人知道。在這個案例中,您可以寫一個讓大家使用的事件 (比方說 onCdAddedToLibrary) ,在適當的時間點「觸發」事件,將 CD 的相關資料送出來。所有其他應用了本事件的外掛,會獲得通知,並且可以處理想要作的作業 ,實現即時溝通的需求!

實踐

如何成為溝通者

由於所有的傳遞都是由Joomla! 核心來管制,要成為溝通者很容易。 事實上,就只是載入一組特定的外掛,並且呼叫JEventDispatcher class的觸發方法。

您可能會想知道,要如何得知哪些群組的外掛有被載入。這取決於你。外掛依群組的層級管理,這定義於外掛的 XML 佈署檔案。有八種預先定義好的外掛群組,每一個群組如其名稱所示,處理不同的任務。比方說,有個外掛群組名叫 search 是負責處理搜尋工作;另外 user 外掛群組是負責使用者相關的特定工作,如新增或是移除Joomla! 會員。只有在需要的時候,這些外掛群組才會載入,由溝通者來指定。所以您可以建立您自己的外掛群組,自行為它們命名。因為您的元件已經定義好了,所有的監聽者都會清楚地知道哪個元件群組以及事件是他們需要監聽的。

如何觸發事件

這就是本文的重點所在:如何觸發事件,以使外掛可以在元件當中作用,第一件要做的事情就是載入外掛群組,可以用以下的程式碼來實現:

JPluginHelper::importPlugin( 'myplugingroup' );

這會載入所有啟用的外掛,它們會自行定義為您的群組的一部分。下一件要作的事情是要取得 JEventDispatcher class 的實體(instance):

$dispatcher = JEventDispatcher::getInstance();

在這裡要注意兩鍵事情。首先,我們使用了 getInstance() method,而不是 new,來建立新的實例 (instance)。這是因為我們需要取得JEventDispatcher 物件的全域單例實例(singleton instance),其中包含所有可用的外掛清單。

接著,我們需要觸發我們的客製化事件:

$results = $dispatcher->trigger( 'onCdAddedToLibrary', array( &$artist, &$title ) );

現在我們觸發了事件 onCdAddedToLibrary ,並且以artist name以及title傳遞。要傳遞哪些、多少參數,取決與您的需求。使用reference (也就是 &) 傳遞參數可以讓外掛修改傳遞的變數。所有的外掛都會收到這些參數,處理它們,並且(如果需要的話) 將一些資訊傳回。呼叫的程式碼可以透過陣列 $results 來處理回傳的值 (每個元素都對應到一個外掛的結果)。

注意事項

您正在定義一個 API

提供事件來提供其他外掛回應,您正在製作 API。請切記要謹慎的規劃 &ndash 一旦您發佈了您的程式碼,其他的開發者會開始使用您事件的名稱以及參數,之後要修改的話,就會影響到所有正在使用這些參數的外掛相容性。

載入正確的外掛群組

關於觸發的方法,有件事需要注意:沒有定義哪一個群組的外掛要被告知。事實上,所有載入的外掛都不分群組地被告知了。確認您的事件名稱沒有和別的外掛的事件名稱衝突,是很重要的。這在大多數情形下也許不是問題,因為您的元件會載入外掛群組,所以您很清楚哪些被載入了,然而要知道 system 外掛群組在一開始的請求中就會被載入,請確認您沒有任何事件名稱和系統的事件名稱衝突。