附加元件・小工具製作
附加元件與小工具是比模組更輕量的擴充手段。
- 附加元件:介入所有請求的處理過程並加入動作(計數器、自動連結、暱稱標章等)
- 小工具:可插入版面・頁面任何位置的內容片段(登入視窗、最新文章等)
製作附加元件
addons/myaddon/
├── conf/info.xml ← 이름·설명·설정 항목
└── myaddon.addon.php ← 본체myaddon.addon.php 會在請求處理的多個時間點被呼叫。目前是哪個時間點,請以 $called_position 變數判斷。
<?php
if (!defined('__XE__'))
{
exit();
}
// 화면 HTML이 완성되기 직전에 한 번 실행
if ($called_position === 'before_display_content'
&& Context::getResponseMethod() === 'HTML'
&& Context::get('module') !== 'admin'
&& !isCrawler())
{
// $output 변수에 완성된 HTML이 들어 있고, 수정하면 그대로 반영됩니다
$output = str_replace('%FOO%', '바꿀 내용', $output);
}主要呼叫時間點:
| $called_position | 時間點 |
|---|---|
before_module_init | 模組執行準備之前 |
before_module_proc | 動作執行之前 |
after_module_proc | 動作執行之後 |
before_display_content | 最終 HTML 輸出之前(可修改 $output) |
注意事項:
- 附加元件幾乎每個請求都會執行。負擔較重的作業(DB 查詢等)請盡量縮小條件後再進行,並將結果快取。
- 管理畫面(
Context::get('module') === 'admin')與非 HTML 回應(JSON 等)通常略過較為安全。 - 在
conf/info.xml中宣告<extra_vars>,即可在管理畫面的附加元件設定中接收值,並在本體中以$addon_info->{variable}讀取。
附加元件在管理畫面的附加元件列表中開啟或關閉,PC/行動版可以分別指定。
製作小工具
widgets/mywidget/
├── conf/info.xml ← 이름·설명·설정 항목(extra_vars)
├── mywidget.class.php ← 본체
└── skins/default/ ← 위젯 스킨
├── skin.xml
└── widget.html本體需繼承 WidgetHandler,檔案名稱・類別名稱必須與小工具名稱相同。
<?php
class mywidget extends WidgetHandler
{
/**
* info.xml의 extra_vars 값이 $args로 들어옵니다.
* 결과 HTML을 출력하지 말고 반환해야 합니다.
*/
function proc($args)
{
$list = $this->getMyList((int)($args->count ?? 5));
Context::set('list', $list);
Context::set('colorset', $args->colorset);
$tpl_path = sprintf('%sskins/%s', $this->widget_path, $args->skin);
$oTemplate = TemplateHandler::getInstance();
return $oTemplate->compile($tpl_path, 'widget');
}
}- 以
conf/info.xml的<extra_vars>宣告的設定,會成為插入小工具畫面中的輸入項目。 - 面板的做法與模組面板相同。編譯以
$args->skin選定的面板資料夾中的範本並回傳。 - 結果請不要 echo,而是 return。小工具會在組合頁面的過程中以字串合併。
使用小工具的地方
- 在版面・頁面的小工具配置畫面中插入
- 在範本 v2 中直接使用:
@widget('mywidget', $args) - 編輯器內文的插入小工具功能
該選哪一種
| 想做的事 | 手段 |
|---|---|
| 在所有頁面自動運作(顯示・取代・紀錄) | 附加元件 |
| 管理者插在想要位置的內容方塊 | 小工具 |
| 擁有自己的資料・畫面・設定的功能 | 模組 |