アドオン・ウィジェット制作
アドオンとウィジェットは、モジュールより軽量な拡張手段です。
- アドオン:すべてのリクエストの処理過程に割り込み、動作を追加します(カウンター、自動リンク、ニックネームバッジなど)
- ウィジェット:レイアウト・ページのどこにでも差し込めるコンテンツの断片です(ログインボックス、最新投稿など)
アドオンを作る
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) - エディター本文のウィジェット挿入機能
どちらで作るか
| やりたいこと | 手段 |
|---|---|
| すべてのページで自動的に動作(表示・置換・記録) | アドオン |
| 管理者が好きな場所に差し込むコンテンツボックス | ウィジェット |
| 独自のデータ・画面・設定を持つ機能 | モジュール |