그러냐

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

php

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

관절분리 2018. 7. 11. 14:07
반응형

출처 : https://conory.com/blog/14432


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

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

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 파일위치

./modules/point/point.controller.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
/**
     * @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();
    }


반응형