XpressEngine에서 트리거라는 것은 어떤 동작을 수행하기에 앞서 미리 정의된 트리거 이름으로 등록된 내용(함수)이 있다면 이를 먼저 수행하는 기능을 하게 됩니다.
예를 들어, documentController 클래스에서 게시물을 저장하는데, 이 동작을 수행하기에 앞서 document.insertDocument 라는 이름으로 호출 위치가 before 즉, 선행되어야할 동작이 등록되어 있다면 이를 먼저 수행한 후 게시물을 저장하게 됩니다. 게시물을 저장하는 동작이 끝난 다음에는 document.insertDocument 라는 트리거 이름에 호출 위치가 after로 등록되어 있는 동작을 수행하게 됩니다.
코드는 대충 아래와 같은 형태가 됩니다.
따라서, 만약 게시물이 저장하기에 앞서 내용에 어떤 필터링을 가하고 싶다면, document.insertDocument 라는 트리거 이름을 갖는 함수를 등록해주면 됩니다. 다만, 트리거에 의해 호출되는 함수는 반드시 모듈에 존재해야 합니다. 아직까지 XpressEngine에서는 애드온 등의 함수를 트리거에 의해 호출하는 방법은 없습니다. 따라서, 트리거 기능을 이용하기 위해서는 새로운 모듈을 만들어야 합니다.
예를 들어, 게시물이 등록되기에 앞서 내용에 어떤 필터링을 가하기 위해, 새로운 모듈을 만들고 그 모듈을 설치 혹은 업데이트하는 과정에 아래와 같은 내용을 추가합니다.
이처럼 어떤 특정 동작에 자신이 원하는 기능을 추가하기 위해 트리거를 등록해놓으면, 해당 동작이 실행될 때마다 자신이 등록해놓은 추가 기능을 수행하게 됩니다.
이와 비슷하게 애드온이 있습니다만, 애드온은 보다 일반적인 추가 기능을 위해 사용하는 경우가 많고, 트리거는 어떤 특정 동작에 원하는 기능을 추가하기 위해 사용하게 됩니다.
XpressEngine에서 애드온이 호출되는 시점은 총 4번으로
아래는 XpressEngine의 최신 버전인 1.2.1 r6096 을 기준으로 각 모듈의 트리거 이름 목록을 정리합니다.
예를 들어, 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의 최신 버전인 1.2.1 r6096 을 기준으로 각 모듈의 트리거 이름 목록을 정리합니다.
| Class | Function | Trigger Name | Call |
| boardAdminView | dispBoardAdminBoardAdditionSetup | module.dispAdditionSetup | before/after |
| commentModel | getCommentMenu | comment.getCommentMenu | before/after |
| commentController | insertComment | comment.insertComment | before/after |
| updateComment | comment.updateComment | before/after | |
| deleteComment | comment.deleteComment | before/after | |
| documentModel | getDocumentMenu | document.getDocumentMenu | before/after |
| documentController | insertDocument | document.insertDocument | before/after |
| updateDocument | document.updateDocument | before/after | |
| deleteDocument | document.deleteDocument | before/after | |
| updateReadedCount | document.updateReadedCount | after | |
| updateVotedCount | document.updateVotedCount | after | |
| fileController | downloadFile | file.downloadFile | before/after |
| insertFile | file.insertFile | before/after | |
| deleteFile | file.deleteFile | before/after | |
| homepageView | dispHomepageBoardAddition | module.dispAdditionSetup | before/after |
| issuetrackerAdminView | dispIssuetrackerAdminAdditionSetup | module.dispAdditionSetup | before/after |
| memberController | doLogout | member.doLogout | before/after |
| procMemberModifyInfo | member.doLogin | after | |
| procMemberAuthAccount | member.doLogin | after | |
| doLogin | member.doLogin | before/after | |
| insertMember | member.insertMember | before/after | |
| updateMember | member.updateMember | before/after | |
| deleteMember | member.deleteMember | before/after | |
| memberModel | getMemberMenu | member.getMemberMenu | before/after |
| moduleController | deleteModule | module.deleteModule | before/after |
| moduleAdminView | dispModuleAdminModuleAdditionSetup | module.dispAdditionSetup | before/after |
| trackbackController | insertTrackback | trackback.insertTrackback | before |
| wikiAdminView | dispWikiAdminWikiAdditionSetup | module.dispAdditionSetup | before/after |
- CMS,
- XE,
- 제로보드XE,
- XpressEngine,
- 트리거,
- 애드온,
- 메뉴얼,
- WebProgramming,
- Programming
2010.03.12 12:28:24
彼女が欲しい
ショッピング枠現金化オススメサイト紹介
ショッピング枠現金化比較サイト
ショッピング枠現金化サイト案内
ショッピング枠現金化-有効活用-
ショッピング枠現金化[賢いお金の使い方]
ショッピング枠現金化[低金利の借入]
ショッピング枠現金化-即日現金化-
ショッピング枠現金化-無審査即現金化-
ショッピング枠現金化[借金履歴を残さない方法]
ショッピング枠現金化[クレジットカード有効活用]
ショッピング枠現金化-簡単手続・審査不要-
ショッピング枠現金化[最短現金化]
ショッピング枠現金化-オススメサイト一覧-
ショッピング枠現金化[優良サイト紹介]
ショッピング枠現金化-高還元比較-
ショッピング枠現金化[優良サービス紹介]
ショッピング枠現金化-安心優良サービス-
ショッピング枠現金化[簡単手続き即現金]
ショッピング枠現金化-初心者の為の比較サイト-
ショッピング枠現金化[賢くお金を借りる方法]
ショッピング枠現金化-借り入れ一本化-
ショッピング枠現金化オススメサイト紹介
ショッピング枠現金化比較サイト
ショッピング枠現金化サイト案内
ショッピング枠現金化-有効活用-
ショッピング枠現金化[賢いお金の使い方]
ショッピング枠現金化[低金利の借入]
ショッピング枠現金化-即日現金化-
ショッピング枠現金化-無審査即現金化-
ショッピング枠現金化[借金履歴を残さない方法]
ショッピング枠現金化[クレジットカード有効活用]
ショッピング枠現金化-簡単手続・審査不要-
ショッピング枠現金化[最短現金化]
ショッピング枠現金化-オススメサイト一覧-
ショッピング枠現金化[優良サイト紹介]
ショッピング枠現金化-高還元比較-
ショッピング枠現金化[優良サービス紹介]
ショッピング枠現金化-安心優良サービス-
ショッピング枠現金化[簡単手続き即現金]
ショッピング枠現金化-初心者の為の比較サイト-
ショッピング枠現金化[賢くお金を借りる方法]
ショッピング枠現金化-借り入れ一本化-

