애드온과 비슷한 성격을 가진 트리거에 대해서 알아보겠습니다.
지난강좌에서 애드온은 XE실행에 관여하는 일종의 프로그램이다고 했습니다.
이번강좌에서 배울 트리거도 마찬가지로 XE실행에 관여할 수 있습니다.
트리거!! 누구냐 넌!!
trigger (트리거)는 "총의 방아쇠"라는 뜻입니다. 즉 그 방아쇠를 당겨 총을 쏠 수 있겠지요.. 그런 느낌입니다..
XE에서 trigger는 XE실행중에 다른모듈이 끼어들 수 있는 기능입니다.
그럼 trigger와 애드온의 차이점이 뭐죠?
바로 모듈실행중에 끼어들 수 있다는 점입니다.
애드온은 전체 XE실행 중간에는 끼어들 수 있지만 모듈실행 중에는 끼어들지 못합니다. (모듈실행시작전, 모듈실행종료후에만 가능)
그러나 trigger는 그부분에서 호출만 해준다면 어느곳이나 다 끼어들 수 있습니다.
trigger가 끼어드는 법
트리거는 trigger name과 called position에 의해 구별됩니다.
트리거를 호출하면 해당 trigger name과 called position으로 등록된 함수들이 실행됩니다.
그래서 trigger 함수실행을 통해 다른모듈이 실행중인 모듈에 관여하게 됩니다.
trigger name : 보통 "모듈명.함수명"으로 정해집니다. 예) 'document.updateDocument'
called position : 호출되는 위치를 표시 (보통 before , after를 사용)
*트리거 등록
보통 모듈 설치시 해당 모듈에서 사용할 트리거를 등록합니다.
트리거 호출시 실행함수가 있는 "호출모듈명, 호출클래스명, 호출함수명"과 함께 등록합니다.
그리고 등록한 "호출모듈명, 호출클래스명" 위치에 "호출함수명"으로 된 실행함수가 있어야합니다.
$oModuleController = getController('module');
$oModuleController->insertTrigger(trigger name, 호출모듈명, 호출클래스명, 호출함수명, called position);
*트리거 확인
이미 등록된 트리거인지 아래코드로 알 수 있습니다.
$oModuleModel = getModel('module');
$oModuleModel->getTrigger(trigger name, 호출모듈명, 호출클래스명, 호출함수명, called position);
*트리거 호출
끼어들기를 당할 위치에서 아래코드로 트리거 호출하면 해당 트리거에 등록된 실행함수들이 실행됩니다.
obj 에다 데이터를 넣어주면 실행함수를 실행시킬때 함수인자로 들어갑니다.
$output = ModuleHandler::triggerCall(trigger name, called position, obj);
if(!$output->toBool()) return $output;
*트리거 제거
이제 트리거가 필요없어졌거나 모듈삭제시 아래코드 실행으로 등록된 트리거를 삭제할 수 있습니다.
$oModuleModel = getModel('module');
$oModuleModel->deleteTrigger(trigger name, 호출모듈명, 호출클래스명, 호출함수명, called position);
예시) 문서등록 트리거 - document.insertDocument
- document모듈의 insertDocument 함수에서 트리거 호출
$output = ModuleHandler::triggerCall('document.insertDocument', 'after', $obj);
if(!$output->toBool()) return $output;
- 문서등록시 포인트를 지급하기위해 트리거등록
//포인트 모듈설치시
if(!$oModuleModel->getTrigger('document.insertDocument', 'point', 'controller', 'triggerInsertDocument', 'after'))
$oModuleController->insertTrigger('document.insertDocument', 'point', 'controller', 'triggerInsertDocument', 'after');
- 트리거 실행함수
//point.controller.php 파일위치
/** * @brief A trigger to add points to the member for creating a post */ function triggerInsertDocument(&$obj) { $oDocumentModel = getModel('document'); if($obj->status != $oDocumentModel->getConfigStatus('temp')) { $module_srl = $obj->module_srl; $member_srl = $obj->member_srl; if(!$module_srl || !$member_srl) return new Object(); // The fix to disable giving points for saving the document temporarily if($module_srl == $member_srl) return new Object(); // Get the point module information $oModuleModel = getModel('module'); $config = $oModuleModel->getModuleConfig('point'); $module_config = $oModuleModel->getModulePartConfig('point',$module_srl); // Get the points of the member $oPointModel = getModel('point'); $cur_point = $oPointModel->getPoint($member_srl, true); $point = $module_config['insert_document']; if(strlen($point) == 0 && !is_int($point)) $point = $config->insert_document; $cur_point += $point; // Add points for attaching a file $point = $module_config['upload_file']; if(strlen($point) == 0 && !is_int($point)) $point = $config->upload_file; if($obj->uploaded_count) $cur_point += $point * $obj->uploaded_count; // Increase the point $this->setPoint($member_srl,$cur_point); } return new Object(); }
그런데 예제에서 "문서등록시 포인트를 지급하기위해 트리거등록" 부분에
insertDocument 이것을 deleteDocument 이것으로 잘못 적으신건가요?
약간 혼동이 오네요.. 초보라;;
아 그리고 트리거는 모듈 실행중이 끼어든다는 말이 정확히 이해가 가질않는데
특정 act(트리거를 지원하는)의 전후로 끼어든다는 말씀이신지요?
이거는 애드온에서도 가능하지 않는건가요?
if($this->act=='') 형식으로요..
두가지가 어떤차이가 있는지 궁금합니다..
항상 궁금증이 넘쳐나는 conory님 강의 애독자 입니다 ㅠ