XE Trigger 완전 정복하기 3편

Study4U 2014.08.03 21:17 조회 수 : 598

들어가기전에


이번 3편은 예제 위주의 소개가 되기 때문에 특별한 설명보다는 다양한 예제를 중점적으로 소개하겠습니다. 그리고 트리거가 없는 대상의 경우는 조금 부연설명과 함께 소개하도록 하겠습니다. 본 예제들은 triggersample.zip 이라는 모듈명으로 만들어 놓았으니 테스트해보시고 필요한 곳에 응용하시기 바랍니다.


목차


XE에 심어져 있는 트리거 사용하기

  • 글 등록 시 몇가지 정보를 저장하기
  • 글 수정 시 비교 후 정보를 저장하기
  • 글 삭제 시 저장한 정보를 삭제하기
  • 접속자를 확인 후 특정 IP차단하기
  • 본문출력 전 메시지 출력하기
  • 관리자페이지 설명메뉴 트리거 사용하기
  • 내 모듈에서 트리거 만들기


XE에 심어져 있는 트리거 사용하기


글 등록 시 몇가지 정보를 저장하기


function moduleInstall()
{
    $oModuleController = &getController('module');
    $oModuleController->insertTrigger('document.insertDocument', 'triggersample', 'controller', 'triggerInsertTriggersample', 'after');
 
    return new Object();
}
 
function checkUpdate()
{
    $oModuleModel = &getModel('module');
    if(!$oModuleModel->getTrigger('document.insertDocument', 'triggersample', 'controller', 'triggerInsertTriggersample', 'after'))
    {
        return true;
    }
 
    return false;
}
 
function moduleUpdate()
{
    $oModuleModel = &getModel('module');
    $oModuleController = &getController('module');
    if(!$oModuleModel->getTrigger('document.insertDocument', 'triggersample', 'controller', 'triggerInserttriggersample', 'after'))
    {
        $oModuleController->insertTrigger('document.insertDocument', 'triggersample', 'controller', 'triggerInserttriggersample', 'after');
    }
 
 
    return new Object(0,'success_updated');
 
}


/**
 * @brief 등록 정보 추가
 **/
function triggerInsertTriggersample(&$obj)
{
    $args->module_srl = $obj->module_srl;
    $args->document_srl = $obj->document_srl;
    $args->type = 'insert';
 
    $this->insertTriggersample($args);
}
 
/**
 * @brief 정보 추가
 **/
 
function insertTriggersample($args = NULL)
{
    if($args == NULL)
    {
        return new Object(-1, "msg_error_occured");
    }
 
    // begin transaction
    $oDB = &DB::getInstance();
    $oDB->begin();
 
    $output = executeQuery('triggersample.insertTriggersample', $args);
    if(!$output->toBool())
    {
        $oDB->rollback();
        return new Object(-1, "msg_error_occured");
    }
 
    // commit
    $oDB->commit();
 
    return $output;
}



글 수정 시 비교 후 정보를 저장하기


function moduleInstall()
{
    $oModuleController = &getController('module');
    $oModuleController->insertTrigger('document.updateDocument', 'triggersample', 'controller', 'triggerUpdateTriggersample', 'before');
 
    return new Object();
}
 
function checkUpdate()
{
    $oModuleModel = &getModel('module');
    if(!$oModuleModel->getTrigger('document.updateDocument', 'triggersample', 'controller', 'triggerUpdateTriggersample', 'before'))
    {
        return true;
    }
 
    return false;
}
 
function moduleUpdate()
{
    $oModuleModel = &getModel('module');
    $oModuleController = &getController('module');
    if(!$oModuleModel->getTrigger('document.updateDocument', 'triggersample', 'controller', 'triggerUpdateTriggersample', 'before'))
    {
        $oModuleController->insertTrigger('document.updateDocument', 'triggersample', 'controller', 'triggerUpdateTriggersample', 'before');
    }
 
 
    return new Object(0,'success_updated');
}


/**
 * @brief 수정 정보 추가
 **/
