Extension標籤
xml文件以開頭,表明這是一個Joomla擴展。有四種不同的類型:components, modules, plugins, templates。因此,需要制定type屬性。
<extension type=″component″>
對於插件,還需要指定插件類別,因爲這決定了插件安裝在哪個目錄。
<extension type=″plugin″ group=″content″>
通常還會看到一個版本參數,指的是Joomla核心的版本信息。最終的樣式如下
<extension version=″3.4″ type=″plugin″ group=″content″>
extension標籤是所有其他標籤的父標籤。在xml文件的結尾關閉</extension>
XML頭
通常<extension>
前面還有個XML頭。表明這是個XML文件,最重要的是指定文件的字符集。一般指定爲utf-8.
<?xml version=″1.0″ encoding=″utf-8″ ?>
<extension ….>
…
</extension>
實際上,utf-8可以不用指定。因爲Joomla使用SimpleXML
解析XML,二這個哭默認認爲編碼是UTF-8。建議只使用utf-8編碼。
基本標籤
<extension>
標籤之後,是一些插件的meta信息。首先是插件的名稱,要遵循Joomla的原則。plg開頭,下劃線,插件類型名,下劃線,插件名。
plg_content_ch03test01
This <name>
tag does not contain the technical name as for your plugin on the flesystem.???
名稱標籤也可以使用語言文件翻譯。技術名稱必須全部小寫,語言字符串必須全部大寫。
<name>PLG_CONTENT_CH03TEST01</name>
一般情況下,還應該加一點描述。同樣,只是一個語言字符串,內容放在語言文件中。
接下來是插件版本,隨便寫什麼都行
<version>1A</version>
<version>24 beta</version>
<version>my frst attempt</version>
最好是用x.y.x的格式。
接下來是插件的創建日期,每次修改日期室,修改版本號。
三種日期格式 (August 2014, 08-2014, 08/2014)
<creationDate>August 2014</creationDate>
接下來是作者信息
<author>Jisse Reitsma</author>
<authorEmail>[email protected]</authorEmail>
<authorUrl>http://joomla-plugins-book.yireo.com/</authorUrl>
最後,需要一些法律信息,版權和許可。許可應該是GNU/GPL ,版本2、3都行。因爲Joomla的Extension Directory需要一個LICENSE.txt文件,所以可以指向這個文件。
<license>GNU/GPL version 3 or later; see LICENSE.txt</license>
<copyright>Copyright of Jisse Reitsma (2012)</copyright>
文件&目錄&媒體
<file>
標籤很重要,安裝文件時,表明,那些文件從源包(壓縮文件解壓到的臨時目錄)複製到目標文件夾(/plugin/下的子目錄)。這個標籤中必須總是包含主php文件,
<fles>
<flename plugin=″ch03test01″>ch03test01.php</flename>
<flename>index.html</flename>
</fles>
主php文件還包含一個plugin的參數,這表明當插件被調用時,那個文件被調用。如果主php文件是其他名稱,比如/plugins/content/ch03test01/main.php,
也可以這樣完成。但是最好使用標準命名規則,文件名就是插件名。
注意,這個xml文件不在<file>
標籤中,但是它還是會被拷貝到目標目錄。
一般還要包含一個index.html文件,防止外部瀏覽插件目錄文件,其實可以通過其他方式做到這點,比如.htaccess。但是Joomla這樣要求的,所有的Joomla目錄都有這個文件。
當一個插件邏輯很複雜時,最好是將邏輯文件放在不同的文件中。比如是用helper.php
提供一些方法。如果使用很多的php文件,最好新建一個子目錄。比如,當需要一個新的表格類型時,一個自定義的下拉表,最好新建一個子目錄(別忘了裏面放個index.html文件),絕對路徑是/plugins/content/ch03test01/felds/。
<fles>
<flename plugin=″ch03test01″>ch03test01.php</flename>
<flename>index.html</flename>
<flename>helper.php</flename>
<folder>felds</folder>
</fles>
不必在<file>
標籤中包含LICENCE.txt文件。
如果想要加入一些靜態文件,比如,圖片文件,CSS,JS文件,不要放在插件目錄中,放在/media目錄中。通常這樣做:
<media destination=″plg_content_ch03test01″>
<folder>images</folder>
<folder>css</folder>
<folder>js</folder>
</media>
其中,destination
表示目標目錄在/media/plg_content_ch03test01/
。安裝文件包中應該包括,images,css,js子目錄。
另一種做法是,在壓縮目錄中創建plg_content_test01
,其下包含上面三個子目錄,不帶destination
,這樣寫
<media>
<folder>plg_content_ch03test01</folder>
</media>
使用語言文件
每個語言文件需要一個tag參數,指明是哪種語言。Joomla核心默認是英語,所以至少包含英語(en_GB)
<languages>
<language tag=″en-GB″>
en-GB.plg_content_ch03test01.ini
</language>
<language tag=″en-GB″>
en-GB.plg_content_ch03test01.sys.ini
</language>
</languages>
這兩個文件都會拷貝到/administrator/language/en-GB/
,區別是不帶sys的前臺和後臺都能用,帶sys的只用於後臺使用。如果插件沒有前端,可以忽略不帶sys的文件。帶sys的,會被Plugin Manager自動加載,不需要額外的代碼。如果沒有前端使用的語言,可以把所有的語言翻譯都放到這個文件中
在前端顯示中使用語言文件的方法是,JText::_()方法。使用前,要確保en-GB.plg_content_ch03test01.ini已經加載。默認,插件加載時,是不加載語言文件的。爲確保加載語言文件,Joomla 3 以上的版本,這樣寫
class PlgContentCh03test01 extends JPlugin
{
protected $autoloadLanguage = true;
其他版本的
class PlgContentCh03test01 extends JPlugin
{
public function __construct(&$subject, $confg)
{
parent::__construct($subject, $confg);
$this->loadLanguage();
}
語言文件中也可以使用HTML,需要將HTML標籤先編碼。 < 變成 <
,> 變成 >
PLG_CONTENT_CH03TEST01_DESCRIPTION=″This is an example
<strong>Content Plugin</strong>″
雖然這是個很酷的技巧,但是不要濫用。
安裝時部分和實時信息
XML中有些標籤是Joomla安裝時使用的,比如<file
,一旦安裝完成,這些信息就不需要了。有些tag當訪問一些特定頁面時會被實時讀取,比如Extension Manage會顯示作者、版本和日期。如果在XML文件中修改這些信息,只需要Refresh Cache按鈕,Joomla就會重新解析XML文件。
但是<name>
標籤不行。這個字段在插件安裝時會被拷貝進數據庫。
打包多個擴展
如果想將多個插件打包到一個擴展中,只需要將多個打包文件和一個類型爲pakeage的XML配置文件打包就可以了。這個XML配置文件可以是任何名字。
<?xml version="1.0" encoding="UTF-8" ?>
<extension type="package" version="2.5">
<name>Test</name>
<packagename>test</packagename>
<author>Yireo</author>
<authoremail>[email protected]</authoremail>
<authorurl>http://www.yireo.com</authorurl>
<creationDate>August 2014</creationDate>
<copyright>Copyright 2014 Yireo.com</copyright>
<license>http://www.gnu.org/licenses/gpl-3.0.html</license>
<version>0.0.1</version>
<url>http://www.yireo.com</url>
<packager>Yireo</packager>
<packagerurl>http://www.yireo.com</packagerurl>
<files>
<file type="plugin" id="plg_content_ch03test01" group="content">plg_content_ch03test01.zip</file>
<file type="plugin" id="plg_content_ch03test02" group="content">plg_content_ch03test02.zip</file>
</files>
</extension>
所有<file>
標籤中的字段,都會被解析爲一個單獨的擴展。這樣可以一次安裝多個擴展,唯一需要注意的是服務器的限制,執行時間和最大上傳大小。
添加SQL表達式
XML文件中可以通過標籤方便的規定哪些是安裝時(<install>
)、卸載時(<uninstall>
)、更新時(<update>
)執行的。
<install>
<sql>
<file driver="mysql" charset="utf8">install.mysql.utf8.sql</file>
</sql>
</install>
<uninstall>
<sql>
<file driver="mysql" charset="utf8">uninstall.mysql.utf8.sql</file>
</sql>
</uninstall>
<update>
<schemas>
<schemapath type="mysql">sql/updates/mysql</schemapath>
</schemas>
</update>
使用XML模式進行更新
更新操作稍微複雜。目錄sql/updates/mysql
需要包含每個插件版本的文件,比如0.0.1版本中,要有0.0.1.sql文件;0.0.2版本中,要有0.0.2.sql文件。每個版本都要有個對應的文件,即使是空文件。
安裝0.0.1版本時,顯然只是安裝過程被執行。Joomla還是會在數據庫的#__schemas
表中添加一條記錄,其中ID是#__extensions
表中擴展存儲的ID。如果XML中沒有<update>
標籤的話,這一過程就會跳過。
這就有一個問題,當版本0.0.1不包括<update>
標籤,#__schemas
表中就沒有這條0.0.1這個版本的記錄。當更新到0.0.2時,有一個<update>
標籤,插件就會在#__schemas
表添加一條記錄。但是sql目錄中的SQL更新將不會執行,因爲Joomla沒有標記這是一個實際的模式更新。重裝也不起作用。這就是爲什麼必須從一開始就需要寫上模式文件,除非這個插件確定不需要更新SQL。
手動更新,要更新XML中的版本號,同時更新`#__schemas``表中的版本號。
執行自定義安裝
也可以添加一段在安裝、卸載、更新時執行的代碼。在XML配置文件中通過<scriptfle>
標籤標示,指向一個PHP文件。
<scriptfle>ch03test01.script.php</scriptfle>
文件中需要一個預定義的類和幾個方法,類名命名規則Plg + group + name + InstallerScript
,5個方法可以用
- install(JAdapterInstance $adapter)
- update(JAdapterInstance $adapter)
- uninstall(JAdapterInstance $adapter)
- preflight(string $route,JAdapterInstance $adapter)
- postflight(string $route, JAdapterInstance $adapter)
install(), update() and uninstall()在使勁執行操作是調用。如果失敗,Joomla會回滾。
preflight()在文件被拷貝之前執行。所以,用 preflight(),看看條件是否滿足;用install()執行一些安裝後的操作。
$adapter
和$route
參數
根據文檔,$adapter
指向JAdapterInstance類,在安裝插件時,總是指向它的子類JInstallerPlugin類。$route
包含要執行的工作,比如是安裝、卸載還是更新。由於它只在安裝前,或者安裝完成後執行,不知道是不是更新操作,所以,更新操作沒有這個參數。
要小心使用postflight()
,通常,不能用這個方法返回false,因爲不允許回滾擴展安裝。更糟糕的是,卡住了,不能卸載,因爲找不到XML配置文件。
解決的方法是修改XML代碼。在<extension>
標籤中加入method=″upgrade″
。這讓Joomla複寫存在的文件,允許你強制安裝插件
<extension version=″3.4″ type=″plugin″
group=″content″ method=″upgrade″>
更新擴展
當一個新擴展安裝後,可以添加一個更新服務器,被插入到Joomla的數據庫中。更新服務器被Extension Manager查詢,看看是否有更新。這個特性需要以下幾個步驟:
step1. 標記安裝包爲可更新,如上面的代碼。加上之後,告訴Joomla這個安裝包可以覆蓋已有的文件。
step2.設置更新服務器
<updateservers>
<server type=″extension″ priority=″1″ name=″Test 01″>
http://example.com/ch03test01_update.xml
</server>
</updateservers>
Joomla要到服務器下載這個XML文件。除了這個,URL可以是任何東西,可以是XML文件,PHP文件生成XML文件。但是不能調到其他頁面。
XML文件需要定義最新的插件版本和新插件在哪下載。
<?xml version="1.0" ?>
<updates>
<update>
<name>Chapter 03 / Test 01</name>
<description>Content - Chapter 03 / Test 01 plugin</description>
<element>ch03test01</element>
<type>plugin</type>
<folder>content</folder>
<version>0.0.1</version>
<infourl title="URL">http://example.com/plg_content_ch03test01</infourl>
<downloads>
<downloadurl type="full" format="zip">http://example.com/plg_content_ch03test01.zip</downloadurl>
</downloads>
<maintainer>Yireo</maintainer>
<maintainerurl>http://www.yireo.com</maintainerurl>
<tags>
<tag>ch03test01</tag>
</tags>
<targetplatform name="joomla" version="3.[0123456789]" />
</update>
</updates>
對比配置文件,<extension>
標籤被<update>
取代。很多其他的信息可以拷貝。element對應那麼,folder對應類型。targetplatform標籤很重要,整個update需要制定一個目標平臺,如果需要制定多個,可以用正則簡寫,像上面的例子。