서드파티 모듈에서 스팸필터의 캡챠 적용
만지고 있는 모듈이 서드파티다보니까 아무래도 글쓰기(document 모듈)나 댓글쓰기(comment 모듈) 범주에 들어가지 않아서 코어에 포함된 스팸필터 모듈의 리캡챠 적용이 어려웠는데요.
찾다 찾다 스팸필터 컨트롤러에 있는 triggerCheckCaptcha 함수를 일부 복붙 및 응용하는 노가다로 일단 서드파티 적용에 성공을 하기는 했습니다.
(참조 변수로 들어가는 act의 허용 기준이 고정되어 있어서($_captcha_actions) 해당 트리거 함수를 바로 가져다 쓰기는 애매하더라구요ㅜ)
비회원들의 콘텐츠 작성을 허용하는 모듈을 제작한다는 기준으로 보면 대강 이렇습니다.
1. 모듈 설정에서 캡챠 사용 폼 만들기
- 일단 당연히 관리자 페이지 모듈 정보 세팅에 캡챠 사용 폼을 만들어줘야 하구요.
(예. 모듈명/tpl/insertmodule.html)
<label class="x_control-label">{$lang->captcha}</label>
<div class="x_controls">
<label class="x_inline" for="use_captcha"><input type="checkbox" name="use_captcha" id="use_captcha" value="Y" checked="checked"|cond="$module_info->use_captcha == 'Y'" /> {$lang->use_captcha}</label>
<p class="x_help-block">{sprintf($lang->about_use_captcha, getUrl('', 'module', 'admin', 'act', 'dispSpamfilterAdminConfigCaptcha'))}</p>
</div>
</div>
- 그러면 이렇게 뜹니다ㅎ
2. 콘텐츠 작성화면 스킨 템플릿에 출력할 변수 세팅
- 모듈명.view.php의 콘텐츠 작성 함수 적당한 곳에 아래 구문을 넣습니다.
(예. 모듈명.view.php의 dispScheduleInsert() 함수)
{
$spamfilter_config = ModuleModel::getModuleConfig('spamfilter');
$logged_info = Context::get('logged_info');
if (
isset($spamfilter_config) && isset($spamfilter_config->captcha)
&& $spamfilter_config->captcha->type === 'recaptcha'
&& $spamfilter_config->captcha->target_actions['document']
&& $logged_info->is_admin !== 'Y'
&& ( $spamfilter_config->captcha->target_users === 'everyone' || !$logged_info->member_srl )
&& ( $spamfilter_config->captcha->target_frequency === 'every_time' || !isset($_SESSION['recaptcha_authenticated']) || !$_SESSION['recaptcha_authenticated'] )
&& ( $spamfilter_config->captcha->target_devices[Mobile::isFromMobilePhone() ? 'mobile' : 'pc'] )
)
{
include_once RX_BASEDIR . 'modules/spamfilter/spamfilter.lib.php';
spamfilter_reCAPTCHA::init($spamfilter_config->captcha);
Context::set('captcha', new spamfilter_reCAPTCHA());
}
}
3. 스킨 템플릿에 캡챠 삽입
- 스킨의 글쓰기 파일 적당한 곳에 캡챠를 삽입해줍니다. 위에서 captcha로 set을 했으니 변수는 당연히 {$captcha}입니다.
(예. 모듈명/skins/default/insert.html)
{$captcha}
<button class="navi_btn black" type="submit">{$lang->cmd_registration}</a>
</div>
- 그 뒤 css 등을 조정해주면 아래와 같이 뜹니다.
- 저는 css를 이렇게 해서 가운데 정렬했습니다.
display: table;
margin: 0 auto 12px;
}
4. 캡챠 체크 동작 설정
- 물론 이것만으로 캡챠 사용이 되는 건 아닙니다. 여기까지는 화면에 띄우는 것이구요. 글쓰기 입력 폼 전송시에 캡챠가 작동해야 합니다. 따라서 모듈명.cotroller.php의 컨텐츠 작성 함수 적당한 곳에 다음과 같이 기입해줘야 합니다.
(예. 모듈명.cotroller.php의 procScheduleInsertSchedule() 함수)
{
$spamfilter_config = ModuleModel::getModuleConfig('spamfilter');
$logged_info = Context::get('logged_info');
if (
isset($spamfilter_config) && isset($spamfilter_config->captcha)
&& $spamfilter_config->captcha->type === 'recaptcha'
&& $spamfilter_config->captcha->target_actions['document']
&& $logged_info->is_admin !== 'Y'
&& ( $spamfilter_config->captcha->target_users === 'everyone' || !$logged_info->member_srl )
&& ( $spamfilter_config->captcha->target_frequency === 'every_time' || !isset($_SESSION['recaptcha_authenticated']) || !$_SESSION['recaptcha_authenticated'] )
&& ( $spamfilter_config->captcha->target_devices[Mobile::isFromMobilePhone() ? 'mobile' : 'pc'] )
)
{
include_once RX_BASEDIR . 'modules/spamfilter/spamfilter.lib.php';
spamfilter_reCAPTCHA::init($spamfilter_config->captcha);
spamfilter_reCAPTCHA::check();
}
}
- 이렇게 하면 캡챠가 비로소 정상작동하게 됩니다. 만약 캡챠 체크를 하지 않고 등록을 하게 되면 이런 경고창이 뜨게 됩니다. 캡챠 적용에 성공을 했다는 뜻이지요.
이것으로 오늘도 즐거운 라이믹스 생활이 될 것 같습니다 :)

댓글 8
네, act의 허용 기준이 정해져 있어서 $captcha만 넣는다거나, 트리거 함수만 그냥 가져와서 모듈 php에서 쓴다거나 할 수는 없겠더라구요.
그래서 다소 매뉴얼해져버렸습니다ㅜ