外掛引數——Joomla外掛開發
使用引數
Joomla在很多地方可以設定很多引數。每個擴充套件,都可以新增自己的引數或選項。 引數可以設定基本引數,比如,如果一個外掛自動糾錯,應該新增一些引數,讓管理員設定糾錯如何執行。要不要自動把首字母大寫?要不要刪除段首的空格?通過新增引數可以做到這些。
在XML中定義引數
在XML配置檔案中,引數通過<config>
標籤來新增。為外掛新增引數和為元件、模組一樣。
下面的例子顯示一個欄位集,命名為basic
,一個輸入欄位,命名為test
。這個欄位允許管理員儲存一個值,一遍以後再PHP程式碼中使用。
<config> <fields> <fieldset name="basic"> <field name="test" type="text" defalut=''Hello World'' label="PLG_CONTENT_CH04TEST01_FIELD_LABEL_LABEL" description="PLG_CONTENT_CH04TEST01_FIELD_LABEL_DESC" />
當使用Plugin Manager時,它會讀取這個XML檔案,自動轉換為HTML,顯示在編輯區域。
上面的例子是一個欄位集和一個輸入框。Joomla允許很多的欄位集和表格欄位。甚至可以自定義欄位。比如,可以建立一個自定義的下拉框。
<fieldset name="basic">
字符集沒有標籤。Joomla自動為basic和advanced新增標籤。也可以通過lable
引數自定義標籤。如果沒有lable值,將會自動填充為COM_PLUGINS_CUSTOMX_FIELDSET_LABEL
。這個語言字串在com_plugin中定義了。
引數存在哪?如何儲存的? 當使用Plugin Manager
#__extensions
中的params中,以Json的格式儲存。當從資料庫中讀取後,JSON資料解碼為JRegistry
物件,並繫結到外掛物件上。這些是自動完成的。
更多欄位型別
最通用的四種:text, textarea, list, radio。還有些複雜的,比如calendar
,combo
, color
,email
, password
。
例子,
<field name="align" type="list" default="left" label="PLG_CONTENT_CH04TEST01_FIELD_ALIGN_LABEL" description="PLG_CONTENT_CH04TEST01_FIELD_ALIGN_DESC" > <option value="left">PLG_CONTENT_CH04TEST01_FIELD_ALIGN_OPTION_LEFT</option> <option value="right">PLG_CONTENT_CH04TEST01_FIELD_ALIGN_OPTION_RIGHT</option> <option value="center">PLG_CONTENT_CH04TEST01_FIELD_ALIGN_OPTION_CENTER</option> </field>
下拉列表框通過<option>
標籤,來顯示選項。
在php檔案中使用引數
在外掛的php檔案中,使用$this->params
這個物件,這是一個JRegistry
,包含一個get()
方法,引數名作為第一個引數,第二個引數是如果讀取為空的時候的預設值。
public function onContentBeforeDisplay(
$context, &$row, &$params, $page = 0
)
{
$test = $this->params->get(′test′, ′Hello World′);
$row->title = $row->title . ′ [′ . $test . ′]′;
$row->text = $row->text . ′<p>[′ . $test . ′]</p>′;
}
$params
和 $this->params
的區別:
onContentBeforeDisplay()
有四個引數,第三個是$params
,也是一個JRegistry
物件。區別是, $this->params
包含本外掛引數,$params
包含的是內容型別引數。比如,檔案外掛的引數就是Article Manager中的引數。
安全問題:
如果是呼叫個數值,可以做下強制轉換
$integer = (int) $this->params->get(′integer′);
如果用的下拉列表,可以看看是不是在選項中
$value = $this->params->get(′color′);
if (in_array($value, array(′yellow′, ′red′, ′blue′)) == FALSE)
{
$value = ′yellow′;
}