경험치 모듈을 개발하고 있었습니다. 그러다가 레벨업을 하면 알림을 주면 어떨까 싶어서 그 기능 개발에 돌입했죠.

 

하지만 문제 하나가 있었습니다. 알림센터는 알림메세지 자체가 정해져있어서 레벨업을 했다는 메세지를 주는 것이 거의 불가능해보였습니다. 그때 알림센터가 굉장히 얄밉게 느껴지기까지 했습니다.. 메세지 하나 모듈에서 마음대로 정하지못한다는 게....ㅠ

 

그냥 쪽지로 하려다가.....

 

1.png

- ncenterlite.model.php 中

 

바로 그 순간 NotifyType 이 보였습니다. 

 

 

2.png

- ncenterlite.class.php 中

 

그리고 타입에도 'U'가 있었습니다. 혹시 'User'를 뜻하는 게 아닌가 싶었죠. 그럼 메세지를 정해줄 수 있단말인가??!!

 

3.png

 

DB에도 'ncenterlite_notify_type'이라는 테이블이 생성되었고, 이게 도대체 뭐지?? 

 

그래서 열심히 ncenterlite.model.php 파일을 뒤져보면서 분석한 결과 알 수 있었습니다. " 아, 내 예상대로 메세지를 정해줄수 있는 기능이 맞구나!  "

 

https://github.com/xe-public/xe-module-ncenterlite/commit/032d71eadd83bba8d6bb63236bdf744d200e9617

 

커밋내역을 보니, @YJSoft 님께서 추가하셨더군요. 박수~ 짝짝!  

 

하지만, 좀 버그가 많아서 수정해야 기능이 제대로 동작할 수 있겠더라구요.

수정방법 : https://github.com/xe-public/xe-module-ncenterlite/issues/97

 

※ NotifyType 기능 처리과정 (좀 복잡해요.)

  1. 먼저 사용할 알림 메세지를 사전에 등록합니다. 이때 알림을 칠때, 사용하는 변수를 치환자로 쓸 수 있어요. %변수이름%
  2. 알림을 칠때, "$args->notify_type"에 사전에 등록해준 notify_type_srl를 넣으면 됩니다.
  3. 알림을 칠때, 사용하는 변수가 있으면 변수객체를 serialize한 다음 $args->target_body에 넣으면 됩니다.
  4. 헉헉ㅠㅠ 끝입니다.

 

근데 사전에 알림메세지를 등록하는 방법 말고, 차라리 직접 메세지를 알림과 같이 날리는 방법이 더 좋을듯 하는 생각이 듭니다.

 

과정이 어렵죠? 이번에는 실전예제(?)를 통해 알아보겠습니다.ㅋㅋ

 

※ 경험치 모듈에서 레벨업 알림예제

경험치 모듈에서는 레벨업 알림을 어떻게 구현했는 지 알아보아요.

 

Step 1. 레벨업 알림메세지 사전등록

 

$oModuleModel = getModel('module');
$oModuleController = getController('module');

//레벨업 알림을 위한 알림타입 설치 (알림센터)
$config = $oModuleModel->getModuleConfig('experience');
if(is_dir('./modules/ncenterlite'))
{
$oNcenterliteModel = getModel('ncenterlite');
if(!$config->levelup_ntype || !$oNcenterliteModel->isNotifyTypeExistsbySrl($config->levelup_ntype))
{
$args = new stdClass;
$args->notify_type_srl = getNextSequence();
$args->notify_type_id = 'levelup';
$args->notify_type_args = 'level';
$args->notify_string = '<strong>레벨 Up!</strong> Lv.%level%이 되셨습니다.';

$oNcenterliteModel = getModel('ncenterlite');
$oNcenterliteModel->insertNotifyType($args);

$config->levelup_ntype = $args->notify_type_srl;
$oModuleController->insertModuleConfig('experience', $config);
}
}

 

experience.class.php에서 모듈 업데이트[ moduleUpdate() ]를 할때 지정해준 알림메세지가 등록되도록 했습니다.

