ch03XML配置文件的寫法——Joomla插件開發

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標籤先編碼。 < 變成 &lt; ,> 變成 &gt;

PLG_CONTENT_CH03TEST01_DESCRIPTION=″This is an example
&lt;strong&gt;Content Plugin&lt;/strong&gt;″

雖然這是個很酷的技巧,但是不要濫用。

安裝時部分和實時信息

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個方法可以用

  1. install(JAdapterInstance $adapter)
  2. update(JAdapterInstance $adapter)
  3. uninstall(JAdapterInstance $adapter)
  4. preflight(string $route,JAdapterInstance $adapter)
  5. 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需要制定一個目標平臺,如果需要制定多個,可以用正則簡寫,像上面的例子。

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