개발자 가이드

애드온·위젯 제작

애드온과 위젯은 모듈보다 가벼운 확장 수단입니다.

  • 애드온: 모든 요청의 처리 과정에 끼어들어 동작을 더합니다 (카운터, 자동 링크, 닉네임 뱃지 등)
  • 위젯: 레이아웃·페이지 어디든 꽂아 넣는 콘텐츠 조각입니다 (로그인 창, 최신 글 등)

애드온 만들기

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)
  • 에디터 본문의 위젯 삽입 기능

어느 쪽으로 만들까

하고 싶은 것수단
모든 페이지에서 자동으로 동작 (표시·치환·기록)애드온
관리자가 원하는 자리에 꽂는 콘텐츠 박스위젯
자체 데이터·화면·설정을 가진 기능모듈