Module Admin Controller for Delete
모듈 삭제와 컨트롤러(Controller)
모듈(mid)의 삭제는 모듈의 고유 식별 번호($module_srl)을 확인하고 module 테이블에서 해당 식별 번호를 삭제하는 것으로 끝난다. 여기에서는 프론트 엔드의 내용, 즉 삭제하려고 하는 모듈(mid)이 만들어 놓은 내용물에 대해서는 확인하지 않는다. 아직 프론트 엔드 프로그램을 만들지 않았기 때문이다. 우선 삭제를 원하는 모듈의 식별 번호를 확인하고 module 컨트롤러를 확장하여 example 모듈이 만들어 놓은 모듈(mid)만 삭제하는 것을 구현해 보자.
1. Delete 액션과 모듈 삭제
모듈(mid)을 삭제하기 위한 버튼은 이미 tpl/index.html 파일에 추가해 두었다. 관리자 목록에서 맨 우측 아이콘이 그것이다. 모듈(mid)을 삭제하는 액션을 module.xml 명세서에 등록한다. 모듈의 삭제 또한 컨트롤러의 도움이 필요하기 때문에 2개의 액션을 등록한다. Delete와 관련된 일이기 때문에 disp 와 proc 머릿글을 갖는 Delete 액션을 타입과 함께 설정한다.
<action name="dispExampleAdminDelete" type="view" />
<action name="procExampleAdminDelete" type="controller" />
2. example.admin.view.php
이전에 작성했던 메소드 아래에 다음의 내용을 추가하고 업로드 한다.(모듈 삭제 화면 출력 메소드만 추가해야 한다.)
<?php /** * @class exampleAdminView * @author XE스쿨 모듈 만들기 예제 * @brief example 모듈의 admin view class **/ class exampleAdminView extends example { /** * @brief 모듈(mid) 삭제 화면 출력 **/ function dispExampleAdminDelete() { // 삭제를 요청하는 module_srl 확인하고 없으면 관리자 목록 보기 if(!Context::get('module_srl')) return $this->dispExampleAdminList(); // 선택된 모듈의 정보를 set 함 $module_info = Context::get('module_info'); Context::set('module_info',$module_info); // 템플릿 파일 지정 $this->setTemplateFile('example_admin_delete'); } } /* 윗 부분까지 메소드의 내용을 복사하여 이전 과정에서 추가했던 메소드 아래에 추가하고 업로드 한다. */ ?>
삭제 아이콘을 클릭하게 되면 모듈의 고유 식별 번호($module_srl) 번호도 URL에 붙어서 함께 따라 온다. 이것을 확인해 보고 없으면 다시 목록 보기를 위한 메소드를 실행시킬 것이고, 모듈의 정보를 확인한 후에 있다면 삭제를 위해 준비한 템플릿 파일에 보내기 전에 URL 뒤에 예쁘게 세팅해 보낸다. 모듈(mid) 삭제를 위해 준비한 템플릿은 example_admin_delete.html 이다.
3. 모듈(mid) 삭제 폼
tpl/example_admin_delete.html
<!--%import("filter/admin_delete.xml")--> <!--%import("js/example_admin.js")--> <form action="./" method="get" onsubmit="return procFilter(this, admin_delete)"> <input type="hidden" name="page" value="{$page}" /> <input type="hidden" name="module_srl" value="{$module_info->module_srl}" /> <h3 class="xeAdmin">{$lang->confirm_delete}</h3> <table cellspacing="0" class="rowTable"> <tr> <th scope="row"><div>{$lang->module_name}</div></th> <td class="wide">{$module_info->mid}</td> </tr> <tr> <th scope="row"><div>{$lang->module}</div></th> <td>{$module_info->module}</td> </tr> <tr> <th colspan="2" class="button"> <span class="button black strong"><input type="submit" value="{$lang->cmd_delete}" /></span> <span class="button"><input type="button" value="{$lang->cmd_back}" onclick="history.back(); return false;" /></span> </th> </tr> </table> </form>
모듈의 정보($module_info)를 확인하여 폼에 미리 채워 넣는다. 모듈의 식별 번호($module_srl)는 폼에서 숨김(hidden) 타입(type)형식으로 함께 전송 된다. 모듈 입력 과정과 동일한 방법으로 폼 검사를 위해 procFilter() 함수가 실행되고 폼의 내용(this)은 상단에 임포트 해 둔 admin_delete.xml 필터로 전송 된다. 폼 필터가 회신을 받게 되면 아래에 임포트 해 둔 JS 파일에게 다음 진행 과정과 메시지의 처리를 부탁할 것이다...^^
4. 폼 필터
tpl/filter/admin_delete.xml
<filter name="admin_delete" module="example" act="procExampleAdminDelete"> <form> <node target="module_srl" required="true" /> </form> <response callback_func="completeAdminDelete"> <tag name="error" /> <tag name="message" /> <tag name="page" /> </response> </filter>
모듈(mid) 삭제를 위해 필요한 정보는 모듈의 고유 식별 번호($module_srl) 1개면 충분하다. <node> 요소는 모듈 식별 번호만 확인하고 삭제를 위한 컨트롤러 함수를 호출한다. 서버로 부터의 회신 결과는 콜백함수를 통해 JS 파일에 보낸다.
5. example.admin.controller.php
이전에 작성했던 모듈(mid) 추가 메소드 아래에 다음과 같이 삭제를 위한 메소드의 내용을 추가하고 업로드 한다.
<?php /** * @class exampleAdminController * @author XE스쿨 모듈 만들기 예제 * @brief example 모듈의 admin controller class **/ class exampleAdminController extends example { /** * @brief example 모듈(mid) 삭제 **/ function procExampleAdminDelete() { // 삭제를 요청하는 module_srl 확인 $module_srl = Context::get('module_srl'); // 원본을 찾아 삭제 $oModuleController = &getController;('module'); $output = $oModuleController->deleteModule($module_srl); if(!$output->toBool()) return $output; $this->add('module','example'); $this->add('page',Context::get('page')); $this->setMessage('success_deleted'); } } /* 윗 부분까지 복사 및 추가 */ ?>
삭제를 원하는 모듈(mid)을 확인한 후에 module 컨트롤러를 확장(상속)하여 해당 모듈의 삭제를 요청하고 그 결과를 회신 받는다. 이때도 중요한 것은 example 컨트롤러 자신이 직접 처리하는 것이 아니라 module의 컨트롤러 파일의 삭제 함수를 호출하는 것이다.
6. 콜백 함수
tpl/js/example_admin.xml
/* 모듈 삭제 후 */ function completeAdminDelete(ret_obj) { var error = ret_obj['error']; var message = ret_obj['message']; var page = ret_obj['page']; alert(message); var url = current_url.setQuery('act','dispExampleAdminList').setQuery('module_srl',''); if(page) url = url.setQuery('page',page); location.href = url; }
모듈 삭제 후의 콜백함수를 실행한다. 모듈(mid)의 입력 과정과 동일한 방법으로 목록 보기을 위한 액션을 실행하고 $module_srl은 더이상 필요하지 않기 때문에 빼버린다. 모든 과정이 끝나게 되면 설정된 액션을 실행하기 위해 index.php 파일로 요청을 다시 보내고, dispExampleAdminList 액션을 처리하여 결과를 다시 출력해 준다.
7. 결과 확인
모듈의 삭제를 완료 할 수 있게 되었다...^^