만지고 있는 모듈이 서드파티다보니까 아무래도 글쓰기(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에서 쓴다거나 할 수는 없겠더라구요.
그래서 다소 매뉴얼해져버렸습니다ㅜ