들어가기전에

이펀 4편은 트리거가 없는 대상도 트리거를 처리할 수 있도록 하는 방법을 소개합니다. 모든 요소의 처리에 이 방법이 다 사용가능한건 아니지만 대체적으로 입력과정에 사용되는 폼 위주의 처리는 이 예제를 활용한다면 가능하리라 생각합니다. 본 예제는 triggersample.zip 를 통해 구현되어있습니다.

목차

트리거가 없는 대상 트리거 만들기

  • 설문조사 작성하기
  • 설문조사 투표하기
  • 관리자페이지 레이아웃 설정하기

 

트리거가 없는 대상 트리거 만들기

우선 트리거를 만들어내기 위해서는 자바스크립트를 호출해야합니다. 트리거 기능을 이용할때는 PHP를 적극 활용했지만 이미 트리거라는게 존재하지 않는 대상이기에 더 이상 PHP로 트리거를 만들긴 어렵고, 그 대신에 출력되는 페이지 상에서 폼(form) 처리를 수행하기전에 먼저 스크립트를 호출하는 방법을 사용합니다.

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('act') == 'dispEditorPopup')
    {
        Context::addJsFile('./modules/triggersample/tpl/js/triggersample1.js', NULL, NULL, NULL, 'body');
    }
}

 

 

우선 아래와 같이 트리거가 없는 대상을 선정하여 본 예제를 제작해보았습니다.

  • 설문조사 작성하기
  • 설문조사에 투표하기
  • 관리자페이지 레이아웃 설정하기

 

설문조사 작성하기

설문조사 작성하기

그림1)


게시글 작성 시 에디터의 확장 컴포넌트에 보시면 설문조사라는 메뉴가 있습니다. 누르면 팝업이 나오게 되는데 접속 주소는 아래와 같습니다.
 

http://127.0.0.1/xe/?module=editor&act=dispEditorPopup&editor_sequence=13114&component=poll_maker

 

우선 모든 출력에 자바스크립트를 출력시키게 되면 호환이나 성능에 문제를 줄 수 있기 때문에 위쪽에 triggerDisplayTriggersample() 함수에서 처리한 자바스크립트 호출을 이 설문조사에서만 하도록 처리해두는게 좋습니다.

if(Context::get(‘module’) == ‘editor’ && Context::get(‘act’) == ‘dispEditorPopup’)
{
    ....
}

(처리하는 방법으로는 module, act의 값을 통해 구분해 내시는걸 추천합니다.)

임시로 파일만 만들어두고 자바스크립트를 호출시켜봅니다.

if(Context::get(‘module’) == ‘editor’ && Context::get(‘act’) == ‘dispEditorPopup’)
{
    Context::addJsFile('./modules/triggersample/tpl/js/triggersample1.js', NULL, NULL, NULL, 'body');
}

 

addJsFile()을 호출하면 아래와 같이 호출됩니다.

    <!-- ETC -->
    <div class="wfsr"></div>
    <script type="text/javascript" src="/xe/files/cache/js_filter_compiled/eb78259ba640a441a49eaaad9efbe2dd.ko.compiled.js?20120517215813"></script>
    <script type="text/javascript" src="/xe/common/js/plugins/ui/jquery-ui.min.js?20111229144956"></script>
    <script type="text/javascript" src="/xe/common/js/plugins/ui/jquery.ui.datepicker-ko.js?20111229144956"></script>
    <script type="text/javascript" src="/xe/addons/resize_image/js/resize_image.min.js?20111108155145"></script>
    <script type="text/javascript" src="/xe/modules/triggersample/tpl/js/triggersample1.js?20120517225148"></script>


트리거를 만들기 위해서 설문조사 폼에서 ‘등록’이란 버튼이 수행되기 전에 다른 함수를 호출시킬 필요가 있습니다. 우선 설문조사의 폼 정보를 살펴보겠습니다.

<h1 class="h1">설문조사 ver. 0.1</h1>
<form action="./" method="post" id="fo_component" onSubmit="procFilter(this, insert_poll); return false;"><input type="hidden" name="error_return_url" value="/xe/?module=editor&act=dispEditorPopup&editor_sequence=13114&component=poll_maker" /><input type="hidden" name="act" value="dispEditorPopup" /><input type="hidden" name="mid" value="" /><input type="hidden" name="vid" value="" />
    <input type="hidden" name="component" value="poll_maker" />
    <input type="hidden" name="method" value="insertPoll" />
    <input type="hidden" name="poll_srl" value="" />

   ... 중략

    <div class="btnArea">
        <span class="btn"><input type="submit" value="등록" /></span>
        <span class="btn"><button type="button" id="add_poll">설문 추가</button></span>
        <span class="btn"><a href="./?module=editor&act=dispEditorComponentInfo&component_name=poll_maker" target="_blank">컴포넌트 소개</a></span>
    </div>
