PRD-개발이야기

GNUBoard [GNU 5.4] Hook에 관해 알아보자 4

본문

[GNU 5.4] Hook에 관해 알아보자 4

 

원래는 이 시리즈는 3개를 끝으로 마무리를 지으려고 했으나......

한걸음 더 들어가보도록 하겠습니다.

 

í걸ì ë ììí¬ì ëí ì´ë¯¸ì§ ê²ìê²°ê³¼

 

앞에서도 언급했으나 GNU54의 훅은 

https://github.com/Josantonius/PHP-Hook

 

이녀석을 기반으로 두고 있습니다. 자 그럼 영어는 안되지만 api문서를 보겠습니다.

 

아 문서를 보기전에 이번화에서는 두가지를 더 알아보도록 하겠습니다.

훅의 실행순서와 전송 받는 인자에 관한 이야기 입니다.

 

자 그럼 이제 문서를 보도록 합니다.

 

- Attach custom function to action hook:

Hook::addAction($tag, $function, $priority, $args);
Attribute Description Type Required Default
$tag Action hook name. string Yes  
$function Function to attach to action hook. callable Yes  
$priority Order in which the action is executed. int No 8
$args Number of arguments accepted. int No 0

 

냑에선 add_event() 함수가 이에 해당합니다.

이녀석은 4개의 인자를 가지는것을 알 수 있습니다.

처음 두개는 앞에서도 언급했듯이 

 

처음은 해당하는 Hook의 이름입니다.

두번째는 해당하는 function의 이름이죠

세번째는 order어쩌고 하는걸 보니 이놈이 훅의 순서 입니다.

네번째는 -_-???? 네 이녀석이 사용할 인자의 갯수 입니다.

 

자 그럼 이제 냑에서 어떻게 사용하고 있는지 셈플을 보도록 하겠습니다.

add_event()와 run_event()가 모두있고 인자를 반환하는 함수를 찾아보겠습니다.

 

run_event('memo_list', $kind, $unkind, $page);

이늠... 예제로 좋아 보입니다.

해당 파일은 /bbs/memo.php 입니다

 

이녀석은 memo_list라는 이름을 가지고 있고 총 3개의 인자를 받습니다.

$kind , $unkind , $page 이게 뭘 의미 하는진 중요하지 않으니 그냥 모르셔도 됩니다.

일단 3개를 인자로 받는다는겁니다.

 

해당소스의 상단에 보면 해당 변수를 정의해둔걸 확인가능 합니다.

 

if ($kind == 'recv')
    $unkind = 'send';
else if ($kind == 'send')
    $unkind = 'recv';
else
    alert(''.$kind .'값을 넘겨주세요.');

if ($page < 1) { $page = 1; } // 페이지가 없으면 첫 페이지 (1 페이지)

 

역시나 소스가 뭘 의미하는지는 모르셔도 무관합니다. 그냥 셈플 예제이니깐요 -_-;;;

 

자 그럼 이제 여기에 Hook을 추가하는 녀석을 찾아봅니다.

 

add_event('memo_list', 'g54_user_memo_insert', 10, 3);

/extend/g5_54version_update.extend.php

에 들어있습니다.

 

아마 extend쪽에서 훅관련읆 모아두었나 봅니다. 

extend관련 해서는 나중에 실제 plugin을 개발할때 다시 언급하겠습니다.

 

보시면 이녀석은 memo_list라는 이름을 가지고

g54_user_memo_insert 라는 펑션을 실행하며,

10번째... 순서로 실행이 됩니다.

(이는 이보다 먼저 실행해서 작업을 해야하는 경우를 상정해둔 것이라 보여집니다)

그리고 3개의 인자를 받는다... 입니다.

 

좀전에 보셨듯이 run_event('memo_list', $kind, $unkind, $page); 이녀석이 3개의 인자를 

받아서 오기 때문입니다. 

 

자 그럼 다시 g54_user_memo_insert 이녀석을 보겠습니다.

 

function g54_user_memo_insert($kind, $unkind, $page=1){
    global $g5, $is_member, $member;

    if( ! $is_member || $kind !== 'send' ) return;

    $sql = " select count(*) as cnt from {$g5['memo_table']} where me_send_mb_id = '{$member['mb_id']}' and me_type = 'recv' and me_send_ip = '' ";
    $row = sql_fetch($sql);

    if ( !$row['cnt'] ) return;

    $sql = " select count(*) as cnt from {$g5['memo_table']} where me_send_mb_id = '{$member['mb_id']}' and me_type = 'send' ";
    $row2 = sql_fetch($sql);

    if( $row['cnt'] && ! $row2['cnt'] ){
        $sql = " select * from {$g5['memo_table']} where me_send_mb_id = '{$member['mb_id']}' and me_type = 'recv' ";
        $result = sql_query($sql);

        while ($row = sql_fetch_array($result))
        {
            $sql = " insert into {$g5['memo_table']} ( me_recv_mb_id, me_send_mb_id, me_send_datetime, me_read_datetime, me_memo, me_send_id, me_type ) values ( '".addslashes($row['me_recv_mb_id'])."', '".addslashes($row['me_send_mb_id'])."', '".addslashes($row['me_send_datetime'])."', '".addslashes($row['me_read_datetime'])."', '".addslashes($row['me_memo'])."', '".$row['me_id']."', 'send' ) ";

            sql_query($sql);
        }

        $sql = " update {$g5['memo_table']} set me_send_ip = '{$_SERVER['REMOTE_ADDR']}' where me_send_mb_id = '{$member['mb_id']}' and me_type = 'recv' and me_send_ip = '' ";

        sql_query($sql);
    }

}

 

보다싶이 이 function에서 3개의 같은 인자를 받는걸 알 수 있습니다.

역시나 소스가 뭘 의미하는진 중요하지 않습니다.

 

요점은 add_event() 의 활용법입니다.

 

이 씨리즈는 최대한 쉽게 최대한 가볍게가 모토였는데... 

역시나 심화과정이 되면 쉽게쓸 수가 없네요

뭔가 용어가 프로그램을 처음 접하시는 분들이라면 외계어같을 수 있을겁니다. 

(제가 그랬고 지금도 그러하기 때문이죠 -_-;;;;)

 

그냥 요점은 사용법이 이러하다 정도 입니다.

해당 api를 보면 더 여러가지 사용법이 있지만 모르셔도 됩니다.

 

 

그럼 총총총

 

 

댓글목록

등록된 댓글이 없습니다.

전체 10건 1 페이지
게시물 검색
Copyright © 소유하신 도메인. All rights reserved.
test page