本文へスキップ
ドキュメント

開発者ガイド

アドオン・ウィジェット制作

アドオンとウィジェットは、モジュールより軽量な拡張手段です。

  • アドオン:すべてのリクエストの処理過程に割り込み、動作を追加します(カウンター、自動リンク、ニックネームバッジなど)
  • ウィジェット:レイアウト・ページのどこにでも差し込めるコンテンツの断片です(ログインボックス、最新投稿など)

アドオンを作る

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_name} で読み取ります。

アドオンは、管理画面のアドオン一覧でオン・オフします。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)
  • エディター本文のウィジェット挿入機能

どちらで作るか

やりたいこと手段
すべてのページで自動的に動作(表示・置換・記録)アドオン
管理者が好きな場所に差し込むコンテンツボックスウィジェット
独自のデータ・画面・設定を持つ機能モジュール