만지고 있는 모듈이 서드파티다보니까 아무래도 글쓰기(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>

 

- 그러면 이렇게 뜹니다ㅎ

0.png

 

 

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 등을 조정해주면 아래와 같이 뜹니다.

1.png

 

- 저는 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();
    }
}

 

- 이렇게 하면 캡챠가 비로소 정상작동하게 됩니다. 만약 캡챠 체크를 하지 않고 등록을 하게 되면 이런 경고창이 뜨게 됩니다. 캡챠 적용에 성공을 했다는 뜻이지요.

2.png

 

 

이것으로 오늘도 즐거운 라이믹스 생활이 될 것 같습니다 :)

윤삼

profile
아무래도 중급 초반 수준의 코딩 오타쿠인 것 같습니다.
  • profile
    바쁘신 윤삼님 좋은 정보 감사합니다.
  • profile profile
    가능만 하다면 스팸필터의 트리거 함수를 바로 가져다 쓰면 훨씬 더 간편할 것 같긴 합니다 :)
  • ?
    좋은팁 감사합니다.
  • ? profile
    위젯이나 애드온 등에서도 활용할 수 있을 것 같습니다 :D
  • profile
    {$captcha} 만 넣어주면 작동하는게 아니군요....
  • profile profile

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

  • profile
    잘 사용하겠습니다 :D
  • profile profile
    앗, 시간 절약이 되신다면 기쁠 것 같습니다 ;)