function triggerUpdateTriggersample(&$obj)
{
    $oDocumentModel = &getModel('document');
 
    // 제목이 없는 글은 본문의 내용으로 대체한다.
    if(isset($obj->title))
    {
        if($obj->title == '') $document_obj->title = cut_str(strip_tags($obj->content), 20, '...');
        if($obj->title == '') $document_obj->title = 'Untitled';
    }
 
    // 특정 문구를 제거
    $document_obj->content = preg_replace('!<\!--(Before|After)(Document|Comment)\(([0-9]+),([0-9]+)\)-->!is', '', $obj->content);
 
    // 관리자 그룹이 아닐경우 본문에 HackTag를 제거
    if(Context::get('is_logged'))
    {
        $logged_info = Context::get('logged_info');
 
        if($logged_info->is_admin != 'Y')
        {
            $document_obj->content = removeHackTag($document_obj->content);
        }
 
    }
 
    // 현재 글 수정 시 입력받은 값과 비교할 기존의 글 정보를 가져옴
    $oDocument = $oDocumentModel->getDocument($obj->document_srl, FALSE, FALSE);
    $oldDocument = $oDocument->variables;
 
    if($oldDocument['title'] != $obj->title)
    {
        $args->type = 'update';
    }
    elseif($oldDocument['content'] != $obj->content)
    {
        $args->type = 'update';
    }
 
    $args->module_srl = $obj->module_srl;
    $args->document_srl = $obj->document_srl;
    if($args->type == 'update')
    {
        $this->insertTriggersample($args);
    }
}
/**
 * @brief 정보 추가
 **/
function insertTriggersample($args = NULL)
{
    if($args == NULL)
    {
        return new Object(-1, "msg_error_occured");
    }
 
    // begin transaction
    $oDB = &DB::getInstance();
    $oDB->begin();
 
    $output = executeQuery('triggersample.insertTriggersample', $args);
    if(!$output->toBool())
    {
        $oDB->rollback();
        return new Object(-1, "msg_error_occured");
    }
 
    // commit
    $oDB->commit();
 
    return $output;
}


글 삭제 시 저장한 정보를 삭제하기


function moduleInstall()
{
    $oModuleController = &getController('module');
    $oModuleController->insertTrigger('document.deleteDocument', 'triggersample', 'controller', 'triggerDeleteTriggersample', 'after');
 
    return new Object();
}
 
function checkUpdate()
{
    $oModuleModel = &getModel('module');
    if(!$oModuleModel->getTrigger('document.deleteDocument', 'triggersample', 'controller', 'triggerDeleteTriggersample', 'after'))
    {
        return true;
    }
 
    return false;
}
 
function moduleUpdate()
{
    $oModuleModel = &getModel('module');
    $oModuleController = &getController('module');
    if(!$oModuleModel->getTrigger('document.deleteDocument', 'triggersample', 'controller', 'triggerDeleteTriggersample', 'after'))
    {
        $oModuleController->insertTrigger('document.deleteDocument', 'triggersample', 'controller', 'triggerDeleteTriggersample', 'after');
    }
 
 
    return new Object(0,'success_updated');
}


/**
 * @brief 정보 삭제
 **/
function triggerDeleteTriggersample(&$obj)
{
    $args->module_srl = $obj->module_srl;
    $args->document_srl = $obj->document_srl;
 
    $this->deleteTriggersample($args);
}
 
/**
 * @brief 정보 추가
 **/
function insertTriggersample($args = NULL)
{
    if($args == NULL)
    {
        return new Object(-1, "msg_error_occured");
    }
 
    // begin transaction
    $oDB = &DB::getInstance();
    $oDB->begin();
 
    $output = executeQuery('triggersample.insertTriggersample', $args);
    if(!$output->toBool())
    {
        $oDB->rollback();
        return new Object(-1, "msg_error_occured");
    }
 
    // commit
    $oDB->commit();
 
    return $output;
}


접속자를 확인 후 특정 IP차단하기

function moduleInstall()
{
    $oModuleController = &getController('module');
    $oModuleController->insertTrigger('moduleObject.proc', 'triggersample', 'controller', 'triggerProcTriggersample', 'before');
 
    return new Object();
}
 
function checkUpdate()
{
    $oModuleModel = &getModel('module');
    if(!$oModuleModel->getTrigger('moduleObject.proc', 'triggersample', 'controller', 'triggerProcTriggersample', 'before'))
    {
        return true;
    }
 
    return false;
}
 
function moduleUpdate()
{
    $oModuleModel = &getModel('module');
    $oModuleController = &getController('module');
    if(!$oModuleModel->getTrigger('moduleObject.proc', 'triggersample', 'controller', 'triggerProcTriggersample', 'before'))
    {
        $oModuleController->insertTrigger('moduleObject.proc', 'triggersample', 'controller', 'triggerProcTriggersample', 'before');
    }
 
 
    return new Object(0,'success_updated');
}


/**
 * @brief IP차단하기
 **/
function triggerProcTriggersample()
{
    // 로그인 정보 가져오기
    $logged_info = Context::get('logged_info');
    if($logged_info->is_admin == 'Y')
    {
        return;
    }
 
    if($_SERVER['REMOTE_ADDR'] == '127.0.0.1')
    {
        Context::setResponseMethod('XMLRPC');
        $header_message = sprintf("%s %s", 403, 'Forbidden');
        header("HTTP/1.0 ".$header_message);
        header("Status: ".$header_message);
        header("Content-Type: text/html; charset=UTF-8");
        $html = sprintf(
            '<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"><html lang="en" xml:lang="en"><head><title>'.
            '%s</title></head><body><h1>%s</h1>IP block..</body></html>',
            $header_message, 'Forbidden'
        );
 
        die($html);
        return new Object();
    }
}


