게시글 및 댓글 조작을 위한 팁

XpressEngine 기본 패키지에 포함된 애드온 중에는
게시글이나 댓글의 상 / 하단에 원하는 코드를 추가하거나 내용을 변조하는 코드가 있습니다.

이런 종류의 애드온을 제작하는 방법을 알려드립니다.

 

게시글/ 댓글의 출력 rule 소개

XpressEngine의 게시글과 댓글은 특별한 설정이 없는한 다음과 같은 형태로 출력이 됩니다.

 

  • 게시글
  1. <!--BeforeDocument(문서 고유 번호, 작성회원 고유 번호)-->
       <div class="document_문서고유번호_작성회원고유번호 xe_content">
          게시글 본문
       </div>
    <!--AfterDocument(문서 고유 번호, 작성회원 고유 번호)-->
  • 댓글
  1. <!--BeforeComment(댓글 고유 번호, 작성회원 고유 번호)-->
       <div class="comment_댓글고유번호_작성회원고유번호 xe_content">
          게시글 본문
       </div>
    <!--AfterComment(댓글 고유 번호, 작성회원 고유 번호)-->

위와 같이 주석 그리고 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);
test.js의 동작은 다음과 같습니다.
 

위의 코드는 결과물이 출력된 후에 게시글이나 댓글등의 내용을 찾아서 alert() 함수로 출력하는 함수입니다.

위와 같은 방법으로 게시글이나 댓글 등의 내용을 제어하거나 수정할 수 있습니다.


profile

YJKim

2010.03.08 09:59:07
*.131.72.182

추천
1
비추천
0

예제가 잘못적혀 있어서 고생했네요.

"게시글 내용의 상/하단에 원하는 코드를 입력하는 방법" 예시의 6번째 줄 소스는

 

 $output = preg_replace('/<div class="document_(\d+)_(\d+) xe_content">/is', '<div class="document_${1}_${2} xe_content">내용의 상단', $output);


으로 하시면 정상동작합니다.