</form>

 

우선 <form> 태그를 살펴보면 onSubmit="procFilter(this, insert_poll); return false;" 이라는 값이 있습니다. filter를 이용하여 폼을 전달하고 있는데요. 값을 전달하기 전에 insert_poll.xml 필터 파일을 통하여 처리하도록 되어있습니다.

<filter name="insert_poll" module="poll" act="procInsert" confirm_msg_code="confirm_submit">
    <form />
    <parameter />
    <response callback_func="completeInsertPoll">
        <tag name="error" />
        <tag name="message" />
        <tag name="poll_srl" />
    </response>
</filter>

 

폼 처리 후 completeInsertPoll() 스크립트를 불러오도록 되어있습니다.

/**
 * 부모창의 위지윅에디터에 데이터를 삽입
 **/
function completeInsertPoll(ret_obj) {
    if(typeof(opener)=="undefined") return null;

    var fo_obj = get_by_id('fo_component');
    var skin = fo_obj.skin.options[fo_obj.skin.selectedIndex].value;

    var poll_srl = ret_obj["poll_srl"];
    if(!poll_srl) return null;

    var text = "<img src=\"../../../../common/img/blank.gif\" poll_srl=\""+poll_srl+"\" editor_component=\"poll_maker\" skin=\""+skin+"\" style=\"display:block;width:400px;height:300px;border:2px dotted #4371B9;background:url(./modules/editor/components/poll_maker/tpl/poll_maker_component.gif) no-repeat center;\"  />";

    alert(ret_obj['message']);

    opener.editorFocus(opener.editorPrevSrl);

    var iframe_obj = opener.editorGetIFrame(opener.editorPrevSrl)

    opener.editorReplaceHTML(iframe_obj, text);
    opener.editorFocus(opener.editorPrevSrl);
    window.close();

    return null;
}

 

 

이제부터 트리거를 만들어보겠습니다. 위의 completeInsertPoll() 함수를 조금전에 선언했던 triggersample1.js에 입력 합니다. 그리고 아래처럼 수정합니다.

/**
 * 부모창의 위지윅에디터에 데이터를 삽입
 **/
function completeInsertPoll(ret_obj) {
    if(typeof(opener)=="undefined") return null;

    var fo_obj = get_by_id('fo_component');
    var skin = fo_obj.skin.options[fo_obj.skin.selectedIndex].value;

    var poll_srl = ret_obj["poll_srl"];
    if(!poll_srl) return null;

    /***************** 트리거가 없는 경우 트리거 사용하기 *****************/
    var params = new Array();
    params['poll_srl'] = poll_srl;
    exec_xml('triggersample','triggerTriggersampleInsertPoll', params, completeTriggersample);
    /***************** 트리거가 없는 경우 트리거 사용하기 끝 *****************/

    var text = "<img src=\"../../../../common/img/blank.gif\" poll_srl=\""+poll_srl+"\" editor_component=\"poll_maker\" skin=\""+skin+"\" style=\"display:block;width:400px;height:300px;border:2px dotted #4371B9;background:url(./modules/editor/components/poll_maker/tpl/poll_maker_component.gif) no-repeat center;\"  />";

    alert(ret_obj['message']);

    opener.editorFocus(opener.editorPrevSrl);

    var iframe_obj = opener.editorGetIFrame(opener.editorPrevSrl)

    opener.editorReplaceHTML(iframe_obj, text);
    opener.editorFocus(opener.editorPrevSrl);
    window.close();

    return null;
}

function completeTriggersample()
{
}

var params = new Array();
params['poll_srl'] = poll_srl;
exec_xml('triggersample','triggerTriggersampleInsertPoll', params, completeTriggersample);


설문조사가 입력되고 최종적으로 수행을 완료하기 전에 우리는 triggerTriggersampleInsertPoll() 함수를 호출하여 내용을 기록하도록 추가하였습니다.


자바스크립트는 기본적으로 중복되는 함수명을 불러오면 제일 마지막에 불러오는 함수명을 수행하도록 되어있습니다. 그렇기에 제일 간단한 방법으로는 해당 파일을 제일하단에 한번 더 스크립트를 처리시키면서 중간에 우리가 사용할 트리거용 처리를 추가하는겁니다. 처리하는 함수는 반드시 conf/module.xml에 선언되어있으셔야겠죠.

/**
 * @brief 설문조사 생성시 함수 수행
 **/
function triggerTriggersampleInsertPoll()
{
    $obj = Context::getRequestVars();
    $args->module_srl = 0;
    $args->document_srl = 0;
    $args->poll_srl = $obj->poll_srl;
    $args->type = 'poll';

    $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;
}

 

 

Atachment
첨부