애드온·위젯 제작
애드온과 위젯은 모듈보다 가벼운 확장 수단입니다.
- 애드온: 모든 요청의 처리 과정에 끼어들어 동작을 더합니다 (카운터, 자동 링크, 닉네임 뱃지 등)
- 위젯: 레이아웃·페이지 어디든 꽂아 넣는 콘텐츠 조각입니다 (로그인 창, 최신 글 등)
애드온 만들기
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->{변수명}으로 읽습니다.
애드온은 관리자 화면의 애드온 목록에서 켜고 끕니다. 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) - 에디터 본문의 위젯 삽입 기능
어느 쪽으로 만들까
| 하고 싶은 것 | 수단 |
|---|---|
| 모든 페이지에서 자동으로 동작 (표시·치환·기록) | 애드온 |
| 관리자가 원하는 자리에 꽂는 콘텐츠 박스 | 위젯 |
| 자체 데이터·화면·설정을 가진 기능 | 모듈 |