본문
예제를 통해 알아보는 XE Addon 개발하기
해당 압축파일을 받으면 hellomaster라는 폴더 아래에 hellomaster.addon.php라는 파일과, conf/info.xml 파일을 볼 수 있다. conf/info.xml파일에는 애드온의 정보와 추가적인 변수를 설정해 줄 수 있으며, addon.php파일은 말그대로 원하는 기능을 담는 소스를 의미한다. 우선 conf/info.xml을 보자.
* conf/info.xml
</extra_vars>
중요한 부분은 <extra_vars>의 <var>아래 부분이다. 관리자의 메일주소를 관리자 페이지에서 입력하면 이 값은 admin_mail이라는 변수로 등록되어 애드온에서 사용될 수 있다. 아래의 애드온 관리자 페이지 화면을 보면 이해가 쉽게 될 것이다.
[그림 1] 애드온 관리자 페이지.
다음으로는 핵심 코드인 hellomaster.addon.php를 살펴본다. 뒷부분은 프로그램 실행코드이며 애드온과는 큰 상관이 없기 때문에 생략한다.
hellomaster.addon.php
/**
* @author 퍼니온 개발팀 (kawon@paran.com)
* @brief 게시판에 글 등록시 : 관리자의 개인비서에게 실시간 알림 메세지 전송
* 댓글 등록시 : 작성자의 개인비서에게 실시간 알림 메세지 전송
**/
if(!defined("__ZBXE__")) exit(); //만약 모듈이 XE를 통하지 않고 개별적으로 호출될 때 exit()로 탈출한다.
if(
($this->act == 'procBoardInsertDocument' || //게시판에서 게시물을 등록할 경우
$this->act == 'procBoardInsertComment' || //게시판에서 댓글을 달경우.
$this->act == 'procKinInsert' || //지식인이라는 모듈에서 지식이 등록되었을 경우? 보통은 사용되지 않는다.
$this->act == 'procKinInsertReply' ) //마찬가지로 지식인 모듈에서 덧글이 달릴경우.
&& $called_position == 'after_module_proc'){ //모듈 객체의 실행 method가 실행된 후에 호출하겠다.
if(!$addon_info->mid_list) $selected = true; //"특정 모듈에서 애드온 사용" 옵션을 지정하지 않았을 경우.
else {
$selected = false; //우선 현재 호출된 모듈에서는 애드온이 사용되지 않는다는 가정을 하고..
foreach($addon_info->mid_list as $val){ //관리자 페이지에서 지정한 모듈들을 불러온다
if(trim($val) == $this->mid){ //만약 현재 실행되는 모듈과 관리자가 지정한 모듈이 같을경우
$selected = true; //현재 모듈에서는 이 애드온을 사용할 수 있다.
break; //더이상 관리자가 지정한 모듈을 검색할 필요가 없으므로 루프에서 나간다.
}
}
}
if($selected){
$admin_mail = $addon_info->admin_mail; //관리자 페이지에서 '관리자 메일주소'로 표기된 변수.
$admin_mail_list = explode(',', $admin_mail); //쉼표로 구분되므로 쉼표를 기준으로 문자열을 분리한다.
어머 벌써 끝이네. 이대로 끝마치기는 너무 아쉬우므로 공식 위키에 있는 모듈 호출 시점에 대한 글을 첨부해본다.
* 애드온 호출시 전달 변수
호출 시점이 4군데마다 전달되는 변수가 각각 다른 것들이 있고 공통적인 것이 있습니다. 전달변수는 다음과 같습니다.
-
공통 전달 변수
- $called_position
어느 시점에서 호출되는지에 대한 정보가 있습니다.
before_module_init, before_module_proc, after_module_proc, before_display_content 4개의 값중 하나를 가지게 됩니다. - $addon_path
호출된 애드온의 경로를 담고 있습니다. - $addon_info
XE의 애드온들은 각각 독자적인 설정과 애드온이 동작하기를 원하는 대상 모듈을 지정할 수 있습니다.
이 정보들이 $addon_info 변수를 통해서 전달됩니다.
- $called_position
-
$called_position = before_module_init
before_module_init 호출은 ModuleHandler::__construct() 에서 호출이 됩니다.
ModuleHandler Class의 native code와 같이 동작하게 되고 이 시점에서는 아래와 같은 변수가 등록이 됩니다.
다만 아래 값들은 Context::get() 을 통해 request argument의 변수들을 설정한 것일 뿐 검증된 것은 아닙니다.
blogAPI라는 애드온은 $this->act == 'blogAPI' 일 경우 동작하는 애드온이며 이와 같이 XE가 동작하기 전의 시점에 무언가를 설정하는 시점으로 이해하시면 됩니다.- $this->module : 요청된 $module 변수값
- $this->mid : 요청된 $mid 변수값
- $this->act : 요청된 $act 값
- $this->document_srl : 요청된 문서 고유 번호
- $this->module_srl : 요청된 모듈 고유 번호
- $called_position = before_module_proc
ModuleObject::proc() 즉 요청에 의해 생성된 모듈 객체의 실행 method가 동작하기 전에 호출이 됩니다.
요청되어 생성된 모듈 객체의 모든 변수를 사용할 수 있습니다.
$this 지시자를 통해서 애드온 내에서는 모듈의 일부로서 기능을 수행할 수 있습니다. - $called_position = after_module_proc
ModuleObject::proc() 즉 요청에 의해 생성된 모듈 객체의 실행 method가 실행된 후에 호출이 됩니다.
before_module_proc와 마찬가지로 요청에 의해 생성된 모듈 객체의 모든 변수가 사용 가능합니다.
다만 $output 이라는 변수를 통해서 모듈의 동작 성공 유무를 파악할 수 있습니다. -
$called_position = before_display_content
모든 처리가 끝난 후 결과값을 출력하기 바로 직전인 DisplayHandler::printContent()에서 호출됩니다.
일반적으로 이 시점은 HTML/JSON/XMLRPC 출력 직전이며 출력 직전에 HTML/JSON/XMLRPC 의 변조를 하기 위할때 사용할 수 있습니다.
예를 들어 회원들의 포인트에 따른 레벨 아이콘등을 결과물에 추가할 수 있습니다.- $oModule : 요청되어 생성된 모듈의 객체
- $output : 출력하려는 HTML/JSON/XMLRPC 결과물
이와 같이 XE의 애드온은 요청되는 시점에 따라서 직접 변수를 조작하거나 참조 할 수 있는 기능을 가지고 있습니다.
참고 : http://xe.xpressengine.net/18180622 (03. 애드온 개발하기)
댓글