묻고답하기
제가 만든 애드온이 작동을 안합니다!
2015.02.08 04:01
아래 글을 보고 그대로 따라서 애드온을 만들었는데요.
설치된 애드온으로 가보니, 정보가 하나도 안뜨고 설정으로 들어가도 xml 정보가 아예 안뜹니다.
block_word.zip <- 애드온은 이거입니다. (파일첨부)
도대체 뭐가 문제일까요 ㅠㅠ info.xml 파일도 분명 문제되는게 없어보이는데요!!
----------------------------------------------------------------------------------------
block_word 애드온은?
사용자가 쓴 게시물과 댓글이 출력될 때 애드온 설정에 등록해 놓은 문자들을 '***' 로 가려서 보여주는 애드온을 만들어 볼 것 입니다.
애드온에서 단어들을 입력 받고, 또 해당 mid들을 설정하도록 하고, 애드온에서는 javascript 정규식으로 해당 문자를 '***' 로 치환하는 구조로 개발할 것입니다.
개발에 앞서 디렉토리 준비하기
모든 모듈은 XE_ROOT(XE 설치디렉토리)/addons/ 에 위치 합니다. 앞으로 함꼐 만들 애드온은 block_word 이기 때문에 block_word이라는 디렉토리를 만들고 하위 디렉토리를 아래와 같이 만듭니다.
" block_word
o conf
애드온의 정보 파일 info.xml 작성하기
모듈과 같이 애드온의 정보 파일인 info.xml에 작성자 및 애드온 정보를 작성합니다.
<?xml version="1.0" encoding="UTF-8"?>
<addon version="0.2">
<title xml:lang="ko">단어 차단 애드온</title>
<description xml:lang="ko">
글과 댓글의 내용 중 지정한 단어를 ***와 같이 보이지 않도록 합니다.
</description>
<version>0.1</version>
<date>2009-08-14</date>
<author email_address="sol@ngleader.com" link="http://ngleader.com">
<name xml:lang="ko">sol</name>
</author>
<extra_vars>
<var name="word">
<title xml:lang="ko">차단할 문자</title>
<description xml:lang="ko">차단할 문자를 ,로 구분하여 입력해 주세요.</description>
</var>
</extra_vars>
</addon>
block_word 애드온의 경우 관리자가 차단할 단어를 등록해야 합니다. 그래서 <extra_vars> 부분에
<var name="word">
<title xml:lang="ko">차단할 문자</title>
<description xml:lang="ko">차단할 문자를 ,로 구분하여 입력해 주세요.</description>
</var>
와 같이 word 라는 변수명, title과 설명을 입력하면 관리자 화면에서 위와 같은 폼이 생성됩니다.
block_word.addon.php 작성하기
block_word 애드온 회면 출력 단계에서 지정한 단어를 '***' 로 변경해 주면 되기 때문에 XE에서 애드온의 4가지의 호출순서에서 맨 마지막인 before_display_content 에서 호출 합니다.
block_word.addon.php 가 하는 일은 앞에서 info.xml에서 extra_vars에 등록한 word를 받아 XE의 Request 방법인 GET/POST(HTML), XMLRPC, JSON 중 GET/POST(HTML) 일 경우에만 block_word.js 파일을 로드를 하고 block_word.js에서 치환하는 작업을 합니다.
그리고 info.xml의 extra_vars에 등록한 work에 사용자가 등록한 값은 block_word.addon.php에서 $addon_info->word 변수 값으로 들어 옵니다.
<?php
if(!defined("__ZBXE__")) exit();
/**
* @file block_word.addon.php
* @author sol (sol@ngleader.com)
* @brief 단어 차단 애드온
**/
if($called_position == 'after_module_proc' && !in_array(Context::getResponseMethod(),array('XMLRPC','JSON')) {
// info.xml의 extra_vars에서 등록한 word를 변수명으로 관리자가 등록한 값을 받아 정리
$words = explode(',',$addon_info->word);
$block_words = array();
for($i=0,$c=count($words);$i<$c;$i++){
$words$i = trim($words$i);
if(strlen($words$i)>0) $block_words[] = $words$i;
}
// 등록한 단어가 있을시에만 javascript 로드
if(count($block_words)>0){
// <head></head> 사이에 등록
$js = "<script type=\"text/javascript\">//<!",$block_words) ."';\n//]></script>";
Context::addHtmlHeader($js);
// block_word.js 로드
Context::addJsFile('./addons/block_word/block_word.js');
}
}
?>
block_word.js 작성하기
실제 관리자가 설정한 단어를 ***로 치환 합니다. block_word.addon.php에서 선언한 javascript 변수 addon_block_word를 가져와 jQuery로 node 중 css의 class가 xe_content인 $(".xe_content")로 정규식을 이용해 치환합니다.
(function($){
$(function(){
if(addon_block_word.length > 0){
var blocked=$(".xe_content").html().replace(new RegExp(addon_block_word,'g'),'***');
$(".xe_content").html(blocked);
}
});
})(jQuery);
* class="xe_content" : XE에서 게시판글, 댓글 등의 content를 출력하는 부분입니다
* $(".xe_content") : class가 xe_content인 node의 jQuery 객체
[출처] xe 에드온에 도움되는 글|작성자 행복한가족
혹시 모르니 if(!defined("__ZBXE__")) exit(); 를 __XE__ 로 바꿔 보실래요?