이벤트 / 트리거 목록
🚧 이 문서는 초안을 작성중인 문서이다.
이 문서는 항상 부정확하다
코드의 모든 변경사항을 추적하여 이 문서를 항상 최신으로 유지하는 것은 어렵다.
이벤트(트리거)가 전달하는 데이터 형식은 상세히 정의하려고 했으나 각 속성의 타입이 설명한 것과 다르거나 누락, 변경 되었을 수 있다. 이벤트를 이해하는데 힌트로 삼을 정도는 되지만 전달 객체를 확인하여 사용하는 것을 권장한다.
라이믹스의 디버그 기능을 활성화하고 debugPrint() 함수를 이용해 데이터를 확인할 수 있다.
관리페이지에서 "설정 -> 시스템 설정 -> 디버그 설정" 탭에서 디버그 기능을 설정할 수 있다.
// 이벤트 리스너(콜백)의 예
addTriggerFunction($name, $position, function ($data) {
debugPrint($data);
});TIP
가장 먼저 실행되는 트리거는 moduleHandler.init(before), 가장 마지막은 display(after) 이다.
모듈의 액션이 실행될 때 자동으로 발생하는 이벤트
모듈의 액션이 실행되기 전, 후에 act:모듈이름.액션이름 형태의 이벤트가 발생하며, before, after 시점으로 구분된다.
예를들어, 회원이 로그아웃할 때 member 모듈의 procMemberLogout 액션이 실행되는데, 다음과 같이 이벤트가 발생한다.
- before
act:member.procMemberLogout - before
member.doLogout - after
member.doLogout - after
act:member.procMemberLogout
before act:member.procMemberLogout 이벤트의 핸들러는 액션이 실행된 모듈의 인스턴스를 인자로 받을 수 있으며, after act:member.procMemberLogout 이벤트의 핸들러는 액션 메소드가 반환한 결과(보통 \BaseObject 또는 \Rhymix\Framework\Helpers\DBResultHelper)를 인자로 받을 수 있다.
변경내역
| 이벤트 (트리거) | 변경 사항 |
|---|---|
| document.publishDocument | 추가 v2.1.11 |
| communication.deleteMessage | 추가 v2.1.11 |
| communication.deleteMessages | 추가 v2.1.11 |
| member.doLogin | 변경 v2.1.11 세션 정보를 생성 후로 실행 시점 변경 |
| admin.dashboard | 추가 v2.1.8 |
| member.doAutoLogin | 추가 v2.1.0 |
코어 🚧 초안 작성중
| 이벤트 | 타입 | 호출시점 | 설명 |
|---|---|---|---|
| moduleHandler.init | Trigger | before, after | 가장 먼저 발생하는 이벤트 |
| moduleObject.proc | Trigger | before, after | |
| moduleHandler.proc | Trigger | after | |
| layout | Trigger | before | |
| display | Trigger | before, after | 응답할 최종 컨텐츠를 변경할 수 있다 |
| admin.dashboard | Trigger | before | |
| module.deleteModule | Trigger | before, after | |
| module.dispAdditionSetup | Trigger | before, after | |
| module.procModuleAdminCopyModule | Trigger | after |
이 섹션의 이벤트 중 일부는 라이믹스의 주요 라이프사이클의 일부이다. moduleHandler.init 이벤트가 가장 먼저 발생하며, 다음과 같은 순서로 발생한다.
- moduleHandler.init - before
- moduleHandler.init - after
- moduleObject.proc - before
- moduleObject.proc - after
- moduleHandler.proc - after
- layout - before
- display - before
- display - after
라이프사이클
moduleHandler.init - 라이믹스 초기 동작 Trigger before, after
모듈을 동작시키기 위해 요청 정보를 처리하여 실행할 모듈과 액션을 찾는 초기화 과정에서 호출된다.
`ModuleHandler` 인스턴스는 다른 방법으로 참조하기 어려우며, 이 이벤트를 활용해 참조할 수 있다.
- before :
ModuleHandler객체가 전달되어 수집된 정보를 받을 수 있다 - after : 수집한 정보로 실행할 모듈의 객체를 받을 수 있다
before -
class EventHandler
{
protected static \ModuleHandler $moduleHandler;
/*
* ModuleHandler 인스턴스는 다른 방법으로 참조할 수 없기 때문에
* 이 이벤트를 사용해 미리 참조를 보관해두고 활용하는 예시이다.
*/
/**
* ModuleHandler 객체를 받아 보관해둔다
*
* @see \ModuleHandler::__construct()
* @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 🚧 초안 작성중
moduleObject.proc Trigger before, after 🚧 초안 작성중
before 🚧 초안 작성중
after 🚧 초안 작성중
moduleHandler.proc Trigger after🚧 초안 작성중
after 🚧 초안 작성중
layout Trigger before 🚧 초안 작성중
before 🚧 초안 작성중
display - 응답 컨텐츠 Trigger before, after
응답할 최종 컨텐츠를 변경할 수 있다.
보통 HTML 내용을 변경하는 용도로 사용되며, 요청/응답 포맷에 따라 JSON, XML 포맷이 될 수 있다.
HTML 응답 시 before 시점에서는 <body> 태그 안에 들어갈 레이아웃과 컨텐츠의 일부가 채워져있지만, HTML 전체 구조는 포함되지 않는다. after 시점에서는 최종 응답 직전에 호출되며, 전체 HTML 구조를 포함한다.
/**
* return 값은 사용되지 않으며,
* 첫번째 인자에 참조로 전달된 `$content`를 이용해 출력될 내용을 변경할 수 있다.
*
* @see \DisplayHandler::printContent()
* @param string &$content 출력될 내용
* @return void
*/
function (string &$content)
{
// HTML 응답일 때만 실행
if (\Context::getResponseMethod() !== 'HTML') {
return;
}
// 예시: HTML 응답에 스크립트를 추가
$content .= <<<HTML
<script>
console.log('Hello, Rhymix!');
</script>
HTML;
}NOTE
before 시점에서는 이벤트 처리 순서에 따라 같은 이벤트를 구독하는 위젯과 에디터 컴포넌트 컨텐츠가 렌더링 되어있지 않을 수 있다.
기타 🚧 초안 작성중
admin.dashboard - 관리페이지 대시보드 Trigger 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 - 모듈 삭제 Trigger before, after 🚧 초안 작성중
module.dispAdditionSetup - 모듈의 추가 설정 탭 Trigger before, after 🚧 초안 작성중
게시판 등의 모듈 설정에서 '추가 설정' 탭에 설정 항목을 추가할 수 있다.
module.procModuleAdminCopyModule Trigger after 🚧 초안 작성중
문서 (document) 🚧 초안 작성중
| 트리거 | 타입 | 호출시점 | 설명 |
|---|---|---|---|
| copyDocumentModule.each | Trigger | before, after | |
| copyDocumentModule | Trigger | before, add, after | |
| declaredDocument | Trigger | before, after | |
| declaredDocumentCancel | Trigger | before, after | |
| deleteDocument | Trigger | before, after | |
| getComments | Trigger | after | |
| getDocumentList | Trigger | before, after | |
| getDocumentMenu | Trigger | before, after | |
| getNoticeList | Trigger | before, after | |
| getThumbnail | Trigger | before | |
| insertDocument | Trigger | before, after | |
| manage | Trigger | before, after | |
| moveDocumentModule | Trigger | before, after | |
| moveDocumentToTrash | Trigger | before, after | |
| publishDocument | Trigger | before, after | |
| restoreTrash | Trigger | after | |
| updateDocument | Trigger | before, after | |
| updateReadedCount | Trigger | before, after | |
| updateVotedCount | Trigger | before, after | |
| updateVotedCountCancel | Trigger | before, after |
글 조회 🚧 초안 작성중
getDocumentList Trigger 🚧 초안 작성중
getNoticeList Trigger 🚧 초안 작성중
글 추가, 수정, 삭제 🚧 초안 작성중
insertDocument Trigger 🚧 초안 작성중
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 Trigger 🚧 초안 작성중
/**
* @see \DocumentController::updateDocument()
*/updateReadedCount Trigger 🚧 초안 작성중
/**
* @see \DocumentController::updateReadedCount()
*/deleteDocument Trigger 🚧 초안 작성중
/**
* @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 Trigger v2.1.12+ 🚧 초안 작성중
/**
* @see \DocumentController::insertDocument()
* @see \DocumentController::updateDocument()
*/휴지통 🚧 초안 작성중
moveDocumentToTrash Trigger 🚧 초안 작성중
restoreTrash Trigger 🚧 초안 작성중
복사, 이동 🚧 초안 작성중
moveDocumentModule Trigger 🚧 초안 작성중
copyDocumentModule Trigger 🚧 초안 작성중
copyDocumentModule.each Trigger 🚧 초안 작성중
신고 🚧 초안 작성중
declaredDocument Trigger 🚧 초안 작성중
declaredDocumentCancel Trigger 🚧 초안 작성중
댓글 🚧 초안 작성중
getComments Trigger 🚧 초안 작성중
기타 🚧 초안 작성중
getDocumentMenu Trigger 🚧 초안 작성중
getThumbnail Trigger 🚧 초안 작성중
manage Trigger 🚧 초안 작성중
updateVotedCount - 추천/비추천 Trigger 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 | Trigger | before, add, after | |
| declaredComment | Trigger | before, after | |
| declaredCommentCancel | Trigger | before, after | |
| deleteComment | Trigger | before, after | |
| getCommentList | Trigger | before, after | |
| getCommentMenu | Trigger | before, after | |
| getThumbnail | Trigger | before | |
| getTotalCommentList | Trigger | before, after | |
| insertComment | Trigger | before, after | |
| moveCommentToTrash | Trigger | before, after | |
| procCommentAdminChangeStatus | Trigger | after | |
| sendEmailToAdminAfterInsertComment | Trigger | after | |
| updateComment | Trigger | before, after | |
| updateVotedCount | Trigger | before, after | |
| updateVotedCountCancel | Trigger | before, after |
copyCommentByDocument Trigger 🚧 초안 작성중
copyCommentByDocument.each Trigger 🚧 초안 작성중
declaredComment Trigger 🚧 초안 작성중
declaredCommentCancel Trigger 🚧 초안 작성중
deleteComment Trigger 🚧 초안 작성중
getCommentList Trigger 🚧 초안 작성중
getCommentMenu Trigger 🚧 초안 작성중
getThumbnail Trigger 🚧 초안 작성중
getTotalCommentList Trigger 🚧 초안 작성중
insertComment Trigger 🚧 초안 작성중
moveCommentToTrash Trigger 🚧 초안 작성중
procCommentAdminChangeStatus Trigger 🚧 초안 작성중
sendEmailToAdminAfterInsertComment Trigger 🚧 초안 작성중
updateComment Trigger 🚧 초안 작성중
updateVotedCount Trigger 🚧 초안 작성중
updateVotedCountCancel Trigger 🚧 초안 작성중
회원 (member) 🚧 초안 작성중
| 트리거 | 타입 | 호출시점 | 설명 |
|---|---|---|---|
| addMemberToGroup | Trigger | after | |
| deleteGroup | Trigger | before, after | |
| deleteMember | Trigger | before, after | |
| deleteScrapDocument | Trigger | before, after | |
| dispMemberSignUpForm | Trigger | before | |
| doAutoLogin | Trigger | after | |
| doLogin | Trigger | before, after | |
| doLogout | Trigger | before, after | |
| getMemberMenu | Trigger | before, after | |
| insertGroup | Trigger | before, after | |
| insertMember | Trigger | before, after | |
| insertMemberDevice | Trigger | before, after | |
| procMemberAuthAccount | Trigger | before, after | |
| procMemberInsert | Trigger | before, after | |
| procMemberModifyInfo | Trigger | after | |
| procMemberScrapDocument | Trigger | before, after | |
| updateGroup | Trigger | before, after | |
| updateMember | Trigger | before, after | |
| updateMemberEmailAddress | Trigger | after |
addMemberToGroup Trigger 🚧 초안 작성중
deleteGroup Trigger 🚧 초안 작성중
deleteMember Trigger 🚧 초안 작성중
deleteScrapDocument Trigger 🚧 초안 작성중
dispMemberSignUpForm Trigger 🚧 초안 작성중
doAutoLogin Trigger 🚧 초안 작성중
doLogin Trigger 🚧 초안 작성중
doLogout Trigger 🚧 초안 작성중
getMemberMenu Trigger 🚧 초안 작성중
insertGroup Trigger 🚧 초안 작성중
insertMember Trigger 🚧 초안 작성중
insertMemberDevice Trigger 🚧 초안 작성중
procMemberAuthAccount Trigger 🚧 초안 작성중
procMemberInsert Trigger 🚧 초안 작성중
procMemberModifyInfo Trigger 🚧 초안 작성중
procMemberScrapDocument Trigger 🚧 초안 작성중
updateGroup Trigger 🚧 초안 작성중
updateMember Trigger 🚧 초안 작성중
updateMemberEmailAddress Trigger 🚧 초안 작성중
파일 (file) 🚧 초안 작성중
| 트리거 | 타입 | 호출시점 | 설명 |
|---|---|---|---|
| deleteFile | Trigger | before, after | |
| downloadFile | Trigger | before, after | |
| insertFile | Trigger | before, after |
deleteFile Trigger before, after 🚧 초안 작성중
downloadFile Trigger before, after 🚧 초안 작성중
insertFile Trigger before, after 🚧 초안 작성중
커뮤니케이션 (communication) 🚧 초안 작성중
deleteMessage Trigger before, after v2.1.12+ 🚧 초안 작성중
deleteMessages Trigger before, after v2.1.12+ 🚧 초안 작성중
addFriend Trigger before, after 🚧 초안 작성중
deleteFriend Trigger before, after 🚧 초안 작성중
sendMessage Trigger before, after 🚧 초안 작성중
기타 🚧 초안 작성중
| 이벤트 | 타입 | 호출 시점 | 설명 |
|---|---|---|---|
| editor.deleteSavedDoc | Trigger | after | |
| mail.send | Trigger | before, after | |
| menu.getModuleListInSitemap | Trigger | after | |
| ncenterlite._insertNotify | Trigger | before, after | |
| point.setPoint | Trigger | before, after | |
| push.send | Trigger | before, after | |
| sms.send | Trigger | before, after |