跳到主要內容
文件

開發者指南

附加元件・小工具製作

附加元件與小工具是比模組更輕量的擴充手段。

  • 附加元件:介入所有請求的處理過程並加入動作(計數器、自動連結、暱稱標章等)
  • 小工具:可插入版面・頁面任何位置的內容片段(登入視窗、最新文章等)

製作附加元件

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)
  • 編輯器內文的插入小工具功能

該選哪一種

想做的事手段
在所有頁面自動運作(顯示・取代・紀錄)附加元件
管理者插在想要位置的內容方塊小工具
擁有自己的資料・畫面・設定的功能模組