그누보드 5.4 부터 도입된 훅 기능에 대해서 살펴보자
그누보드 훅 사용법
훅 기능은 간단히 말해서
그누보드 bbs/ 폴더를 수정하지 않고 중간에 코드를 삽입 할 수 있다는 것
방법은 extend/ 폴더에 php 파일을 넣어서 실행하는 형식 인 것이다.
<?php
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
add_event('event_name', 'adapt_theme', G5_HOOK_DEFAULT_PRIORITY, 4);
function adapt_theme($params)
{
global $g5;
// event_name에 맞는 파라미터를 받아옴
// 파라미터를 통해 원하는 작업을 한다.
}
PHP
복사
파일에서 add_event() 함수를 통해서 event_name이라는 이름으로 함수를 등록한다.
등록된 함수는 그누보드가 실행 될때에
<?php
# ...
run_event('event_name', $params);
# ...
PHP
복사
bbs/ 폴더안의 파일들을 살펴보면 위와 같이 run_event() 함수들이 있습니다.
run_event 함수의 첫번째 파라미터가 이벤트 이름이며 해당 이벤트로 등록된 함수를 순차적으로 실행시킵니다.
이벤트명은 미리 정의되어 있으며 이벤트 종류는 아래와 같다.
그누보드 훅(Hook) 이벤트 종류
파일명 | 이벤트 명 | 파라미터 | 설명 |
common.php | common_header | - | - |
head.php | pre_head | - | - |
tail.sub.php | tail_sub | - | - |
adm/_common.php | admin_common | - | - |
adm/board_copy_update.php | admin_board_copy_file | $bo_table, $target_table | - |
adm/board_form_update.php | admin_board_form_update | $bo_table, $w | - |
adm/board_list_update.php | admin_board_list_update | $act_button, $chk, $board_table, $qstr | - |
adm/cache_file_delete.php | adm_cache_file_delete_before | - | - |
adm_cache_file_delete | - | - | |
adm/config_form_update.php | admin_config_form_update | - | - |
adm/member_form_update.php | admin_member_form_update | $w, $mb_id | - |
adm/member_form.php | admin_member_form_add | $mb, $w, 'table' | - |
admin_member_form_after | $mb, $w | - | |
adm/member_list_update.php | admin_member_list_update | $_POST['act_button'], $mb_datas | - |
adm/theme_update.php | adm_theme_update | $theme, $_POST['set_default_skin'] | - |
adm/view.php | admin_request_handler_$call | $arr_query, $token | - |
admin_get_page_$call | $arr_query, $token | - | |
bbs/delete_all.php | bbs_delete_all | $tmp_array, $board | - |
bbs/delete_comment.php | bbs_delete_comment | $comment_id, $board | - |
bbs/delete.php | bbs_delete | $write, $board | - |
bbs/download.php | download_file_header | $file, $file_exist_check | - |
bbs/good.php | bbs_good_before | $bo_table, $wr_id, $good | - |
bbs_increase_good_json | $bo_table, $wr_id, $good | - | |
bbs_increase_good_html | $bo_table, $wr_id, $good, $href | - | |
bbs_good_after | $bo_table, $wr_id, $good | - | |
bbs/login_check.php | password_is_wrong | 'login', $mb | - |
login_session_before | $mb, $is_social_login | - | |
member_login_check | $mb, $link, $is_social_login | - | |
bbs/login.php | member_login_tail | $login_url, $login_action_url, $member_skin_path, $url | - |
bbs/logout.php | member_logout | $link | - |
bbs/memo_delete.php | memo_delete | $me_id, $row | - |
bbs/memo_form_update.php | memo_form_update_before | $recv_list | - |
memo_form_update_after | $member_list, $str_nick_list, $redirect_url, $_POST['me_memo'] | - | |
memo_form_update_failed | $member_list, $redirect_url, $_POST['me_memo'] | - | |
bbs/memo.php | memo_list | $kind, $unkind, $page | - |
bbs/move_update.php | bbs_move_copy | $row2, $move_bo_table, $insert_id, $next_wr_num, $sw | - |
bbs_move_update | $bo_table, $chk_bo_table, $wr_id_list, $opener_href | - | |
bbs/move.php | move_html_footer | - | - |
bbs/new_delete.php | bbs_new_delete | $chk_bn_id, $save_bo_table, $save_wr_id | - |
bbs/password_check.php | password_is_wrong | 'bbs', $wr, $qstr | - |
bbs/password_lost_certify.php | password_lost_certify_before | - | - |
password_lost_certify_after | $mb, $mb_nonce | - | |
bbs/password_lost2.php | password_lost2_after | $mb, $mb_nonce, $mb_lost_certify | - |
bbs/qawrite_update.php | qawrite_update | $qa_id, $write, $w, $qaconfig | - |
bbs/register_form_update.php | register_form_update_before | $mb_id, $w | - |
register_form_update_valid | $w, $mb_id, $mb_nick, $mb_email | - | |
register_form_update_send_mb_mail | $config['cf_admin_email_name'], $config['cf_admin_email'], $mb_email, $subject, $content | - | |
register_form_update_send_admin_mail | $mb_nick, $mb_email, $config['cf_admin_email'], $subject, $content | - | |
register_form_update_send_certify_mail | $config['cf_admin_email_name'], $config['cf_admin_email'], $mb_email, $subject, $content | - | |
register_form_update_after | $mb_id, $w | - | |
bbs/register_form.php | register_form_before | - | - |
register_form_after | $w, $agree, $agree2 | - | |
bbs/write_comment_update.php | comment_update_after | $board, $wr_id, $w, $qstr, $redirect_url, $comment_id, $reply_array | - |
bbs/write_update.php | write_update_before | $board, $wr_id, $w, $qstr | - |
write_update_file_insert | $bo_table, $wr_id, $upload[$i], $w | - | |
write_update_after | $board, $wr_id, $w, $qstr, $redirect_url | - | |
bbs/write.php | bbs_write | $board, $wr_id, $w | - |
lib/cache.lib.php | adm_cache_delete | $board_tables | - |
lib/common.lib.php | alert | $msg, $url, $error, $post | - |
alert_close | $msg, $error | - | |
theme/basic/tail.sub.php | tail_sub | - | - |
그누보드 훅 구현에 대한 정리
그누보드 훅을 순차적으로 정리하면 다음과 같다.
1. 넣고 싶은 이벤트 명을 찾거나 /bbs/, /adm/ 폴더의 파일을 분석하여 넣고싶은 이벤트 명을 찾아낸다.
1. /extend/ 폴더에 들어갈 라이브러리 파일을 만든다.
2. 실행될 함수를 생성하여 작성하고 add_event() 함수를 통해 실행될 함수를 등록한다.
간단히 위와 같이 하면 등정 시점에 함수를 실행 할 수 있다.
그누보드 스킨과 다른점
사실 그누보드 스킨도 동일한 기능을 제공하고 있었다.
게시판 스킨에서 update_head.skin.php 파일을 만들어서 넣으면
게시글을 작성하거나 업데이트 하기전 미리 스킨 파일이 실행되고 변수를 조작하거나 변경할 수 있다.
기능적인 부분은 동일하지만 다른점은
활용 범위가 넓어 졌다는 것이다.
스킨 방식은 스킨이 호출 되는 범위에서만 적용이 되었지만
훅 방식은 스킨이 없는 관리자 페이지(/adm/) 같은 부분에 더 넓게 분포 되어 있기 때문에
조금 더 적용 범위가 넓어 졌다고 보면 된다.
Last updated @3/30/2023
Copyright 2023, 실전코딩 All Rights Reserved.