document.insertDocument, after 트리거가 두 번씩 호출됩니다.
CMS/프레임워크 | Rhymix 2.0 |
---|---|
개발 언어 | PHP 7.2 |
선택한 게시판에 새로운 글이 등록되었을 때
디스코드로 알림 메시지를 전송하는 애드온을 개발하고 있습니다.
(비슷한 애드온을 본 것 같기도 한데, 그냥 공부겸 직접 개발해보려구 합니다)
구글링으로 아래와 같이 트리거를 등록하는 부분을 애드온에 넣었습니다.
// 트리거 등록
$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');
댓글 2
모든 애드온은 코어 구동 과정에서 4번 실행됩니다.
그 중 2번은 글이 저장되기 전, 2번은 저장 후일 가능성이 높습니다.
addTriggerFunction을 사용하여 트리거만 등록하고 끝내는 애드온이라면
처음 1번만 실행되도록 조건을 넣으셔야 합니다.
before_module_init 시점이 아니면 곧바로 리턴하도록 하거나,
모든 코드를 function_exists 조건 안에 집어넣으시면 될 것 같습니다.