초면에 실례되지만 조언을 부탁드리고자 댓글을 남깁니다.
현재 게시판모듈을 이용해서 가입신청서를 만들고 있습니다.
가입신청서 쓰기는 비회원도 가능해야하고
나머지 목록보기,내용보기,수정등은 관리그룹만 가능해야하기때문에
비회원이 글을쓰고 나면 내용보기로 이동해버리기 때문에 권한없음의 페이지를 보게되서
이를 가입완료페이지로 이동시키고자 합니다.
제로보드나 그누보드에서는 write_ok.php등에서 주소설정만 해주면 되었지만
XE에서는 어디서 끼어들어야할지 모르겠더군요
그래서 검색 검색해서 트리거와 애드온으로 해야한다는 결과까지 왔습니다.
(물론 맞는 것인지는 아직 모르겠습니다.)
XE홈페이지나 구글검색에서도 mooo님의 글들이 도움이 많이 되었습니다.
http://www.xpressengine.com/17911989#comment_17914961
그리고 다른 분들의 애드온소스를 분석한 결과
아래와 같은 소스가 예상이 되는데요
if(($this->act == 'procBoardInsertDocument' || $this->act == 'procBoardInsertComment' ) && $called_position == 'after_module_proc'){
if(!$addon_info->mid_list){
$selected = true;
} else {
$selected = false;
foreach($addon_info->mid_list as $val){
if(trim($val) == $this->mid){
$selected = true;
break;
}
}
}
if($selected){
$apply_ok_url = "www.domain.com/apply_ok";
if($this->act == 'procBoardInsertDocument') {
echo"<meta http-equiv=\"refresh\" content=\"0; url=$apply_ok_url\">";
}
}
}
일단 이런식으로 작성해서 테스트를 해봐도
전혀 작동을 안하네요
HTML과 CSS정도밖에 아는게 없는처지라 위 코드가 논리적으로 맞는것인지
애드온으로서 기준에 맞는것인지도 모르는 상태입니다.;;
심지어 모든 애드온 코드를 지우고
movepage($apply_ok_url);만 남겨놓아도 글작성후 반응이 없는것으로 보아
위 소스가 애드온으로 전혀 작동을 않하고 있는것 같기도 합니다.
조언좀 부탁드립니다.