이제!! 2번째 글을 시작합니다. 두번째 글은 간단히 끝내려 합니다. 왜냐?! PHP파일의 기본적인 규칙을 따르고 있는 것 이외에 설명 드릴 수 있는 부분은 많지 않기 때문입니다. 만드는 목적에 따라서 알아야 하는 상황이 너무 다양합니다. 이 글에서는 그래서, 많은 애드온들에서 공통적으로 필요한 내용에 대해서만 설명합니다.

애드온 실행파일(PHP)에서 알아야 할 것들

실행 순서 $called_position

애드온은 XE Core가 모듈을 실행하는 여러단계 사이사이에 실행됩니다. 현재 4군데에서 실행되는데 $called_position이라는 변수에 어디서 실행되는 것인지 정보가 담겨 있습니다. $called_position는 네가지 값을 가집니다. 그 네가지 값은 아래와 같습니다.

  • before_module_init
  • before_module_proc
  • after_module_proc
  • before_display_content

실행하려는 코드가 어디서 실행되어야 하는지 목적에 맞게 이용하시면 됩니다. 예를 들어서 모듈이 로드되고 실행은 되기 전에 애드온 코드가 실행되어야 겠다고 생각하시면 $called_position == 'before_module_proc' 인 순간을 캐치하시면 되고, 모듈 실행이 완료되고 템플릿 코드가 실행된 이후, 레이아웃이 씌어지기 직전에 실행되어야 한다고 생각하시면 $called_position == 'before_display_content'를 선택하세요.

물론, 꼼수(XE Core가 업데이트 되면 실행을 보장할 수는 없습니다.)를 조금 부리면, XE Core구조상 약간은 변칙적인 방법으로 애드온 실행 위치를 바꾸어 끼워넣을 수 있습니다만, 이 글에서는 다루지 않겠습니다.

if($called_position != 'before_display_content' || Context::getResponseMethod() != 'HTML') return;

위 코드와 같이 쓰게 되면, 위 코드 아래에 적힌 코드들은 before_display_content에서만 실행됩니다. 그리고 HTML모드로 실행되고 있는 경우에만 코드가 실행되는데, 이 부분을 이제 다루어 보도록 합시다.

파일 인코딩

파일 인코딩은 UTF-8로 저장하셔야 합니다.

그런데!! UTF-8로 저장을 했는데, 오류가 나는 경우가 있습니다. 이는 대부분 BOM(Byte Order Mark)가 파일에 입력되었기 때문입니다. 인터넷에 'UTF-8 BOM'으로 검색해 보시면 해결책을 많이 얻으실 수 있습니다. 참고하시기 바랍니다.

파일 이름

PHP 파일의 이름은 정해진 형식에 맞추어져야 합니다. 그렇지 않으면 실행이 안되어요 ㅠ;;

만약 애드온 디렉토리 명이 abc라면 PHP 파일 이름이 abc.addon.php여야 실행이 됩니다.
정리하면, ./addons/abc/abc.addon.php 와 같은 위치에 파일이 위치하겠지요.

알아두면 좋은 것들

if(!defined("__ZBXE__")) exit();

애드온 실행파일 맨 앞에 써주면 좋습니다. 혹시나, 애드온 파일이 위치한 곳으로 직접 접속하더라도, XE를 통한 실행이 아니면, 실행되지 않도록 합니다.

요청 방식 구분하기 Context::getResponseMethod()

애드온만의 실행 조건으로 XE가 배려하고 있는 것은 사실 called position이 유일합니다. 그렇지만,  Context::getResponseMethod()도 자주 쓰이니 알아두도록 합시다.

 Context::getResponseMethod()은 XE 실행 중에 값이 바뀌어서 다른 값을 반환하기도 하지만, 세가지 값 중 하나를 가지는 것이 기본입니다. 그 세가지 값은 아래와 같습니다.

  • HTML
  • XMLRPC
  • JSON

눈치가 빠르시면 대충 감이 오실 것입니다. HTML이 일반적으로 사람이 보게되는 페이지입니다. HTML 규격으로 출력이 되지요. 일반적으로 브라우저가 어떻게 요청을 보내냐에 따라서 처음 결정이 된 값이 XE Core의 판단에도 바뀌지 않으면 그 값을 유지하는 것 같습니다. 그렇지만, XE Core 판단에 따라 중간에 값이 바뀌기도 합니다. 어떤 상황에 애드온이 동작할 것인지 스스로 판단하여 적절한 값을 확인하도록 합시다~!

XMLRPC는 XML규격으로 출력되는 모든 페이지가 가지는 규격입니다. 다만, RSS와 ATOM 페이지의 경우에도 XMLRPC를 가지지만, 제 기억에 모듈 실행 전 후로 HTML이었다가 XMLRPC로 바뀌는 것으로 아는데, 자세한 것은, 만드시는 분이 확인하셔야 합니다.

