如何開發一個Joomla插件

介紹
Joomla插件可用作各種用途。插件爲網站的輸出頁面增加了更多的表達方式,並且具有安裝功能。

插件類型
儘管Joomla的插件類型幾乎是無限多的。但他們有8個核心的類型。這些核心類型,分類存放在/plugins/目錄,他們是:

  • authentication
  • content
  • editors
  • editors-xtd
  • search
  • system
  • user
  • xmlrpc



Authentication 插件允許你對不同的來源進行驗證。當你登陸的時候可以通過Joomla的用戶數據庫進行驗證。然而有很多其它的方式,也是可以的,例如:Google的OpenID(開放式用戶中心身份標識),LDAP(輕量目錄訪問協議)和很多其它的方式。無論哪種來源,有其開放API,你都可以寫一個驗證插件,以確認登陸的身份。例如你可以寫一個Twitter賬戶的驗證插件,因爲他們提供了開放API。

Content 插件用於在顯示文章內容時改變或增加一些內容。例如content插件可以隱藏文章種的email地址,或者用自己的方式格式化URL地址。content插件也可以在文章種搜索特定的標記,然後將他們替換爲其它的文本或者HTML。例如在名爲Load Module插件中,將會啓動所有在banner1位置的模塊,並且把{loadmodule banner1}標記,替換成他們的輸出內容。

Editor 插件允許你增加新的內容編輯器(常用的有WYSIYWG)

Editor-XTD(擴展)插件允許你editor上增加某些功能按鈕。例如現有的默認editor下的幾個按鈕:Image(增加圖片),Pagebreak(插入分頁符)和Read more(閱讀全文)按鈕。

Search 插件允許你在不同的組件,不同的文章中進行搜索。比如文章系統的search插件:Contacts 、Weblinks 

System 插件允許你在Joomla站點的各個地方使用PHP代碼執行各種動作。

User 插件允許你在不同的時候執行針對於用戶的動作。包括登錄時、登出時,還有存儲用戶數據的時候。用戶插件中最典型的在不同web應用之間進行橋連接(bridge)。例如建立一個Joomla與Phpbb之間的橋連接。

XML-RPC 插件允許你爲網站提供一個XML-RPC服務。當你的網站爲其它應用程序(或許是個桌面應用程序)提供網絡服務(web services)的時候,它爲你提供了遠程交互的能力。網絡服務真的是一個高深的話題,這裏沒辦法講的太詳細。

基礎的文件
當然一個插件會有一些文件,其中有兩個文件必須使用特定的文件名。當我們研究關於文件的內容時,首先我們必須確定插件的類型,他們必須是某種內置的文件類型(authentication,content,editors,editors-xtd,search,system,user,xml-rpc)。或者你可以在/plugins/目錄下建立個自己的目錄,創建自己的某種插件類型。關於authentication的插件文件,需要放在/plugins/authentication/目錄下,system插件的文件放在/plugins/system/目錄下,其它也一樣。

讓我們看下如何建立一個System類型的名爲Test的插件的文件架構。插件文件的命名沒有特別的規則(唯一要強調的是不要使用數字開頭),但是一旦你決定 了文件名稱後,插件的其它部分,需要遵守這個命名規則。

在這個插件中,首先建立一個PHP文件,test.php,用於Joomla進行載入。還需要建立一個XML文件,text.xml,在文件中,可以建立一些標識和插件的安裝信息(同時也做爲插件的參數)。

test.php文件源代碼如下:

<?php
// no direct access
//禁止非Joomla程序直接調用
defined( '_JEXEC' ) or die( 'Restricted access' );

jimport( 'joomla.plugin.plugin' );

/**
 * Example system plugin
 * system插件例子
 */
class plgSystemTest extends JPlugin
{
 /**
  * Constructor
         * 構造函數
  *
  * For php4 compatibility we must not use the __constructor as a constructor for plugins
  * because func_get_args ( void ) returns a copy of all passed arguments NOT references.
  * This causes problems with cross-referencing necessary for the observer design pattern.
  *
         *爲了兼容php4,不能直接使用__constructor做爲插件的構造函數。
         *返回的是所有參數的拷貝,而不是引用。
         *交叉引用是Observe設計模式必須的。
  * @access protected
         *權限:受保護的
  * @param object $subject The object to observe
  * @param  array   $config  An array that holds the plugin configuration
         *一個數組,用於存儲插件配置
  * @since 1.0
  */
 function plgSystemTest( &$subject, $config )
 {
  parent::__construct( $subject, $config );

  // Do some extra initialisation in this constructor if required
                //如果需要,可以在這裏做一些額外的初始化
 }

 /**
  * Do something onAfterInitialise 
         * 初始化後,做些什麼事
  */
 function onAfterInitialise()
 {
  // Perform some action
                // 執行一些動作
 }
}

讓我們仔細的看一下源代碼。請注意,很多php文件中常見的內容唄省略了。

