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 객체


ajun

2010.07.22 09:55:07
*.225.107.17

  위에 든 예문에 타이핑 에러가 있었는가 봅니다.
script선언문 사이에 어떤 javascript가 들어 가나요?


// <head></head> 사이에 등록
            $js = "<script type=\"text/javascript\">//<!",$block_words) ."';\n//]></script>";
            Context::addHtmlHeader($js);

profile

씨지

2010.11.25 12:58:01
*.10.175.181

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>";

라고 써있네요.

시나브로74

2010.07.22 10:18:52
*.33.226.74

1.4.3에서 정상적으로 작동하질 않네요.. 빈화면만 나오네요 -.-

 

Internet Explorer에서 웹 페이지를 표시할 수 없습니다.

SMaker

2010.07.22 17:29:53
*.22.160.34

아마 위키 모듈이 업데이트되면서 이 문서도 같이 업데이트 되지 않아 생긴 문제 같네요.


수정해볼려고 해봤는데 수정이 안되네요.


노가다로 고쳐볼 생각입니다.

profile

씨지

2010.11.25 12:59:57
*.10.175.181

댓글에도 처리가 되긴하는데 본문(문서)의 글내용이 덮어써져버리고
제목에는 적용이 안되는군요.

"호출순서에서 맨 마지막인 before_display_content 에서 호출 합니다." 라는 설명이지만 코드에는 'after_module_proc'로 되어있습니다.
두가지 경우 다 작동을 하긴하는데... 어느게 맞는것일지...??

그래도 참고는 됩니다. 감사합니다.