2014년 03월 XE세미나 XE 애드온 개발 강좌(1/2)

Post on 28-Nov-2014

2.473 views 7 download

description

 

Transcript of 2014년 03월 XE세미나 XE 애드온 개발 강좌(1/2)

XE 애드온

애드온 이란?XE가 실행될 때 중간에 삽입되어 실행되는 프로그램 !중간에 삽입되는 과정을 후킹(hooking) 이라고 표현 !

애드온은 include로 중간에 삽입됨 아래는 ModuleHandler에서 애드온이 삽입되는 과정의 코드

애드온의 역할 및 특징스키마를 가질 수 없음 !모든요청에 대해서 애드온이 실행됨 !모듈이 동작함에 있어서 그 기능을 제한하거나 확장 !간단한 기능 추가를 위해 XE Core 또는 모듈을 수정하게 되면 버전을 업데이트할 때 어려움이 있기 때문에 애드온을 추가해서 원하는 기능을 구현

XE 라이프 사이클URL에 접속한 순간부터 클라이언트에 응답을 보낸 순간까지 XE가 거치는 일련의 과정 !애드온 호출은 체크된 4개의 시점에서 발생 !각 호출 시점은 $called_position 변수로 구분됨

$called_position (호출시점)$called_position은 애드온이 호출 되는 시점에 정의 됨 어느시점에 애드온이 호출되었는지 확인하기 위한 변수

애드온 실행 방식 확인아래 나열된 클래스 메소드를 확인하면 좀더 자세한 애드온 구동방식을 살펴볼 수 있음

!XE_PATH/classes/module/ModuleHandler.class.php ModuleHandler::ModuleHandler() !XE_PATH/classes/module/ModuleObject.class.php ModuleObject::proc() !XE_PATH/classes/display/DisplayHandler.class.php

DisplayHandler::printContent()

$called_position 종류1. before_module_init 모듈을 선언하기 전에 addon을 실행 !2. before_module_proc 모듈을 실행하기 전에 addon을 실행act에 의해 정해진 동작을 수행하기 직전 !3. after_module_proc 모듈을 실행하고 완료된 직후 addon을 실행 !4. before_display_content 결과물 출력을 위한 처리 후 출력하기 전에 addon을 실행

before_module_init

before_module_proc

after_module_proc

$called_position 예시애드온에서 $called_position에 따른 사용예시 !counter 애드온 : before_module_init !member_communication 애드온 : before_module_proc !resize_image 애드온 : after_module_proc !point_level_icon 애드온 : before_display_content

counter

counterController::counterExecute() 은 모듈 처리 작업으로부터 더이상 정보를 얻을 필요가 없으므로 before_module_init 을 사용 !다른 called_position을 사용하면 예외처리가 발생할 경우 counter가 집계되지 않는 문제가 있음

member_communication

닉네임 클릭시 팝업 메뉴에 communication 관련 모듈기능을 추가하기 위한 애드온 !memberModel::getMemberMenu() 에서 메뉴를 추가하는 기능이 모듈 실행이 완료되기 전에 처리되므로 before_module_proc을 사용

resize_image

노출될 페이지에 Context::loadFile()을 통해서 css, js 파일을 추가 !모듈을 처리하면서 페이지 이동등 예외 처리가 발생할 경우 실행되지 않아도 되는 애드온이기 때문에 after_module_proc을 사용

point_level_icon

출력될 html에 div, span, a 태그에 있는 “member_숫자”가 포함된 문자열을 찾아 pointLevelIconTrans()을 실행 !DisplayHandler::printContent() 처리된 html 이 담겨져 있는 $output 변수에 대해서 변경해야 하기 때문에 before_display_content를 사용

애드온 구성

애드온 구성애드온 설치 위치 XE_PATH/addons/ 각 애드온은 애드온 이름의 폴더별로 정의되어 설치됨

!애드온 파일 구성 애드온_이름.addon.php : 애드온 기능 conf/info.xml : 애드온 정보 및 관리자 표시

!관리자 페이지 conf/info.xml 의 내용으로 처리됨 관리자에서 설정한 내용은 files/cache/addons 의 cache 파일과 xe_addons, xe_addons_site DB 테이블에 설정 값 저장

설정 파일 conf/info.xml 구성

/index.php?module=admin&act=dispAddonAdminIndex

info.xml 의 extra_varsextra_vars 애드온에서 설정값을 만들기 위해 선언 xe_addons, xe_addons_site DB 테이블의 extra_vars 필드에 저장됨

!!!!name attribute는 폼 필드의 name attribute 를 설정 type attribute는 text, textarea, select의 폼 필드를 설정 !extra_vars를 통해 선언되고 관리자에서 설정된 값은애드온에서 $addon_info으로 접근할 수 있음

애드온 파일 작성애드온_이름.addon.php !아래와 같이 시작 부분을 작성

파일명(@file), 설명(@brief), 작성자(@author)를 작성 !if(!defined(‘__XE__’)) exit(); XE를 통한 호출이 아닐 경우 동작하지 않기 위한 처리

$called_position을 사용하는 코드 예시어떤 위치에서 애드온을 실행시킬지 아래와 같이 조건식으로 처리

XML 쿼리 사용애드온에서 다른 모듈이 생성한 DB 테이블에 쿼리 사용 애드온 폴더 아래 queries 라는 폴더를 생성하고 XML쿼리문을 만듬

생성된 xml 쿼리는 executeQuery(‘addons.애드온_이름.쿼리ID’,$args); 으로 실행한다. executeQuery(‘addons.addon_ex.getDocumentCount’,$args);

애드온 cache file

애드온을 사용함으로 체크하면 XE_PATH/files/cache/addons 에 설정 값을 저장site_srl 에 따라 pc, mobile의 설정 값을 따로 저장 !0pc.activated_addons.cache.php

감사합니다!developers@xpressengine.com