XE 애드온 개발하기
XE코어의 간섭쟁이 애드온 이야기...
- 애드온의 이해 - SMaker
- 기초 팝업 윈도우 애드온 만들기
- 단어 차단(block_word) 애드온 만들기 - sol
- 14세이상/미만 연령구분 회원가입 애드온 만들기 - SMaker
XE 애드온의 기초 이해
SMaker님의 글을 전문인용하여 재구성하였다. - http://xe.xpressengine.net/wiki/18180622
- 애드온이란?
- 애드온의 호출 시점
- 애드온 호출시 전달 변수
애드온(Addon)이란?
XpressEngine에서 애드온은 후킹, 즉 정상적인 동작을 가로채는 동작을 합니다. php와 같은 인터프리터 언어에서 가능한 include를 이용하여 동작을 하는 구조입니다. function이나 class로 애드온을 개발하지 않은 이유는 XE의 정상적인 Context에 native code처럼 끼어들 수 있게 하기 위한 것이였습니다. 이 덕분에 XE의 애드온은 호출 되는 시점에서 native code 처럼 강력하게 동작할 수 있습니다. 다만 매우 신중히 제작해야 전체 동작에 무리를 주지 않게 됩니다.
애드온의 작동방법은 관리자 페이지에서 애드온 모듈을 선택후 동작하기를 원하는 모듈의 enable/disable만 선택 가능하며(체크하고 저장) 상세한 설정이 필요할 경우 해당 애드온과 연동되는 모듈을 찾아 설정해야 합니다. 즉 애드온을 켜고 끈다는 뜻은 전기 스위치처럼 ON/OFF의 개념과 같기 때문입니다.
"원시 코드란 특정 프로세서 및 지침의 집합으로 실행하기 위해 컴파일된 컴퓨터 프로그래밍 (코드)이다. 같은 프로그램이 다른 프로세서가 있는 컴퓨터에서 실행되는 경우, 소프트웨어는 컴퓨터가 원래의 프로세서를 에뮬레이트 할 수 있도록 제공될 수 있다. 이 경우에는 원래 프로그램은 새로운 프로세서의 "에뮬레이션 모드"에서 실행하고 원래 프로세서의 기본 모드보다 거의 확실하게 더 느리게 실행된다.(이것은 기본 모드의 새로운 프로세서에서 실행되도록 프로그램을 다시 작성하고 컴파일 할 수 있다.)"
Native code is computer programming (code) that is compiled to run with a particular processor (such as an Intel x86-class processor) and its set of instructions. If the same program is run on a computer with a different processor, software can be provided so that the computer emulates the original processor. In this case, the original program runs in "emulation mode" on the new processor and almost certainly more slowly than in native mode on the original processor. (The program can be rewritten and recompiled so that it runs on the new processor in native mode.) - http://searchsoa.techtarget.com/definition/native-code
좀더 쉽게 이야기하면 코어라는 프로세서의 중간에 개입하여 원래의 코드 진행을 중간에 가로막고 애드온 자신의 "해야 할 일"을 원래의 소스코드처럼 일한다는 뜻이다. 즉 코어는 자신의 소스코드를 변경하지 않아도 중간에 애드온이 끼어들어 일할 수 있는 여지를 몇 군데 미리 준비해 둔 것이다. 그것이 애드온의 호출 시점(called-position)이다.
애드온의 호출 시점 - XpressEngine의 동작 순서 참고
애드온 호출 시점은 다음 4군데입니다.
- before_module_init - 모듈 객체 생성 이전 : 사용자의 요청으로 필요한 모듈을 찾은후 모듈의 객체를 생성하기 이전을 의미합니다.
- before_module_proc - 모듈 실행 이전 : 모듈의 객체를 실행하고 모듈의 실행을 하기 이전을 의미합니다.
- after_module_proc - 모듈의 동작 이후 : 생성된 모듈 객체를 실행하고 결과를 얻은 바로 후를 의미합니다.
- before_display_content - 결과 출력 이전 : 모듈의 결과물과 레이아웃의 적용을 끝내고 출력하기 바로 이전을 의미합니다.
애드온 호출시 전달 변수
호출 시점이 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(호출 시점)의 4가지 변수값
$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의 애드온은 요청되는 시점에 따라서 직접 변수를 조작하거나 참조 할 수 있는 기능을 가지고 있습니다.