또한 경험치 모듈 설정에 레벨업 notify_type_srl을 저장했습니다. (나중에 알림칠때 필요하기때문에. notify_type_id(현재 기능없음)로도 가능할 것으로 예상지만, 그런기능이 갖추어지지않아 할 수 없이...ㅠ)

 

$args->notify_string = '<strong>레벨 Up!</strong> Lv.%level%이 되셨습니다.';

 

위 부분에 보면 %level% 이란 치환자를 사용했는 데... 치환자를 사용하려면 $args->notify_type_args = 'level'; 에서 사용할 치환자를 적어줘야합니다. 다수일 경우 |(bar)로 구분합니다. $args->notify_type_args = 'level|level2'; 이런식으로..

 

 

Step 2. 레벨업 알림메세지 발송

 

//레벨업 알림(알림센터)
if(is_dir('./modules/ncenterlite') && $level > $current_level && $config->ncenter_levelup == 'Y')
{
$oNcenterliteController = getController('ncenterlite');

$body = new stdClass;
$body->level = $level;

$args = new stdClass;
$args->member_srl = $member_srl;
$args->srl = 1;
$args->target_srl = 1;
$args->type = 'U';
$args->target_type = 'U';
$args->notify_type = $config->levelup_ntype;
$args->target_body = serialize($body);
$args->target_url = getUrl('');
$args->regdate = date('YmdHis');
$args->notify = $oNcenterliteController->_getNotifyId($args);
$output = $oNcenterliteController->_insertNotify($args);
}

 

$args->type은 "U"로 지정하고, 

$args->notify_type에는 아까 사전 등록할때 넣은 notify_type_srl가 들어가야 합니다. 이럴 경우를 대비해 모듈설정에 저장해두었습니다. 그래서 $args->notify_type = $config->levelup_ntype; 이렇게 됨....

 

$args->target_body에는 아까 치환자로 썼던 변수를 객체 serialize해서 넘겨줍니다. 아까 %level% 치환자를 썼으니까.. 아래와 같은 객체를 만들어 넘겨주면 됩니다.

 

$body = new stdClass;

$body->level = $level;

 

$args->target_body = serialize($body);

 

이런식으로 사용하는 형태인데.. 좀 복잡하지요. 허허...

 

결과

1.png

 

  • profile
    오오 좋네요. 이걸 이용하면 쇼핑몰 운영하는 저같은 경우에서도 알림센터를 이용해서 구매,이벤트 등을 나눠서 할수 있겠네요.

    감솨..
  • ?
    와... 좋아보이네요 ㅎ.ㅎ
  • ?
    대단하십니다!
  • ?
    어렵다.... 눈물이 나네...
  • ? profile
    @YJSoft 님께서 어렵게 만들셨어요. 고자질ㅋㅋ; (농담)
  • profile
    멋지네요 ㅎ
  • profile
    #97번 이슈 커밋 했는데. 해당 코드 맞는지 확인 부탁드립니다. @Conory
  • profile profile
    확인했습니다. 좋아요..ㅎㅎ
  • profile profile
    수정완료.. 릴리즈는 다음주내로 할께요..
  • profile profile
    넵!
  • profile
    프로젝트를 진행하며 커스텀 알림 추가가 필요해서 추가했던 기능입니다.
    원래는 사전에 메세지를 등록후 보내는 방식이였으나 나중에 메세지 수정시 기존 알림은 그대로 남는 문제가 있고, 게다가 글자수 제한에 걸려서(50글자인걸로 기억합니다), 새로 type을 추가할 수 있게 구현했습니다.
    다만 알림센터 Lite가 프로젝트에 쓰기엔 지나치게 기능이 많아서(단순히 알림만 필요했기에), 이 기능을 활용하지는 않고 새로 알림센터 모듈을 제작해 사용했던지라 제대로 테스트를 못했더니 역시나 버그가 있었네요.
  • profile profile
    아.. 그렇군요.ㅠ
  • profile
    오... 좋아보이네요
  • ?
    모듈을 살펴서 몰랐던 기능을 이렇게 찾아서 쓸 수도 있군요 호오...
  • ?
    훌륭하세요 ㅎㅎ
  • profile
    덕분에 알림센터 고민 풀었네요 감사합니다 ^^
  • profile
    링크는 못 걸나요?