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.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 객체
http://sol.xpressengine.net/?mid=issuetracker&act=dispIssuetrackerDownload&package_srl=18251826
여기에서 받은 예제 소스파일에서는
$js = "<script type=\"text/javascript\">//<![CDATA[\nvar addon_block_word='" . join("|",$block_words) ."';\n//]]></script>";
라고 써있네요.
위에 든 예문에 타이핑 에러가 있었는가 봅니다.
script선언문 사이에 어떤 javascript가 들어 가나요?
// <head></head> 사이에 등록
$js = "<script type=\"text/javascript\">//<!",$block_words) ."';\n//]></script>";
Context::addHtmlHeader($js);