JSON은 JSON으로 응답할때 갖고 있는 값입니다.

XE Core의 많은 변수들을 주고 받게 해주는 Context::get()과 Context::set()

애드온은 모듈이 실행되는 중간에 끼어서 변수를 조작하는 것이 주 목적입니다. 그러려면, XE내에서 변수를 주로 어떻게 불러오는지, 어떻게 설정하는지 알아야겠지요? ^^

이미 함수 이름에서 분위기가 팍팍 풍기고 있습니다. 네! Context::get()은 변수에 할당된 값을 가져오는 함수이고 Context::set()은 변수에 값을 설정하는 함수입니다.

Context::get()

Context::get('변수명') 이런 식으로 씁니다. 이런 식으로 많은 변수들을 불러올 수 있는데, post나 get방식으로 전달된 변수들도 이렇게 불러올 수 있습니다.

자주 쓰이는 변수로 mid와 document_srl이 있는데, Context::get('mid'), Context::('document_srl')과 같은 식으로 불러옵니다.

Context::set()

Context::set('변수명', 값) 이런 식으로 씁니다. 예를 들어서 $data 라는 변수에 어떤 값이 있고 이를 xe_data라는 변수에 넣고 싶다면, Context::set('xe_data', $data);라고 쓰면 됩니다.

before_display_content 에서 $output

$called_position이 4가지 값을 가지고, XE가 한회 요청으로 실행되는 동안 4번 애드온이 실행된다고 앞에 말씀 드렸습니다. 그런데 이 네번 중에 가장 마지막이 before_display_content입니다. 모듈 처리가 완료되고 레이아웃 씌우기 직전이지요. 이때 $output이라는 데이터를 자주 이용하게 됩니다. $output은 모듈이 처리하고 이제 막 출력될 데이터를 가지고 있습니다. 그래서 이 부분을 많이 가공하게 됩니다.
어떤 값을 가지고 있는지 관심 갖고 지켜봐주세요 ^^;

debugPrint()

debugPrint()는 적절히 이용하면 편리합니다. 확인해보고 싶은 값이 있다면, debugPrint($sth)과 같은 식으로 쓰기만 하면 됩니다.

이렇게 쓴 값을 확인하고, debugPrint가 값을 출력하도록 설정하기 위해서는 한가지 선행 작업이 필요합니다.

./config/config.inc.php

./config/config.inc.php 는 XE의 기본 환경 설정을 해주는 파일입니다. 이 파일 내용을 잘 읽어보면,

if(!defined('__DEBUG__')) define('__DEBUG__', 0);
부분과

if(!defined('__DEBUG_OUTPUT__')) define('__DEBUG_OUTPUT__', 0);
부분, 등 __DEBUG라는 머릿말을 가진, 전역변수 선언 부분이 상당히 많습니다. 주석을 잘 읽어보시고 원하는 값으로 설정하시면, debugPrint 함수를 유용하게 쓰실 수 있을 겁니다.

그리고 마지막으로, debugPrint 함수는, 배포 전에 모두 제거합시다. 크지는 않지만, 속도를 잡아먹는답니다 ^^;;

참고하면 좋은 파일들

config.inc.php파일을 열어보셨으면 아시겠지만, XE는 로딩 되기만 하면, class파일들을 많이 불러옵니다. 가능하면 이 파일 내용들을 알아서, 이 파일안에 있는 유용한 함수(메소드? 뭐라고 부르던)를 잘 쓰도록 합시다.
개인적으로 Context클래스와, Display 클래스, FileHandler 클래스를 많이 참조하게 되더군요.
또 기본적으로 불러오는 함수 파일에 ./config/func.inc.php 가 있습니다. 문자열 자르는 함수와 해킹 차단 관련 함수들이 모여있습니다. 여러 잡다구리한 함수도 많으니 관심 있으시면 한번 구경해보세요 ^^;; 호환성을 위한 함수들도 있는데, 이 부분은 잘 안쓰게 되더군요... ^^;;

그 외에 PHP 외부 자바스크립트나 CSS등에서는 jQuery를 이용하시고 x.js는 이용하지 않기를 바랍니다. x.js는 XE 초기에 jQuery를 도입하기 전 jQuery가 이렇게 자랄줄 몰랐을때(???) 도입된 스크립트 입니다. 차츰 비중을 줄이고 제거할 것으로 보입니다. 현재 호환성 차원에서 지원하고 있는 것으로 보이니 x.js는 이용하지 마시기 바랍니다.
CSS는 제가 적극적으로 이용하지 않아서 잘 모르겠군요 ^^;;

http://xe.imsoo.net/trackback/2 관련글 쓰기

댓글을 달아 주세요

  1. CloverWorld 2011/07/08 16:02  댓글주소  수정/삭제  댓글쓰기

    헤헤~~ 잘보고갑니다~^^