XpressEngine 기본 패키지에 포함된 애드온 중에는
게시글이나 댓글의 상 / 하단에 원하는 코드를 추가하거나 내용을 변조하는 코드가 있습니다.
이런 종류의 애드온을 제작하는 방법을 알려드립니다.
XpressEngine의 게시글과 댓글은 특별한 설정이 없는한 다음과 같은 형태로 출력이 됩니다.
위와 같이 주석 그리고 div 로 감싸고 게시글이나 댓글의 고유 번호, 작성 회원의 고유 번호로 본문을 감싸서 출력을 하게 됩니다.
이 규칙을 이용하여 원하는 정보를 추가/ 수정/ 삭제할 수 있습니다.
약속된 div 태그의 위치를 정규표현식으로 구하고 추가할 수 있습니다.
이 경우 애드온의 $called_position = "after_module_proc" 여야 합니다.
아래 예제는 게시글의 상단마다 원하는 결과를 추가하는 애드온의 코드입니다.
<?php
if(!defined('__ZBXE__')) exit();
// 출력 결과가 HTML이 아니라면 동작하지 않도록 합니다.
if(Context::getResponseMethod() != '+
'+
'HTML') return;
// called_position을 확인하는 코드를 작성합니다.
if($called_position != 'before_display_content') return;
// 정규표현식으로 $output 이라는 출력 결과물 중 원하는 게시글의 상단을 찾아 바꿉니다.
$output = preg_replace('/<div class="document_([0-9]+)_([0-9]+) xe_content">/is', '<div class="document_$1_$2 xe_content">내용의 상단', $output);
?>
위의 애드온은 모든 게시글의 상단에 "내용의 상단" 이라는 문자열을 출력하도록 합니다.
preg_replace_callback 등의 함수를 이용해서 직접 DB 또는 여타 openAPI와 연동하여 다양한 결과를 추출하여 사용할 수 있습니다.
위의 예제는 게시글이나 댓글의 상/ 하단에 특정 코드를 추가하는 예제입니다.
내용을 변조하기 위해서는 위와 같은 방법으로는 불가능합니다.
정규표현식으로 원하는 구간을 정확히 찾기가 어렵기 때문에 이럴 경우 Javascript를 이용해 DOM으로 접근하도록 하는 방법을 사용할 수 있습니다.
애드온 파일의 내용은 다음과 같습니다.
<?php
if(!defined("__ZBXE__")) exit();
if($called_position == 'after_module_proc' && Context::getResponseMethod()=="HTML") {
Context::addJsFile('./addons/애드온이름/test.js');
}
?>
위의 코드는 모듈이 동작하기 전에 특정 자바스크립트 파일을 출력물의 header 부분에 호출하도록 선언하는 코드입니다.
애드온 파일의 내용은 위의 내용이 전부이고 실제 동작은 Javascript에서 처리 하게 됩니다.
다음은 test.js 파일의 내용입니다.
function alertDocumentContent() {
var objs = xGetElementByClassName('xe_content');
if(objs.length<1) return;
for(var i=0;i<objs.length;i++) {
alert(xInnerHTML(objsi));
}
}
xAddEventListener(window, '+
'load', alertDocumentContent);
위의 코드는 결과물이 출력된 후에 게시글이나 댓글등의 내용을 찾아서 alert() 함수로 출력하는 함수입니다.
위와 같은 방법으로 게시글이나 댓글 등의 내용을 제어하거나 수정할 수 있습니다.
예제가 잘못적혀 있어서 고생했네요.
"게시글 내용의 상/하단에 원하는 코드를 입력하는 방법" 예시의 6번째 줄 소스는$output = preg_replace('/<div class="document_(\d+)_(\d+) xe_content">/is', '<div class="document_${1}_${2} xe_content">내용의 상단', $output);으로 하시면 정상동작합니다.