XpressEngine에서 트리거라는 것은 어떤 동작을 수행하기에 앞서 미리 정의된 트리거 이름으로 등록된 내용(함수)이 있다면 이를 먼저 수행하는 기능을 하게 됩니다.

예를 들어, documentController 클래스에서 게시물을 저장하는데, 이 동작을 수행하기에 앞서 document.insertDocument 라는 이름으로 호출 위치가 before 즉, 선행되어야할 동작이 등록되어 있다면 이를 먼저 수행한 후 게시물을 저장하게 됩니다. 게시물을 저장하는 동작이 끝난 다음에는 document.insertDocument 라는 트리거 이름에 호출 위치가 after로 등록되어 있는 동작을 수행하게 됩니다.

코드는 대충 아래와 같은 형태가 됩니다.

...

// trigger 호출 (before)
$output = ModuleHandler::triggerCall('document.insertDocument', 'before', $obj);
if(!$output->toBool()) return $output;

// 실제 문서 저장 루틴
...

// trigger 호출 (after)
if($output->toBool()) {
    $trigger_output = ModuleHandler::triggerCall('document.insertDocument', 'after', $obj);
    if(!$trigger_output->toBool()) {
        $oDB->rollback();
        return $trigger_output;
    }
}

...

따라서, 만약 게시물이 저장하기에 앞서 내용에 어떤 필터링을 가하고 싶다면, document.insertDocument 라는 트리거 이름을 갖는 함수를 등록해주면 됩니다. 다만, 트리거에 의해 호출되는 함수는 반드시 모듈에 존재해야 합니다. 아직까지 XpressEngine에서는 애드온 등의 함수를 트리거에 의해 호출하는 방법은 없습니다. 따라서, 트리거 기능을 이용하기 위해서는 새로운 모듈을 만들어야 합니다.

예를 들어, 게시물이 등록되기에 앞서 내용에 어떤 필터링을 가하기 위해, 새로운 모듈을 만들고 그 모듈을 설치 혹은 업데이트하는 과정에 아래와 같은 내용을 추가합니다.

...

$oModuleController = &getController('module');
$oModuleController->insertTrigger('document.insertDocument', 'someclass', 'controller', 'triggerInsertDocumentFilter', 'before');

...

이처럼 어떤 특정 동작에 자신이 원하는 기능을 추가하기 위해 트리거를 등록해놓으면, 해당 동작이 실행될 때마다 자신이 등록해놓은 추가 기능을 수행하게 됩니다.

이와 비슷하게 애드온이 있습니다만, 애드온은 보다 일반적인 추가 기능을 위해 사용하는 경우가 많고, 트리거는 어떤 특정 동작에 원하는 기능을 추가하기 위해 사용하게 됩니다.

XpressEngine에서 애드온이 호출되는 시점은 총 4번으로
  • before_module_init
  • before_module_proc
  • after_module_proc
  • before_display_content
이며, 애드온에 대한 자세한 내용은 XpressEngine 메뉴얼을 참고하시기 바랍니다.


아래는 XpressEngine의 최신 버전인 1.2.1 r6096 을 기준으로 각 모듈의 트리거 이름 목록을 정리합니다.

Class
Function
Trigger Name
Call
boardAdminView
dispBoardAdminBoardAdditionSetup
module.dispAdditionSetupbefore/after
commentModel
getCommentMenu
comment.getCommentMenu
before/after
commentController
insertComment
comment.insertComment
before/after

updateCommentcomment.updateComment
before/after

deleteCommentcomment.deleteComment
before/after
documentModel
getDocumentMenudocument.getDocumentMenu
before/after
documentControllerinsertDocumentdocument.insertDocument
before/after

updateDocumentdocument.updateDocument
before/after

deleteDocumentdocument.deleteDocument
before/after

updateReadedCountdocument.updateReadedCount
after
  updateVotedCountdocument.updateVotedCount
after
fileController
downloadFilefile.downloadFile
before/after

insertFilefile.insertFile
before/after

deleteFilefile.deleteFile
before/after
homepageView
dispHomepageBoardAddition
module.dispAdditionSetup
before/after
issuetrackerAdminView
dispIssuetrackerAdminAdditionSetup
module.dispAdditionSetup
before/after
memberController
doLogoutmember.doLogout
before/after

procMemberModifyInfo
member.doLogin
after

procMemberAuthAccount
member.doLoginafter

doLogin
member.doLogin
before/after

insertMembermember.insertMember
before/after

updateMembermember.updateMember
before/after

deleteMembermember.deleteMember
before/after
memberModel
getMemberMenumember.getMemberMenu
before/after
moduleController
deleteModulemodule.deleteModule
before/after
moduleAdminView
dispModuleAdminModuleAdditionSetup
module.dispAdditionSetup
before/after
trackbackController
insertTrackbacktrackback.insertTrackback
before
wikiAdminView
dispWikiAdminWikiAdditionSetup
module.dispAdditionSetup
before/after