만지고 있는 모듈이 서드파티다보니까 아무래도 글쓰기(document 모듈)나 댓글쓰기(comment 모듈) 범주에 들어가지 않아서 코어에 포함된 스팸필터 모듈의 리캡챠 적용이 어려웠는데요.
찾다 찾다 스팸필터 컨트롤러에 있는 triggerCheckCaptcha 함수를 일부 복붙 및 응용하는 노가다로 일단 서드파티 적용에 성공을 하기는 했습니다.
(참조 변수로 들어가는 act의 허용 기준이 고정되어 있어서($_captcha_actions) 해당 트리거 함수를 바로 가져다 쓰기는 애매하더라구요ㅜ)
비회원들의 콘텐츠 작성을 허용하는 모듈을 제작한다는 기준으로 보면 대강 이렇습니다.
1. 모듈 설정에서 캡챠 사용 폼 만들기
- 일단 당연히 관리자 페이지 모듈 정보 세팅에 캡챠 사용 폼을 만들어줘야 하구요.
(예. 모듈명/tpl/insertmodule.html)
<div class="x_control-group"> <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() 함수)
if ( $this->module_info->use_captcha === 'Y' ) { $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)
<div class="ap_command"> {$captcha} <button class="navi_btn black" type="submit">{$lang->cmd_registration}</a> </div>
- 그 뒤 css 등을 조정해주면 아래와 같이 뜹니다.
- 저는 css를 이렇게 해서 가운데 정렬했습니다.
.ap_command .g-recaptcha { display: table; margin: 0 auto 12px; }
4. 캡챠 체크 동작 설정
- 물론 이것만으로 캡챠 사용이 되는 건 아닙니다. 여기까지는 화면에 띄우는 것이구요. 글쓰기 입력 폼 전송시에 캡챠가 작동해야 합니다. 따라서 모듈명.cotroller.php의 컨텐츠 작성 함수 적당한 곳에 다음과 같이 기입해줘야 합니다.
(예. 모듈명.cotroller.php의 procScheduleInsertSchedule() 함수)
if ( $this->module_info->use_captcha === 'Y' ) { $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(); } }
- 이렇게 하면 캡챠가 비로소 정상작동하게 됩니다. 만약 캡챠 체크를 하지 않고 등록을 하게 되면 이런 경고창이 뜨게 됩니다. 캡챠 적용에 성공을 했다는 뜻이지요.
이것으로 오늘도 즐거운 라이믹스 생활이 될 것 같습니다 :)