Block_Word Add-on
단어 차단 애드온 만들기
sol님의 글을 전문인용하여 재구성하였다. - http://xe.xpressengine.net/18229352
block_word 애드온은?
사용자가 쓴 게시물과 댓글이 출력될 때 애드온 설정에 등록해 놓은 문자들을 '***' 로 가려서 보여주는 애드온을 만들어 볼 것 입니다. 애드온에서 단어들을 입력 받고, 또 해당 mid들을 설정하도록 하고, 애드온에서는 javascript 정규식으로 해당 문자를 '***' 로 치환하는 구조로 개발할 것입니다.
개발에 앞서 디렉토리 준비하기
모든 모듈은 XE_ROOT(XE 설치디렉토리)/addons/ 에 위치 합니다. 앞으로 함께 만들 애드온은 block_word이기 때문에 block_word라는 디렉토리를 만들고 하위 디렉토리를 아래와 같이 만듭니다.
addons/block_word/
- conf
애드온의 정보 파일 info.xml 작성하기
모듈과 같이 애드온의 정보 파일인 info.xml에 작성자 및 애드온 정보를 작성합니다.
▶ addons/block_word/conf/info.xml
<?xml version="1.0" encoding="UTF-8"?> <addon version="0.2"> <title xml:lang="ko">단어 차단 애드온</title> <description xml:lang="ko"> 글과 댓글의 내용 중 지정한 단어를 ***와 같이 보이지 않도록 합니다. (XE스쿨 수정 2011.12. 20) </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 변수 값으로 들어 옵니다.
▶ addons/block_word/block_word.addon.php
<?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\">//<![CDATA[\nvar addon_block_word='" . join("|",$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") 중에서 포함된 p와 a 엘리먼트 요소를 찾아 정규식을 이용해 치환합니다.
▶ addons/block_word/block_word.js
jQuery(function($){ if(addon_block_word.length > 0){ $(".xe_content").find("p,a").each(function() { var tmp = $(this).children().remove(); var text = $(this).text(); text = text.replace(new RegExp(addon_block_word,'g'),'***'); $(this).text(text); $(this).append(tmp); }); } });
* class="xe_content" : XE에서 게시판글, 댓글 등의 content를 출력하는 부분입니다.
* $(".xe_content") : class가 xe_content인 node의 jQuery 객체
※ 위키(wiki)에 작성된 내용으로 애드온을 동작시킬 수 없어서 실행파일을 수정하였다. 또한 스크립트 문제로 에디터가 영향을 받아 글작성에 문제가 있어서 JS 파일의 내용을 수정하였다.
완성된 단어 차단 애드온 다운로드
💖 탑돌이님 에게 암호화폐로 후원하기 💖
아이콘을 클릭하면 지갑 주소가 자동으로 복사 됩니다