https://web.archive.org/web/20161129142705/http://www.xeschool.com/xe/xenote_module_admin_controller_insert

Module Admin Controller for Insert/Update

예제로 만들고 있는 example 모듈에서 새로운 모듈(mid)을 추가하고 수정할 수 있는 액션과 그에 따른 진행 과정을 그린 설계도이다. 모듈(module)을 추가 한다는 것은 example 모듈과 같이 기능적인 모듈을 추가한다는 것이 아니라, 앞으로 example 모듈이 생성하고 관리하는 자손(자식이라는 말은 어감이 쫌...^^) 모듈, 즉 XE코어가 인식하고 독립적으로 활용될 수 있는 모듈의 아이디(mid)와 모듈의 고유 식번 번호(module_srl)을 생성한다는 뜻이다. 이러한 백엔드 프로그램을 완성하게 되면 추후 만들고자 하는 모듈(mid)의 프론트 엔드 프로그램도 호적(?)에 등록하고 관리할 수 있는 근거가 된다.

모듈(mid)을 등록하기 위해서는 컨트롤러 파일의 도움을 받아야 한다. 이때 새로 등장하는 친구가 있다. 폼(Form) 필터(Filter)와 자바스크립트(javascript)다.(앞으로 JS라고 부른다.) 앞서 관리자 목록을 구현하기 위한 과정을 이해하였다면 아래 그림도 이해가 쉬울 것이다. 폼을 작성하여 전송(submit)하게 되면 곧바로 컨트롤러로 보내지 않는다. 우선 폼의 내용이 유효한지 검사해 본다. 이것은 폼 필터가 확인한다. 폼의 내용이 유효하고 이상이 없으면 컨트롤러에게 보내지고 컨트롤러는 함께 따라온 모듈 정보(module_info)를 확인한 후에 고유 식별번호(module_srl)가 있는지 조건으로 체크하고 없으면 새로 입력하거나 있으면 수정을 요청한다. 이때 입력과 수정은 컨트롤러 자신이 처리하는 것이 아니다. module 컨트롤러를 확장하여 부탁하는 것이다.

module 컨트롤러가 작업을 완료하면 이전의 폼 필터(Filter)가 폼의 내용을 전송하면서 자신(example)의 컨트롤러에게 부탁해 두었던 말이 있다. "컨트롤러는 일이 잘 처리 되었는지 결과를 내게 꼭 다시 알려줘야 해!" 이것이 콜백함수이다. 컨트롤러에게서 응답이 오면 성공과 실패에 대한 회신 내용을 JS에게 보내준다. 최종적으로 JS는 URL 뒤에 회신 내용과 함께 필요한 액션을 추가로 붙여 보내준다...^^

https://web.archive.org/web/20161129142705im_/http:/www.xeschool.com/xenote_page/images/module_mvc_dispExampleAdminInsert.png

  1. Insert 액션과 모듈 생성 버튼 추가
  1. 모듈(mid)을 추가하는 일에 대해 함수의 이름을 module.xml 명세서에 등록한다. 앞으로 이 액션은 이런 일을 하게 될 것이라고 모듈 핸들러에게 설명하는 것이다. 모듈의 입력은 컨트롤러의 도움이 필요하기 때문에 2개의 액션을 등록한다. Insert와 관련된 일이기 때문에 머릿글을 proc로 바꾸고 타입(type)은 "controller"로 설정한다. 그러면 모듈 핸들러는 "어드민 컨트롤러에 있는 함수구나!"라고 쉽게 알 수 있다...^^
<action name="dispExampleAdminInsert" type="view" />
<action name="procExampleAdminInsert" type="controller" />
  1. 모듈 생성 버튼 추가

관리자 목록을 위한 index.html 의 맨 하단에 모듈 생성을 위한 버튼을 다음과 같이 추가한다. 즉 이 버튼을 클릭하게 되면 모듈 명세서에 등록한 dispExampleAdminInsert 액션을 실행하겠다는 뜻이다. 이 액션의 함수는 어드민 뷰(View) 파일의 메소드를 가리킨다.

tpl/index.html

<div class="clear">
    <div class="fr">
        <a href="{getUrl('act','dispExampleAdminInsert')}" class="button black strong"><span>{$lang->cmd_make}</span></a>
    </div>
</div>

2. example.admin.view.php

이전에 작성했던 관리자 목록 메소드 아래에 다음의 내용을 포함하여 업로드 한다. (모듈 insert/update 화면 출력 메소드만 추가해야 한다.)

<?php
    /**
     * @class  exampleAdminView
     * @author XE스쿨 모듈 만들기 예제
     * @brief  example 모듈의 admin view class
     **/

    class exampleAdminView extends example {

        /**
         * @brief 모듈(mid) insert/update 화면 출력
         **/
		function dispExampleAdminInsert() {

            // 스킨 목록을 구해옴
            $oModuleModel = &getModel;('module');
            $skin_list = $oModuleModel->getSkins($this->module_path);
            Context::set('skin_list',$skin_list);

            // 레이아웃 목록을 구해옴
            $oLayoutModel = &getModel;('layout');
            $layout_list = $oLayoutModel->getLayoutList();
            Context::set('layout_list', $layout_list);

            // 템플릿 파일 지정
            $this->setTemplateFile('example_admin_insert');
		}
    } /* 윗 부분까지 메소드의 내용을 복사하여 관리자 목록 아래로 추가하고 업로드 한다. */
?>

module 모델(Model)의 객체와 layout 모델(Model)의 객체를 생성(참조의 방식으로 확장 또는 상속을 의미한다)하고 앞으로 생성될 example 모듈(mid)에서 사용할 스킨(example 모듈의 스킨 목록)과 레이아웃의 목록을 미리 구해 온다. 구해 온 스킨과 레이아웃의 내용은 템플릿에 보내기 전에 $skin_list 변수와 $layout_list 변수에 담아 URL 뒤에 예쁘게 세팅해서 보내는 것이다. 또한 모듈(example)의 정보가 있다면 $module_info의 내용도 함께 보내질 것이다. 이미 초기화(init)에서 모듈의 정보를 구하고 세팅해 두었다. 모듈(mid)의 입력과 수정을 위해 준비한 템플릿은 example_admin_insert.html 이다.

3. 모듈(mid) 입력/수정 폼

tpl/example_admin_insert.html : 파일 다운로드 / example_admin_insert.html