들어가기전에
이번 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; }