본문출력 전 메시지 출력하기

function moduleInstall()
{
    $oModuleController = &getController('module');
    $oModuleController->insertTrigger('display', 'triggersample', 'controller', 'triggerDisplayTriggersample', 'before');
 
    return new Object();
}
 
function checkUpdate()
{
    $oModuleModel = &getModel('module');
    if(!$oModuleModel->getTrigger('display', 'triggersample', 'controller', 'triggerDisplayTriggersample', 'before'))
    {
        return true;
    }
 
    return false;
}
 
function moduleUpdate()
{
    $oModuleModel = &getModel('module');
    $oModuleController = &getController('module');
    if(!$oModuleModel->getTrigger('display', 'triggersample', 'controller', 'triggerDisplayTriggersample', 'before'))
    {
        $oModuleController->insertTrigger('display', 'triggersample', 'controller', 'triggerDisplayTriggersample', 'before');
    }
 
 
    return new Object(0,'success_updated');
}


/**
 * @brief 본문출력 전 메시지 출력하기
 **/
function triggerDisplayTriggersample(&$output)
{
    if((Context::get('module') != 'admin') && !Context::get('act'))
    {
        $message = "<font style='font-size:30px;font-weight:bold;'>Triggersample 예제입니다.</font>
";
        $output = "{$message}{$output}";
    }
}


관리자페이지 설정메뉴 트리거 사용하기

function moduleInstall()
{
    $oModuleController = &getController('module');
    $oModuleController->insertTrigger('module.dispAdditionSetup', 'triggersample', 'controller', 'triggerDispTriggersampleAdditionSetup', 'after');
 
    return new Object();
}
 
function checkUpdate()
{
    $oModuleModel = &getModel('module');
    if(!$oModuleModel->getTrigger('module.dispAdditionSetup', 'triggersample', 'controller', 'triggerDispTriggersampleAdditionSetup', 'after'))
    {
        return true;
    }
 
    return false;
}
 
function moduleUpdate()
{
    $oModuleModel = &getModel('module');
    $oModuleController = &getController('module');
    if(!$oModuleModel->getTrigger('module.dispAdditionSetup', 'triggersample', 'controller', 'triggerDispTriggersampleAdditionSetup', 'after'))
    {
        $oModuleController->insertTrigger('module.dispAdditionSetup', 'triggersample', 'controller', 'triggerDispTriggersampleAdditionSetup', 'after');
    }
 
 
    return new Object(0,'success_updated');
}


/**
 * @brief 관리자페이지 게시판 추가설정에 표시하기
 **/
function triggerDispTriggersampleAdditionSetup(&$obj)
{
 
    $oTemplate = &TemplateHandler::getInstance();
    $tpl = $oTemplate->compile($this->module_path.'tpl', 'triggersample_setup');
    $obj .= $tpl;
 
    return new Object();
}


내 모듈에서 트리거 만들기

/**
 * @brief 정보 추가
 **/
function insertTriggersample($args = NULL)
{
    if($args == NULL)
    {
        return new Object(-1, "msg_error_occured");
    }
 
    // trigger 호출 (before)
    $output = ModuleHandler::triggerCall('triggersample.insertTriggersample', 'before', $args);
    if(!$output->toBool()) return $output;
 
    // begin transaction
    $oDB = &DB::getInstance();
    $oDB->begin();
 
    $output = executeQuery('triggersample.insertTriggersample', $args);
    if(!$output->toBool())
    {
        $oDB->rollback();
        return new Object(-1, "msg_error_occured");
    }
 
    // trigger 호출 (after)
    if($output->toBool()) {
        $trigger_output = ModuleHandler::triggerCall('triggersample.insertTriggersample', 'after', $args);
        if(!$trigger_output->toBool()) {
            $oDB->rollback();
            return $trigger_output;
        }
    }
 
    // commit
    $oDB->commit();
 
    return $output;
}


3편 마무리


의외의 분량이 나왔기에 트리거가 없는 대상 처리는 다음편에서 다루겠습니다. 이번 내용은 그간 1, 2편에서 설명했던 내용을 토대로 기본 예제를 만들어 구현을 해보았습니다. 예제는 첨부파일에 모듈로 만들어져있으며, 본 예제와 4편의 예제를 포함한 모듈입니다. 다음 4편에서는 트리거가 없는 대상 트리거 만들기를 통하여 일반 Javscript에서 jQuery, JAF를 이용한 방법까지 예제를 적어보겠습니다.