트리거(Trigger) 목록
DANGER
🚧 이 문서는 초안을 작성중인 문서이다.
이 문서는 항상 부정확하다
코드의 모든 변경사항을 추적하여 이 문서를 항상 최신으로 유지하는 것은 어렵다.
이벤트(트리거)가 전달하는 데이터 형식은 상세히 정의하려고 했으나 각 속성의 타입이 설명한 것과 다르거나 누락, 변경 되었을 수 있다. 이벤트를 이해하는데 힌트로 삼을 정도는 되지만 전달 객체를 확인하여 사용하는 것을 권장한다.
라이믹스의 디버그 기능을 활성화하고 debugPrint()
함수를 이용해 데이터를 확인할 수 있다.
관리페이지에서 "설정 -> 시스템 설정 -> 디버그 설정" 탭에서 디버그 기능을 설정할 수 있다.
// 이벤트 리스너(콜백)의 예
addTriggerFunction($name, $position, function ($data) {
debugPrint($data);
});
TIP
가장 먼저 실행되는 트리거는 moduleHandler.init
(before), 가장 마지막은 display
(after) 이다.
변경내역
이벤트 (트리거) | 변경 사항 |
---|---|
document.publishDocument (before, after) | 추가 v2.1.11 |
communication.deleteMessage (before, after) | 추가 v2.1.11 |
communication.deleteMessages (before, after) | 추가 v2.1.11 |
member.doLogin (after) | 변경 v2.1.11 세션 정보를 생성 후로 실행 시점 변경 |
admin.dashboard (after) | 추가 v2.1.8 |
member.doAutoLogin (after) | 추가 v2.1.0 |
코어 🚧 초안 작성중
트리거 | 호출시점 | 설명 |
---|---|---|
display | before, after | 요청의 응답을 출력하기 전과 후에 호출 |
layout | before | |
moduleHandler.init | before, after | |
moduleHandler.proc | after | |
moduleObject.proc | before, after | |
admin.dashboard | before | 관리페이지 대시보드에 항목을 추가 |
display 🚧 초안 작성중
요청의 응답을 출력하기 전과 후에 호출된다.
/**
* 요청의 응답을 출력하기 전과 후에 호출
* @param string &$output 출력할 내용
*/
function (&$output = '') {
// 예시: $output 변수를 참조로 받아 내용을 추가하거나 변경 가능
$output .= '추가할 내용';
}
layout 🚧 초안 작성중
moduleHandler.init before | after
모듈을 동작시키기 위해 요청 정보를 처리하여 실행할 모듈과 액션을 찾는 초기화 과정에서 호출된다.
ModuleHandler
인스턴스는 다른 방법으로 참조하기 어려우며, 이 이벤트를 활용해 참조할 수 있다.
- before :
ModuleHandler
객체가 전달되어 수집된 정보를 받을 수 있다 - after : 수집한 정보로 실행할 모듈의 객체를 받을 수 있다
before
/**
* @see \ModuleHandler::__construct()
* @param \ModuleHandler $moduleHandler
*/
class EventHandler
{
protected static \ModuleHandler $moduleHandler;
/*
* ModuleHandler 인스턴스는 다른 방법으로 참조할 수 없기 때문에
* 이 이벤트를 사용해 미리 참조를 보관해두고 활용하는 예시이다.
*/
/**
* ModuleHandler 객체를 받아 보관해둔다
*
* @param \ModuleHandler $moduleHandler
*/
public static function beforeModuleHandlerInit(&$moduleHandler)
{
self::$moduleHandler = $moduleHandler;
}
public static function beforeDisplay()
{
// 최종 실행된 모듈의 정보과 액션을 정확히 확인할 수 있다
debugPrint(self::$moduleHandler->module);
debugPrint(self::$moduleHandler->act);
}
}
<module>
<eventHandlers>
<eventHandler before="moduleHandler.init"
class="Src\EventHandler"
method="beforeModuleHandlerInit" />
<eventHandler before="display"
class="Src\EventHandler"
method="beforeDisplay" />
</eventHandlers>
</module>
after 🚧 초안 작성중
moduleHandler.proc 🚧 초안 작성중
moduleObject.proc 🚧 초안 작성중
admin.dashboard - 관리페이지 대시보드 before
관리페이지 대시보드에 항목을 추가할 수 있다.
왼쪽, 오른쪽 나뉘어져 있고 출력되는 항목은 각 좌, 우 배열의 순서대로 출력된다.
/**
* @param object{
* left: string[],
* right: string[],
* } &$dashboard 대시보드 항목
*/
function (&$dashboard) {
// 예시: 대시보드 항목을 추가
$html = <<<HTML
<section>
<h2>대시보드 항목의 제목</h2>
<div style="padding: 10px;">
<p>항목의 컨텐츠</p>
</div>
<!-- `more` 클래스를 지정하면 제목의 오른쪽에 표시된다 -->
<div class="more">
<a href="#">링크 예시 <i class="xi-angle-right"></i></a>
</div>
</section>
HTML;
// 대시보드 오른쪽에 첫번째로 추가 예시
array_unshift($dashboard->right, $html);
}
module.deleteModule before | after 🚧 초안 작성중
module.dispAdditionSetup before | after 🚧 초안 작성중
module.procModuleAdminCopyModule after 🚧 초안 작성중
문서 (document) 🚧 초안 작성중
트리거 | 호출시점 | 설명 |
---|---|---|
copyDocumentModule.each | before, after | |
copyDocumentModule | before, add, after | |
declaredDocument | before, after | |
declaredDocumentCancel | before, after | |
deleteDocument | before, after | |
getComments | after | |
getDocumentList | before, after | |
getDocumentMenu | before, after | |
getNoticeList | before, after | |
getThumbnail | before | |
insertDocument | before, after | |
manage | before, after | |
moveDocumentModule | before, after | |
moveDocumentToTrash | before, after | |
publishDocument | before, after | |
restoreTrash | after | |
updateDocument | before, after | |
updateReadedCount | before, after | |
updateVotedCount | before, after | |
updateVotedCountCancel | before, after |
글 조회 🚧 초안 작성중
getDocumentList 🚧 초안 작성중
getNoticeList 🚧 초안 작성중
글 추가, 수정, 삭제 🚧 초안 작성중
insertDocument 🚧 초안 작성중
WARNING
이 이벤트는 글과 관련된 데이터의 변경사항을 처리하는 트랜잭션 안에서 동작하므로 의도하지 않은 롤백이 발생하지 않도록 주의해야 한다.
after
/**
* @see \DocumentController::insertDocument()
* @param object{
* '_filter': string,
* 'act': string,
* 'allow_trackback': 'Y'|'N',
* 'category_srl': int,
* 'comment_status': "ALLOW",
* 'commentStatus': "ALLOW",
* 'content': string, // 글 내용
* 'document_srl': int, // 글 번호
* 'email_address': string,
* 'error_return_url':string,
* 'extra_vars': string,
* 'homepage': string,
* 'ipaddress': string,
* 'is_admin': 'Y'|'N',
* 'is_notice': 'Y'|'N', // 공지사항
* 'isRestore': bool, // 복구 기능으로 복원처리이면 true
* 'lang_code': string,
* 'list_order': int,
* 'member_srl': int, // 회원
* 'mid': string,
* 'module_srl': int,
* 'module': string,
* 'nick_name': string,
* 'notify_message': 'Y'|'N',
* 'readed_count': int,
* 'status': string, // 글 발행 등의 상태
* 'tags': string,
* 'title': string, // 제목
* 'update_order': int,
* 'updated_file_count': int,
* 'uploaded_count': int,
* 'use_editor': 'Y'|'N',
* 'use_html': 'Y'|'N',
* 'user_id': string,
* 'user_name': string,
* } $data
*/
status
값에 따른 구분- TEMP : 임시저장
- PRIVATE
- PUBLIC : 공개
- SECRET : 비밀글
- EMBARGO
- TRASH : 휴지통
- CENSORED
- CENSORED_BY_ADMIN
- DELETED
- DELETED_BY_ADMIN
- OTHER
updateDocument 🚧 초안 작성중
/**
* @see \DocumentController::updateDocument()
*/
updateReadedCount 🚧 초안 작성중
/**
* @see \DocumentController::updateReadedCount()
*/
deleteDocument 🚧 초안 작성중
/**
* @see \DocumentController::deleteDocument()
*/
before
after
/**
* 'document_srl': int,
* 'module_srl': int,
* 'category_srl': int,
* 'lang_code': string,
* 'is_notice': "N",
* 'title': string,
* 'title_bold': "N",
* 'title_color': "N",
* 'content': string,
* 'readed_count': int,
* 'voted_count': int,
* 'blamed_count': int,
* 'comment_count': int,
* 'trackback_count': int,
* 'uploaded_count': int,
* 'password': null,
* 'user_id': string,
* 'user_name': string,
* 'nick_name': string,
* 'member_srl': int,
* 'email_address': string,
* 'homepage': string,
* 'tags': null,
* 'extra_vars': string,
* 'regdate': string,
* 'last_update': string,
* 'last_updater': null,
* 'ipaddress': string,
* 'list_order': int,
* 'update_order': int,
* 'allow_trackback': "N",
* 'notify_message': "N",
* 'status': "PUBLIC",
* 'comment_status': "ALLOW",
* 'apparent_module_srl': int,
* 'origin_module_srl': int,
* // 휴지통 비우기로 삭제하는 경우 true
* 'isEmptyTrash': bool,
*/
publishDocument Since v2.1.12 🚧 초안 작성중
/**
* @see \DocumentController::insertDocument()
* @see \DocumentController::updateDocument()
*/
휴지통 🚧 초안 작성중
moveDocumentToTrash 🚧 초안 작성중
restoreTrash 🚧 초안 작성중
복사, 이동 🚧 초안 작성중
moveDocumentModule 🚧 초안 작성중
copyDocumentModule 🚧 초안 작성중
copyDocumentModule.each 🚧 초안 작성중
신고 🚧 초안 작성중
declaredDocument 🚧 초안 작성중
declaredDocumentCancel 🚧 초안 작성중
댓글 🚧 초안 작성중
getComments 🚧 초안 작성중
기타 🚧 초안 작성중
getDocumentMenu 🚧 초안 작성중
getThumbnail 🚧 초안 작성중
manage 🚧 초안 작성중
updateVotedCount - 추천/비추천 before | after 🚧 초안 작성중
글을 추천하거나 비추천할 때 발생하는 이벤트이다. 추천/비추천을 받은 회원 번호와 글 번호를 받을 수 있다.
/**
* @see \DocumentController::updateVotedCount()
* @param object{
* // 추천/비추천을 받는 대상 회원번호(글쓴이)
* member_srl: int,
* // 대상 모듈번호
* module_srl: int,
* // 대상 문서번호
* document_srl: int,
* // 추천|비추천
* update_target: 'voted_count'|'blamed_count',
* // 부여 포인트. 보통 `1`이다
* point: int,
* // 변경 전 추천/비추천 수
* before_point: int,
* // 변경 후 추천/비추천 수. before_point + point
* after_point: int,
* // 취소 여부
* cancel: bool,
* } $data
*/
function($data) {
$message = '';
if ($data->update_target === 'voted_count') {
// 추천: voted_count
$message = $data->cancel ? '추천 취소' : '추천';
} else if ($data->update_target === 'blamed_count') {
// 비추천: blamed_count
$message = $data->cancel ? '비추천 취소' : '비추천';
}
debugPrint("{$data->member_srl} 글쓴이의 {$data->document_srl} 글이 {$message} 되었습니다");
}
updateVotedCountCancel - 추천/비추천 취소 before | after 🚧 초안 작성중
같은 형식의 데이터
이 이벤트와 앞의 document.updateVotedCount
이벤트는 데이터 형식이 같다.
위 예제와 같은 이벤트 리스너에서 cancel
속성으로 구분하여 함께 처리할 수 있다.
/**
* @see \DocumentController::updateVotedCountCancel()
*/
댓글 (comment) 🚧 초안 작성중
트리거 | 호출시점 | 설명 |
---|---|---|
copyCommentByDocument.each | before, add, after | |
declaredComment | before, after | |
declaredCommentCancel | before, after | |
deleteComment | before, after | |
getCommentList | before, after | |
getCommentMenu | before, after | |
getThumbnail | before | |
getTotalCommentList | before, after | |
insertComment | before, after | |
moveCommentToTrash | before, after | |
procCommentAdminChangeStatus | after | |
sendEmailToAdminAfterInsertComment | after | |
updateComment | before, after | |
updateVotedCount | before, after | |
updateVotedCountCancel | before, after |
copyCommentByDocument 🚧 초안 작성중
copyCommentByDocument.each 🚧 초안 작성중
declaredComment 🚧 초안 작성중
declaredCommentCancel 🚧 초안 작성중
deleteComment 🚧 초안 작성중
getCommentList 🚧 초안 작성중
getCommentMenu 🚧 초안 작성중
getThumbnail 🚧 초안 작성중
getTotalCommentList 🚧 초안 작성중
insertComment 🚧 초안 작성중
moveCommentToTrash 🚧 초안 작성중
procCommentAdminChangeStatus 🚧 초안 작성중
sendEmailToAdminAfterInsertComment 🚧 초안 작성중
updateComment 🚧 초안 작성중
updateVotedCount 🚧 초안 작성중
updateVotedCountCancel 🚧 초안 작성중
회원 (member) 🚧 초안 작성중
트리거 | 호출시점 | 설명 |
---|---|---|
addMemberToGroup | after | |
deleteGroup | before, after | |
deleteMember | before, after | |
deleteScrapDocument | before, after | |
dispMemberSignUpForm | before | |
doAutoLogin | after | |
doLogin | before, after | |
doLogout | before, after | |
getMemberMenu | before, after | |
insertGroup | before, after | |
insertMember | before, after | |
insertMemberDevice | before, after | |
procMemberAuthAccount | before, after | |
procMemberInsert | before, after | |
procMemberModifyInfo | after | |
procMemberScrapDocument | before, after | |
updateGroup | before, after | |
updateMember | before, after | |
updateMemberEmailAddress | after |
addMemberToGroup 🚧 초안 작성중
deleteGroup 🚧 초안 작성중
deleteMember 🚧 초안 작성중
deleteScrapDocument 🚧 초안 작성중
dispMemberSignUpForm 🚧 초안 작성중
doAutoLogin 🚧 초안 작성중
doLogin 🚧 초안 작성중
doLogout 🚧 초안 작성중
getMemberMenu 🚧 초안 작성중
insertGroup 🚧 초안 작성중
insertMember 🚧 초안 작성중
insertMemberDevice 🚧 초안 작성중
procMemberAuthAccount 🚧 초안 작성중
procMemberInsert 🚧 초안 작성중
procMemberModifyInfo 🚧 초안 작성중
procMemberScrapDocument 🚧 초안 작성중
updateGroup 🚧 초안 작성중
updateMember 🚧 초안 작성중
updateMemberEmailAddress 🚧 초안 작성중
파일 (file) 🚧 초안 작성중
트리거 | 호출시점 | 설명 |
---|---|---|
deleteFile | before, after | |
downloadFile | before, after | |
insertFile | before, after |
deleteFile 🚧 초안 작성중
downloadFile 🚧 초안 작성중
insertFile 🚧 초안 작성중
커뮤니케이션 (communication) 🚧 초안 작성중
deleteMessage before | after Since v2.1.12 🚧 초안 작성중
deleteMessages before | after Since v2.1.12 🚧 초안 작성중
addFriend before | after 🚧 초안 작성중
deleteFriend before | after 🚧 초안 작성중
sendMessage before | after 🚧 초안 작성중
('editor.deleteSavedDoc', 'after')
('mail.send', 'after')
('mail.send', 'before')
('menu.getModuleListInSitemap', 'after')
('ncenterlite._insertNotify', 'after')
('ncenterlite._insertNotify', 'before')
('point.setPoint', 'after')
('point.setPoint', 'before')
('push.send', 'after')
('push.send', 'before')
('sms.send', 'after')
('sms.send', 'before')
// ('communication.addFriend', 'after')
// ('communication.addFriend', 'before')
// ('communication.deleteFriend', 'after')
// ('communication.deleteFriend', 'before')
// ('communication.deleteMessage', 'after')
// ('communication.deleteMessage', 'before')
// ('communication.deleteMessages', 'after')
// ('communication.deleteMessages', 'before')
// ('communication.sendMessage', 'after')
// ('communication.sendMessage', 'before')
// ('admin.dashboard', 'before')
// ('display', 'after')
// ('display', 'before')
// ('layout', 'before')
// ('moduleHandler.init', 'after')
// ('moduleHandler.init', 'before')
// ('moduleHandler.proc', 'after')
// ('moduleObject.proc', 'after')
// ('moduleObject.proc', 'before')
// ('comment.copyCommentByDocument.each', 'after')
// ('comment.copyCommentByDocument.each', 'before')
// ('comment.copyCommentByDocument', 'add')
// ('comment.declaredComment', 'after')
// ('comment.declaredComment', 'before')
// ('comment.declaredCommentCancel', 'after')
// ('comment.declaredCommentCancel', 'before')
// ('comment.deleteComment', 'after')
// ('comment.deleteComment', 'before')
// ('comment.getCommentList', 'after')
// ('comment.getCommentList', 'before')
// ('comment.getCommentMenu', 'after')
// ('comment.getCommentMenu', 'before')
// ('comment.getThumbnail', 'before')
// ('comment.getTotalCommentList', 'after')
// ('comment.getTotalCommentList', 'before')
// ('comment.insertComment', 'after')
// ('comment.insertComment', 'before')
// ('comment.moveCommentToTrash', 'after')
// ('comment.moveCommentToTrash', 'before')
// ('comment.procCommentAdminChangeStatus', 'after')
// ('comment.sendEmailToAdminAfterInsertComment', 'after')
// ('comment.updateComment', 'after')
// ('comment.updateComment', 'before')
// ('comment.updateVotedCount', 'after')
// ('comment.updateVotedCount', 'before')
// ('comment.updateVotedCountCancel', 'after')
// ('comment.updateVotedCountCancel', 'before')
// ('document.copyDocumentModule.each', 'after')
// ('document.copyDocumentModule.each', 'before')
// ('document.copyDocumentModule', 'add')
// ('document.copyDocumentModule', 'after')
// ('document.copyDocumentModule', 'before')
// ('document.declaredDocument', 'after')
// ('document.declaredDocument', 'before')
// ('document.declaredDocumentCancel', 'after')
// ('document.declaredDocumentCancel', 'before')
// ('document.deleteDocument', 'after')
// ('document.deleteDocument', 'before')
// ('document.getComments', 'after')
// ('document.getDocumentList', 'after')
// ('document.getDocumentList', 'before')
// ('document.getDocumentMenu', 'after')
// ('document.getDocumentMenu', 'before')
// ('document.getNoticeList', 'after')
// ('document.getNoticeList', 'before')
// ('document.getThumbnail', 'before')
// ('document.insertDocument', 'after')
// ('document.insertDocument', 'before')
// ('document.manage', 'after')
// ('document.manage', 'before')
// ('document.moveDocumentModule', 'after')
// ('document.moveDocumentModule', 'before')
// ('document.moveDocumentToTrash', 'after')
// ('document.moveDocumentToTrash', 'before')
// ('document.restoreTrash', 'after')
// ('document.updateDocument', 'after')
// ('document.updateDocument', 'before')
// ('document.updateReadedCount', 'after')
// ('document.updateReadedCount', 'before')
// ('document.updateVotedCount', 'after')
// ('document.updateVotedCount', 'before')
// ('document.updateVotedCountCancel', 'after')
// ('document.updateVotedCountCancel', 'before')
// ('file.deleteFile', 'after')
// ('file.deleteFile', 'before')
// ('file.downloadFile', 'after')
// ('file.downloadFile', 'before')
// ('file.insertFile', 'after')
// ('file.insertFile', 'before')
// ('member.addMemberToGroup', 'after')
// ('member.deleteGroup', 'after')
// ('member.deleteGroup', 'before')
// ('member.deleteMember', 'after')
// ('member.deleteMember', 'before')
// ('member.deleteScrapDocument', 'after')
// ('member.deleteScrapDocument', 'before')
// ('member.dispMemberSignUpForm', 'before')
// ('member.doAutoLogin', 'after')
// ('member.doLogin', 'after')
// ('member.doLogin', 'before')
// ('member.doLogout', 'after')
// ('member.doLogout', 'before')
// ('member.getMemberMenu', 'after')
// ('member.getMemberMenu', 'before')
// ('member.insertGroup', 'after')
// ('member.insertGroup', 'before')
// ('member.insertMember', 'after')
// ('member.insertMember', 'before')
// ('member.insertMemberDevice', 'after')
// ('member.insertMemberDevice', 'before')
// ('member.procMemberAuthAccount', 'after')
// ('member.procMemberAuthAccount', 'before')
// ('member.procMemberInsert', 'after')
// ('member.procMemberInsert', 'before')
// ('member.procMemberModifyInfo', 'after')
// ('member.procMemberScrapDocument', 'after')
// ('member.procMemberScrapDocument', 'before')
// ('member.updateGroup', 'after')
// ('member.updateGroup', 'before')
// ('member.updateMember', 'after')
// ('member.updateMember', 'before')
// ('member.updateMemberEmailAddress', 'after')