XpressEngine

[기초] XE구조의 비밀 그 다섯번째 - 끼어들기의 신 "트리거(trigger)"!!

애드온과 비슷한 성격을 가진 트리거에 대해서 알아보겠습니다.

지난강좌에서 애드온은 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 namecalled 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();
	}



  • ?
    날아라 2014.02.23 20:57:28
    역시 명품강의 입니다. 항상 배워갑니다!
    그런데 예제에서 "문서등록시 포인트를 지급하기위해 트리거등록" 부분에
    insertDocument 이것을 deleteDocument 이것으로 잘못 적으신건가요?
    약간 혼동이 오네요.. 초보라;;

    아 그리고 트리거는 모듈 실행중이 끼어든다는 말이 정확히 이해가 가질않는데
    특정 act(트리거를 지원하는)의 전후로 끼어든다는 말씀이신지요?

    이거는 애드온에서도 가능하지 않는건가요?
    if($this->act=='') 형식으로요..

    두가지가 어떤차이가 있는지 궁금합니다..
    항상 궁금증이 넘쳐나는 conory님 강의 애독자 입니다 ㅠ
  • profile
    CONORY 2014.02.24 15:38:52
    아쿠야.. deleteDocument 잘못적었네요.. 고쳤습니다..

    애드온은 모듈실행 시작과 종료에서만 끼어들 수 있습니다. 즉, 중간에서는...(모듈실행중에는) 끼어들지 못합니다.
    하지만, 트리거는 모듈실행 시작과 종료... 그리고 중간(모듈실행중)에도 끼어들 수 있습니다..

    이해가 되었으면 좋겠습니다..
    고맙습니다..^^
  • ?
    날아라 2014.03.08 11:25:04

    한가지 질문드립니다 ㅠ
    trigger name는 도대체 어디에서 온 녀석들인가요?
    코어에서 제공하는건가요? 아니면 사용자가 만들수도 있는건가요?

  • profile
    CONORY 2014.03.08 12:19:33
    trigger name은 코어에서 제공할 수도 있고, 사용자가 만들 수도 있습니다.

    예를 들어 insertDocument는 코어에 포함되어있는 document모듈의 트리거이지요..
    또한 사용자가 만든 conory라는 모듈이 있다면 그 모듈의 트리거가 존재할 수도 있어요..
  • ?
    디스타임 2014.03.15 21:11:46
    아하 트리거가 이런뜻이였군요!
  • ?
    다이오니 2015.02.02 01:16:39
    애드온과 달리 모듈 실행 중간에 끼어 들수 있는것은 알았는데 일반적으로 어떤 기능들이 트리거로 쓰이나요?
?