질문/조언질답게시판
Extra Form
PHP PHP 7.2
CMS Rhymix 2.x

선택한 게시판에 새로운 글이 등록되었을 때

디스코드로 알림 메시지를 전송하는 애드온을 개발하고 있습니다.

(비슷한 애드온을 본 것 같기도 한데, 그냥 공부겸 직접 개발해보려구 합니다)

 

구글링으로 아래와 같이 트리거를 등록하는 부분을 애드온에 넣었습니다.

 

// 트리거 등록

$oModuleController = getController('module');

$oModuleController->addTriggerFunction('document.insertDocument', 'after', 'addon_discord_notify');

 

해서 테스트 결과 디스코드까지 무사히 메시지가 전달됨을 확인하였는데

문제는 메시지가 두 번씩 전송되고 있다는 점입니다.

 

postman 툴로 테스트 전송해보았을 때는 정상적으로 1번 메시지가 수신되었습니다.

 

혹시 이유를 알 수 있을까요?

 

보시는데 도움되실까 해서 부끄럽지만 전체 소스도 올려봅니다.

 

--

<?php

if(!defined('__XE__'))

{

    exit();

}

 

require_once __DIR__ . '/send_post.php';

 

$dui = parse_url(Context::getDefaultUrl());

$root = $dui['scheme'] . '://' . $dui['host'] . ($dui['port'] ? (':' . $dui['port']) : '');

 

if(!function_exists('addon_discord_notify'))

{

    function addon_discord_notify($obj)

    {

        $oAddonModel = getAdminModel('addon');

        $addon_info = $oAddonModel->getAddonInfoXml('discord_notify');

        $url = $addon_info->extra_vars[0]->value;


 

        $title = $obj->title;

        $member = MemberModel::getMemberInfoByMemberSrl($obj->member_srl);

        $content = $obj->content;

        

        $dui = parse_url(Context::getDefaultUrl());

        $root = $dui['scheme'] . '://' . $dui['host'] . ($dui['port'] ? (':' . $dui['port']) : '');

 

        $message = "[ ". $obj->mid." ] 게시판에 [ " .$title. " ] 글이 등록되었습니다. " . $root . "/" . $obj->mid . "/" . $obj->document_srl;

 

        $data = array(

            "username"  => $member->nick_name,

            "content"   => $message,

        );

        

        $res = send_post($url, $data);

        

        return $obj;

    }

}

 

// 트리거 등록

$oModuleController = getController('module');

$oModuleController->addTriggerFunction('document.insertDocument', 'after', 'addon_discord_notify');

 

 

  • profile

    모든 애드온은 코어 구동 과정에서 4번 실행됩니다.
    그 중 2번은 글이 저장되기 전, 2번은 저장 후일 가능성이 높습니다.
    addTriggerFunction을 사용하여 트리거만 등록하고 끝내는 애드온이라면
    처음 1번만 실행되도록 조건을 넣으셔야 합니다.

     

    before_module_init 시점이 아니면 곧바로 리턴하도록 하거나,
    모든 코드를 function_exists 조건 안에 집어넣으시면 될 것 같습니다.

  • profile profile
    정회원이 아니라서 "좋은 답변" 선택을 못하네요. 감사합니다.