文件通過檢查常量_JEXEC開始,用於確保文件不會被直接通過url引用。這是個很重要的安全點,並且這行代碼必須放在文件的最前端。做這項安全檢查是非常非常重要的。

下面我們使用了jimport函數載入了庫文件中定義的JPlugin類。
你會注意到一個插件僅僅是一個繼承自JPlugin的類。(這個不同於以前版本的Joomla)。類的命名規則是很重要的。
命名公式如下:
plg+插件目錄+無擴展名的插件文件名。要將單詞的首字母大寫,類似於“Camel Case”。雖然PHP的類對大小寫是不敏感的,但這樣會增加代碼可讀性。
在我們的例子中,通過公式,我們得到類名爲:
plg+System+Test=plgSystemTest

讓我們再看一下類裏的方法。

第一個方法,叫做構造函數,是不強制使用的。你可以把在Joomla載入插件後想做的事情寫到裏面。
在helper方法裏,使用JPluginHelper::importPlugin(<plugin_type>)的時候,它就會被執行。這意味着,即使插件從來沒出發過,你仍然可以執行構造函數裏的代碼。

在PHP4中,構造函數的名稱必須與類名相同,如果你的程序僅僅想支持PHP5的化,你可以把方法名替換爲__constructor。

剩下的方法將會體現出Joomla代碼中觸發事件的名字。在這個例子中,我們知道,它的名字是 onAfterInitialise,當某項應用(application)準備好後,它是第一個被調用的方法。
關於什麼時候事件會被觸發的更詳細介紹請看文檔API執行順序這篇文章。

這個命名規則很簡單:方法名字必須與你要觸發的事件名字相同。Joomla框架會爲你自動註冊類中的發法。

這是基本的PHP文件。它的位置,名字和方法依賴於你建立的插件的用途。有一點需要注意的是system插件不是僅僅處理系統事件。因爲系統插件會在Joomla運行的每一個PHP文件中載入。你可以在一個系統插件中包含任意觸發事件。
Joomla的觸發事件包括:

Authentication

  • onAuthenticate

Content

  • onPrepareContent
  • onAfterDisplayTitle
  • onBeforeDisplayContent
  • onBeforeContentSave (new in 1.5.4)
  • onAfterContentSave (new in 1.5.4)

Editors

  • onInit
  • onGetContent
  • onSetContent
  • onSave
  • onDisplay
  • onGetInsertMethod

Editors XTD (Extended)

  • onDisplay

Seach

  • onSearch
  • onSearchAreas

System

  • onAfterInitialise
  • onAfterRoute
  • onAfterDispatch
  • onAfterRender

User

  • onLoginUser
  • onLoginFailure
  • onLogoutUser
  • onLogoutFailure
  • onBeforeStoreUser
  • onAfterStoreUser
  • onBeforeDeleteUser
  • onAfterDeleteUser

XML-RPC

  • onGetWebServices

關於如何創建特殊插件的介紹,請查看文檔中的插件種類文章。

text.xml
test.xml的代碼如下:

<?xml version="1.0" encoding="utf-8"?>
<install version="1.5.2" type="plugin" group="system" method="upgrade">
 <name>System - Test</name>
 <author>Author</author>
 <creationDate>Month 2008</creationDate>
 <copyright>Copyright (C) 2008 Holder. All rights reserved.</copyright>
 <license>GNU General Public License</license>
 <authorEmail>email</authorEmail>
 <authorUrl>url</authorUrl>
 <version>1.0.1</version>
 <description>A test system plugin</description>
 <files>
  <filename plugin="example">example.php</filename>
 </files>
 <params>
    <param name="example"
    type="text"
    default=""
    label="Example"
    description="An example text parameter" />
 </params>
</install>

這是一個非常典型的XML標識文件的格式。讓我們瞭解一下其中比較重要的標識(tags):
INSTALL
這個install標識,有幾個關鍵屬性。type的屬性必須是"plugin",並且要指定group屬性。group屬性需要設定爲你的文件所在目錄的名字(例如system,content,etc)。我們使用method="upgrade",是因爲要允許安裝插件,而沒有卸載功能。換句話說,如果你與他人分享這個插件,你可以僅僅通過安裝新的版本,去覆蓋舊版本。

NAME
我們通常使用插件的屬性開頭,我們的例子中,插件是system屬性的,並且帶有一定的測試目的,所以我們將插件命名爲:"System - Test"。你可以將NAME以任意方式去起。但通常是以這個格式去起的。

FILES
files標識包含了插件中將要安裝的所有文件名字。插件同樣支持安裝子目錄,所以還要指定所有文件夾的名稱,<folder>test</folder>這是隻有一個子目錄時的例子,很像設置PHP文件的標識一樣(當然沒有擴展名)。

PARAMS
插件可以指定任意多數量的參數。請注意,就如同模塊和組件中的參數一樣,沒有高級羣組。(大概是指每個參數只能單獨設置)

打包插件
打包插件非常簡單。如果你只有兩個文件(PHP文件和XML文件),只要將他們壓縮爲一個zip文件即可。如果有子目錄,也一同壓縮進去。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章