You cannot see this page without javascript.

Skip Navigation

XE 레이아웃 카메론 XE LAYOUT CAMERON XE2.0.11


모듈
2020.08.13 15:12

입력 컨트롤러(Controller)

profile
(*.168.0.1) Views 44 Votes 0 Comment 0
Extra Form
원문주소
페이지 00026
?

Shortcut

PrevPrev Article

NextNext Article

Larger Font Smaller Font Up Down Go comment Print

Module Admin Controller for Insert/Update

모듈 입력/수정과 컨트롤러(Controller)

예제로 만들고 있는 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 뒤에 회신 내용과 함께 필요한 액션을 추가로 붙여 보내준다...^^

dispExampleAdminInsert

1. Insert 액션과 모듈 생성 버튼 추가

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

<action name="dispExampleAdminInsert" type="view" />
<action name="procExampleAdminInsert" type="controller" />

 

2) 모듈 생성 버튼 추가

관리자 목록을 위한 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

 

<!--%import("filter/admin_insert.xml")-->
<!--%import("js/example_admin.js")-->
 
<form action="./" method="post" onsubmit="return procFilter(this, admin_insert)" enctype="multipart/form-data">
<input type="hidden" name="page" value="{$page}" />
<input type="hidden" name="module_srl" value="{$module_info->module_srl}" />
 
    <table cellspacing="0" class="rowTable">
    <!-- 모듈 이름 -->
    <tr>
        <th scope="row"><div>{$lang->mid}</div></th>
        <td>
            <input type="text" name="mid" value="{$module_info->mid}" class="inputTypeText w200" />
            <p>{$lang->about_mid}</p>
        </td>
    </tr>
    <!-- 브라우저 제목 -->
    <tr>
        <th scope="row"><div>{$lang->browser_title}</div></th>
        <td>
            <input type="text" name="browser_title" value="{htmlspecialchars($module_info->browser_title)}"  class="inputTypeText w400" id="browser_title"/>
            <a href="{getUrl('','module','module','act','dispModuleAdminLangcode','target','browser_title')}" onclick="popopen(this.href);return false;" class="buttonSet buttonSetting"><span>{$lang->cmd_find_langcode}</span></a>
            <p>{$lang->about_browser_title}</p>
        </td>
    </tr>
    <!-- 레이아웃 옵션 -->
    <tr>
        <th scope="row"><div>{$lang->layout}</div></th>
        <td>
            <select name="layout_srl">
            <option value="0">{$lang->notuse}</option>
            <!--@foreach($layout_list as $key => $val)-->
            <option value="{$val->layout_srl}" <!--@if($module_info->layout_srl==$val->layout_srl)-->selected="selected"<!--@end-->>{$val->title} ({$val->layout})</option>
            <!--@end-->
            </select>
            <p>{$lang->about_layout}</p>
        </td>
    </tr>
    <!-- 모듈 스킨 옵션 -->
    <tr>
        <th scope="row"><div>{$lang->skin}</div></th>
        <td>
            <select name="skin">
                <!--@foreach($skin_list as $key=>$val)-->
                <option value="{$key}" <!--@if($module_info->skin==$key ||(!$module_info->skin && $key=='xe_form'))-->selected="selected"<!--@end-->>{$val->title}</option>
                <!--@end-->
            </select>
            <p>{$lang->about_skin}</p>
        </td>
    </tr>
    <!-- 관리용 설명 -->
    <tr>
        <th scope="row"><div>{$lang->description}</div></th>
        <td>
            <textarea name="description" class="inputTypeTextArea fullWidth">{htmlspecialchars($module_info->description)}</textarea>
            <p>{$lang->about_description}</p>
        </td>
    </tr>
    <!-- 모듈 상단 내용 -->
    <tr>
        <th scope="row"><div>{$lang->header_text}</div></th>
        <td>
            <textarea name="header_text" class="inputTypeTextArea fullWidth" id="header_text">{htmlspecialchars($module_info->header_text)}</textarea>
            <a href="{getUrl('','module','module','act','dispModuleAdminLangcode','target','header_text')}" onclick="popopen(this.href);return false;" class="buttonSet buttonSetting"><span>{$lang->cmd_find_langcode}</span></a>
            <p>{$lang->about_header_text}</p>
        </td>
    </tr>
    <!-- 모듈 하단 내용 -->
    <tr>
        <th scope="row"><div>{$lang->footer_text}</div></th>
        <td>
            <textarea name="footer_text" class="inputTypeTextArea fullWidth" id="footer_text">{htmlspecialchars($module_info->footer_text)}</textarea>
            <a href="{getUrl('','module','module','act','dispModuleAdminLangcode','target','footer_text')}" onclick="popopen(this.href);return false;" class="buttonSet buttonSetting"><span>{$lang->cmd_find_langcode}</span></a>
            <p>{$lang->about_footer_text}</p>
        </td>
    </tr>
    <!-- 등록 버튼 -->
    <tr>
        <th colspan="2" class="button">
            <span class="button black strong"><input type="submit" value="{$lang->cmd_registration}" accesskey="s" /></span>
        </th>
    </tr>
    </table>
 
</form>

 

모듈의 입력과 수정을 위한 폼(form) 파일이다. 모듈의 고유 식별 번호($module_srl)는 없는 경우 자동으로 생성될 것이고 이것은 변경이 불가능하다. 필수로 입력해야 할 내용은 모듈의 이름으로 사용될 모듈의 아이디(mid)와 브라우저 제목이다. 나머지는 모듈(mid)을 위한 스킨과 레이아웃 템플릿을 선택하는 옵션, 그리고 모듈(mid)의 상하단에 출력할 수 있는 텍스트 입력 필드가 있다.(추후에 알아본다)

폼이 작성되면 전송(submit)하게 되는데 이때 폼에 채워진 내용(this)을 검증하기 위해 procFilter() 함수가 동작한다. onsubmit="return procFilter(this, admin_insert)" 가 그것이다. admin_inset.xml은 XML 형식의 폼 검증 도구이다. 폼 검증을 위한 도구는 최상단에서 임포트(import) 형식으로 미리 불러놓게 된다. 폼 필터는 입력된 내용을 <node> 요소로 확인한 후에 이상이 없으면 컨트롤러 액션을 실행할 것이고 되돌려 받는 응답 메시지는 콜백함수(callback_func)로 처리하여 JS에게 보내진다. 따라서 최상단에 동일한 방법으로 example_admin.js 파일을 임포트 해 둔다. (JS파일은 어드민 뷰 파일에서 템플릿 형식으로 미리 설정해 둘 수 있다. 여기서는 직접 임포트하였다.)

백엔드의 스타일과 언어팩은 XE코어의 도움을 받게 된다. 따라서 특별히 추가하거나 수정할 필요는 없다. 만약 example 모듈의 프론트 엔드에 대한 내용을 만들게 되면 XE코어는 모르는 내용이기 때문에 스타일과 언어팩 작업을 해 주어야 하는 것이다. 첨부된 파일을 다운로드 받거나 위의 내용을 복사하여 tpl 폴더에 example_admin_insert.html 파일 이름으로 추가하고 업로드 하자. 그러면 모듈 생성 버튼을 클릭했을 때 추가된 템플릿 파일을 찾아 보여주게 된다.

 

 

4. 폼 필터

tpl/filter/admin_insert.xml

 

<filter name="admin_insert" module="example" act="procExampleAdminInsert" confirm_msg_code="confirm_submit">
    <form>
        <node target="mid" required="true" maxlength="40" filter="alpha_number" />
        <node target="browser_title" required="true" maxlength="250" />
    </form>
    <response callback_func="completeAdminInsert">
        <tag name="error" />
        <tag name="message" />
        <tag name="module" />
        <tag name="act" />
        <tag name="page" />
        <tag name="module_srl" />
    </response>
</filter>

 

 

XML 필터 파일의 유효성 검증 문법은 개발자 메뉴얼 p.55에 자세히 기술되어 있다. 여기서도 중요한 것은 폼의 입력 필드(name)에 대응하는 <node> 요소의 유효성 검증을 통과해야 한다는 것이다. 요소에 따른 속성에서 필수요소인지, 허용된 문자열의 길이는 맞는지, 문자열의 형식(알파벳 또는 숫자)을 확인해 보고 이상이 없다면 컨트롤러에게 전달되는 것이다. 컨트롤러에게 내용을 보내면서 응답 변수로 사용될 내용을 함께 포함한다. 오류가 있다면 어떤 문제인지 메시지를 보내달라고 요청하는 것이다. 최종적으로 컨트롤러에게서 응답이 오게 되면 JS에게 받은 응답의 내용을 보내주고 할 일을 끝낸다...^^ 여기서도 폼 필터의 이름(name)이 요청 함수에서 설정한 파일의 이름과 같아야 하고, tpl/filter 폴더 안에서 찾기 때문에 tpl 폴더 안에 filter 폴더를 새로 만들고 업로드 하자.

 

5. example.admin.controller.php

다음의 내용을 모두 포함하여 example.admin.controller.php 라는 이름의 새로운 컨트롤러 파일을 만들고 업로드 한다.

 

<?php

    /**

     * @class  exampleAdminController

     * @author XE스쿨 모듈 만들기 예제

     * @brief  example 모듈의 admin controller class

     **/



    class exampleAdminController extends example {



        /**

         * @brief 초기화

         **/

        function init() {

        }



        /**

         * @brief example 모듈(mid) 추가

         **/

        function procExampleAdminInsert($args = null) {



            // module 모듈의 model/controller 객체 생성

            $oModuleController = &getController;('module');

            $oModuleModel = &getModel;('module');



            // request 값을 모두 받음

            $args = Context::getRequestVars();

            $args->module = 'example';



            // module_srl이 넘어오면 원 모듈이 있는지 확인

            if($args->module_srl) {

                $module_info = $oModuleModel->getModuleInfoByModuleSrl($args->module_srl);

                if($module_info->module_srl != $args->module_srl) unset($args->module_srl);

            }



            // module_srl 값의 존재여부에 따라 insert/update

            if(!$args->module_srl) {

                $output = $oModuleController->insertModule($args);

                $msg_code = 'success_registed';

            } else {

                $output = $oModuleController->updateModule($args);

                $msg_code = 'success_updated';

            }

            // 오류가 있으면 리턴

            if(!$output->toBool()) return $output;



            // $this객체에 add()로 변수를 등록하여 호출하여 XMLRPC로 리턴시 값을 추가함

            $this->add('page',Context::get('page'));

            $this->add('module_srl',$output->get('module_srl'));

            $this->setMessage($msg_code);

        }

    }

?>

 

컨트롤러는 module 모델(Model)과 컨트롤러(Controller)을 확장 또는 상속 받아 내용입력을 준비한다. 이후 인자(argument)들을 URL에서 넘겨 받고 이 값들은 example 모듈의 것들이라고 맴버변수를 추가해 둔다...^^ 모듈의 식별 번호($module_srl)가 있는지 module 모델을 이용해 모듈 정보($module_info)를 조회 해 보고 존재 여부에 따라 새로 입력할 것인지 수정할 것인지를 결정하게 된다. 입력과 수정은 module 컨트롤러에게 부탁한다. 6번-7번 과정이 모두 성공적으로 끝났다고 응답이 오면 언어팩에 등록 되어 있는 성공 메시지를 변수에 같이 담고 만약 오류가 있다면 오류 메시지를 담아 보낼 것이다. 회신을 보낼 때는 $output 변수에 담고, 필요한 값들을 추가로 더해 보낸다.

 

6. 콜백 함수

tpl/js/example_admin.xml

 

/* 모듈 생성 후 */
function completeAdminInsert(ret_obj) {
    var error = ret_obj['error'];
    var message = ret_obj['message'];
    var page = ret_obj['page'];
    var module_srl = ret_obj['module_srl'];
 
    alert(message);
 
    var url = current_url.setQuery('act','dispExampleAdminList').setQuery('module_srl','');
    if(page) url.setQuery('page',page);
    location.href = url;
}

 

폼 필터에서 처리 결과에 대한 콜백함수를 completeAdminInsert로 지정하였다. 지정된 콜백함수는 js/example_admin.xml 파일에서 받아 처리한다. 콜백함수를 받는 JS 파일은 이미 폼 작성 파일에서 최상단에 임포트 해 두었기 때문이다. 회신 받은 내용에서 필요한 값들을 변수로 분리하고 이동할 URL을 설정한 뒤에 실행할 액션과 필요한 정보를 같이 세팅해 보낸다. 컨트롤러에서는 $module_srl의 값을 확인하고 더해 보냈지만, 목록을 보기 위해서는 특별히 $module_srl 이 필요없을 것 같아서 빼고 보냈다...^^ 더하고, 빼고, 세팅하는 것에 대해 확실히 알아두자. 최종적으로 입력/수정 과정이 모두 끝나게 되면 관리자 목록을 위한 dispExampleAdminList 액션이 실행되고 다시 한번 관리자 뷰(View) 처리 과정을 거쳐 목록을 보여주게 된다.

7. 모듈(mid) 수정을 위한 메소드 추가

1) 이미 생성된 모듈(mid)을 수정하려면 관리자 목록에서 우측에 보이는 톱니바퀴 모양의   아이콘을 클릭해야 한다. 이 설정 아이콘은 이전 과정에서 이미 dispExampleAdminInfo 액션을 링크로 설정해 두었다. 즉 아이콘을 클릭하면 act=dispExampleAdminInfo 로 XE코어에 요청하는 것과 같다. 이때 해당 모듈(mid)의 식별 번호($module_srl)도 함께 가지고 간다. 한가지 문제점은 액션의 이름이 아직 명세서에 등록 되어 있지 않다. 따라서 module.xml 파일을 열고 dispExampleAdminInfo를 위한 액션을 dispExampleAdminInsert 액션 아래에 추가하자.

 

<action name="dispExampleAdminInfo" type="view" />

 

 

2) example.admin.view.php 파일에서 [모듈(mid) insert/update 화면 출력] 메소드 아래에 다음과 같은 메소드를 추가하고 업로드 한다. Info 액션이 요청되면 이전에 작성해 두었던 Insert 메소드를 실행하도록 변경하는 것이다. 모듈의 정보가 있다면 새로 추가하는 폼이 아닌, 이미 해당 모듈의 정보가 채워진 폼을 보여줄 것이다. 그리고 xe_modules 테이블에 등록되어 있는 모듈의 정보($module_srl)라면 새로 입력하는 것이 아니라 수정(Update) 할 것이다.

        /**
         * @brief 선택된 모듈의 정보 출력은 곧바로 정보 입력으로 변경한다
         **/
        function dispExampleAdminInfo() {
            $this->dispExampleAdminInsert();
        }

 

8. 결과 확인

새로운 모듈(mid)을 생성하고 수정할 수 있게 된다. 수정이라는 것은 모듈의 고유 식별 번호($module_srl)가 바뀌는 것이 아니다. 모듈의 이름과 브라우저 제목 정도가 수정 되는 것이다. 그러면 삭제는 어떻게 하지...^^

💖 부운영자님 에게 암호화폐로 후원하기 💖

아이콘을 클릭하면 지갑 주소가 자동으로 복사 됩니다

입금주소 rp2diYfVtpbgEMyaoWnuaWgFCAkqCAEg28  

XRP 리플 입금( 기부) 하는법

데스티

네이션 태그

1175658134

각 거래소에서 입금주소 와 데스티네이션 태그를 입력하시면 됩니다.


QR 코드
xrp.png

리플 송금시 주의할 점

  • 송금 후에 잔액이 항상 20XRP를 유지가능하도록 해야한다.
  • 송금요청할 때 트렌젝션 사용시 0.000015XRP가 무조건 지불된다.
  • 리플에서 제공해주는 지갑에 보관단위가 XRP뿐만 아니라 다른코인(예: BTC, LTC 등), USD, KRW 단위로 저장해놓을 수 있다.

만약 히스토리가 궁금할경우 https://xrpcharts.ripple.com/graph/ 에서 리플 지갑 주소를 입력하면 역추적이 가능하다.

리플 주소를 처음 만들경우 주소는 발급되지만 실제 활성화가 되어 있지 않는다. 최소 20XRP을 어디선가 송금 받은 후부터 지갑이 활성화 된다. 일종의 지갑 구입 or 보증금인듯

Who's 부운영자

profile

< 빌립보서 4장 13절>
내가 주 안에서 크게 기뻐함은 너희가 나를 생각하던 것이 이제 다시 싹이 남이니 너희가 또한 이를 위하여 생각은 하였으나 기회가 없었느니라   
내가 궁핍하므로 말하는 것이 아니니라 어떠한 형편에든지 나는 자족하기를 배웠노니    
나는 비천에 처할 줄도 알고 풍부에 처할 줄도 알아 모든 일 곧 배부름과 배고픔과 풍부와 궁핍에도 처할 줄 아는 일체의 비결을 배웠노라
내게 능력 주시는 자 안에서 내가 모든 것을 할 수 있느니라 

회원정보수정하러가기
카카오링크
Attach Images or Files

Drop your files here, or click the button to the left.

Maximum File Size : 0MB (Allowed extentsions : *.*)

0 file(s) attached ( / )

제로XE/라이믹스/그누/워드프레스

회원만 쓰기 가능합니다.

List of Articles
No. Category Subject 페이지 Author Date Views
Notice Tip&Tech xe 동작순서 부운영자 2015.08.24 976
Notice Tip&Tech XE의 애드온 및 모듈의 기능 요약표 부운영자 2015.01.16 1219
Notice Tip&Tech XEReferences 부운영자 2014.11.29 869
Notice Tip&Tech XE 스킨 제작 매뉴얼 v1.1 (Korean, PDF) file 부운영자 2014.11.29 1236
Notice Tip&Tech XE 개발자 매뉴얼 v1.1 (Korean, PDF) file 부운영자 2014.11.29 1732
Notice Tip&Tech xe 레퍼런스 모음 file 부운영자 2014.10.10 2501
화제의 글 Tip&Tech PHP용 로그 라이브러리 공유합니다. 부운영자 2021.03.29 47
화제의 글 Tip&Tech plusad_widget 안되는것 ? 부운영자 2021.02.21 45
화제의 글 Tip&Tech Font Awsome, XEICON 함께 사용하기 부운영자 2020.11.26 135
245 애드온 애드온의 제작 규칙 Creating Rules of Add-on 애드온의 제작 규칙 애드온의 제작 규칙 애드온의 디렉토리 구조 info.xml 제작 애드온이름.addon.php 제작 XE XML Query의 사용 애드온 제작시 주의사항 애드온의 제작 규칙 애드온을 제작하기 위해서는 최소한 아래와 같은 규칙을 지켜야 합니다. 위치 : addons/애드온이름 애드온 제작자 정보, ... 00013 탑돌이 2020.08.14 63
244 애드온 애드온의 기초 이해 The basis of add-on XE 애드온의 기초 이해 SMaker님의 글을 전문인용하여 재구성하였다. - http://xe.xpressengine.net/wiki/18180622 애드온이란? 애드온의 호출 시점 애드온 호출시 전달 변수 애드온(Addon)이란? XpressEngine에서 애드온은 후킹, 즉 정상적인 동작을 가로채는 동작을 합니다. php와 같은 인터프리터 언... 00012 탑돌이 2020.08.14 183
243 애드온 XE 애드온 개발하기 The Story of XE Addons XE코어의 간섭쟁이 애드온 이야기... 애드온의 이해 - SMaker 기초 팝업 윈도우 애드온 만들기 단어 차단(block_word) 애드온 만들기 - sol 14세이상/미만 연령구분 회원가입 애드온 만들기 - SMaker 00011 탑돌이 2020.08.14 45
242 애드온 XE 애드온 XE 애드온 개발하기 애드온의 기초 이해 애드온의 제작 규칙 기초 팝업 윈도우 애드온 만들기 단어 차단 애드온 만들기 연령구분 회원가입 애드온 0001 탑돌이 2020.08.14 38
241 Tip&Tech 3개 서버 로그인 공유 가능한가요? 3개 서버 로그인 공유 가능한가요? 3개 서버 모두 라이믹스로 적용하고 파일서버와 DB 서버 내용이 모두 동일합니다. 그냥 사용자 분산을 위해서 .. 2개 서버는 아이피로... htttp://111.111.111.11 로 접속하고 1개 서버는 도메인 주소를 활용해서 htttP://abcd.com 으로 접속하는데요 이 두개 서버를 메뉴와 사용자에 따라... 탑돌이 2020.08.14 41
240 모듈 보기(View)와 모델 BOOK Module dispBookContentView 보기(View)와 모델(Model) BOOK 모듈(mid)의 목록에서 책의 제목을 클릭하면 도서 정보를 보여주는 프론트 엔드 뷰(View)이다. 목록에서 다 소개하지 못한 정보의 값을 마저 출력해 보여주는 것이 목적이다. 목록에서 제목에는 다음과 같은 링크로 dispBookContentView 액션을 요청한다. {g... 00036 부운영자 2020.08.13 81
239 모듈 목록(List)과 모델 BOOK Module dispBookContentList 목록(List)과 모델(Model) BOOK 모듈의 관리자 화면(back-end)에서 새로운 모듈(mid)을 생성하였다면, &quot;Book 모듈 미리보기&quot;와 같이 메뉴를 만들고 모듈(mid)을 연결하였을 것이다. 사용자는 모듈의 프론트 엔드에서 미리 설정된 기본 인덱스(index) 액션 이름을 모른다. 다만 메뉴에 연결... 00035 부운영자 2020.08.13 143
238 모듈 백엔드 MVC BOOK Module Back-end BOOK 모듈의 백엔드 MVC BOOK 모듈의 백엔드(back-end) 프로그램은 예제(example) 모듈과 같다. 폴더의 이름은 곧 모듈의 이름이기 때문에 example을 book으로 변경한다. 또한 클래스 파일의 이름과 함수들, 포함된 메소드의 이름도 book으로 변경한 것이다. 아래의 BOOK 모듈 MVC 도표는 이전 과정에... file 00034 부운영자 2020.08.13 36
237 모듈 테이블 설치와 언어팩 BOOK Module Table &amp; Language books 테이블 설치와 언어팩 1. DB 테이블의 설치 (Database Table) 모듈의 스키마(schemas) 폴더에 XML 언어 형식으로 만들어진 DB 스키마 파일이 있다면 XE코어는 설치시 사용했던 DB 머릿말을 자동으로 붙여서 XML 파일의 이름과 같은 테이블을 만들어 준다. 예를 들어 books.xml 파일이 있... 00033 부운영자 2020.08.13 210
236 모듈 모듈 설정 파일 BOOK Module Config BOOK 모듈 설정 파일 예제(example) 모듈을 만들어 보고 BOOK 모듈의 작동 방법을 미리 보았다면 다음 과정들이 그렇게 어렵지 않을 것이다. BOOK 모듈은 이전 과정에서 &quot;폼(form)과 DB&quot;의 예제로 사용했던 폼을 모듈로 구현해 보는 예제이다. 게시판(Board) 모듈처럼 여려운 메소드도 없고 그저 단순히 ... 00032 부운영자 2020.08.13 77
235 모듈 웹 관련 도서 Book List : 웹 관련 도서 번호 도서명 저자 출판사 가격 106 dfsdf sss sss 123165 105 ㅁㄴㅇ ㅁㄴㅇ asd 11 104 1243 4325324 ㅈㄷㄱㄴㅇ 123124 103 Test Book Test Auther Test 1000 102 sad asdasd asdasdasd 1 101 히히 헤헤 호호 77 100 45 45 45 45 99 asdf dddd ffff 123545 98 아프니까청춘이다 아프면 환자지 뭔... 00031 부운영자 2020.08.13 28
234 모듈 BOOK 모듈 만들기 BOOK Module BOOK 모듈 만들기 프론트 엔드 뷰(View) 구현을 위한 BOOK 모듈 만들기 예제 모듈의 기본 이해 과정은, 모듈이 폼을 다루는 방법에 대하여 예제 모듈의 백엔드(back-end) 프로그램을 직접 만들어 보면서 모델-뷰-컨트롤러의 동작 방식과 진행 과정을 살펴본 내용이다. 프론트 엔드(front-end) 프로그램은 관리자... 0003 부운영자 2020.08.13 50
233 모듈 액션 권한과 스킨정보 Module Admin Action Grant &amp; SkinInfo 액션 권한과 스킨 정보 액션의 권한 관리와 프로트 엔드 스킨의 정보를 출력하기 위한 과정이다. 액션 권한(permission)은 함수의 실행 권한을 확인하여 관리자가 아닌 경우 요청을 받아들이지 않는 것을 말한다. 따라서 액션 명세서인 module.xml 파일에서 &lt;permissions&gt; 요소에 액션... 00028 부운영자 2020.08.13 53
232 모듈 관리자 모듈 탭메뉴 Module Admin Tab Menu 관리자 모듈 탭메뉴 모듈의 관리자 목록 페이지 헤더에 위치한 가로 탭메뉴의 구현이다. 1. 탭메뉴 header.html 탭메뉴 구성을 위한 header.html 파일을 tpl폴더에 다음과 같이 추가한다. tpl/header.html : 파일 다운로드 / header.html h3 class=&quot;xeAdmin&quot;&gt;&lt;span class=&quot;gray&quot;&gt;{$lang-&gt;example_mana... 00027 부운영자 2020.08.13 109
231 모듈 삭제 컨트롤러(Controller) Module Admin Controller for Delete 모듈 삭제와 컨트롤러(Controller) 모듈(mid)의 삭제는 모듈의 고유 식별 번호($module_srl)을 확인하고 module 테이블에서 해당 식별 번호를 삭제하는 것으로 끝난다. 여기에서는 프론트 엔드의 내용, 즉 삭제하려고 하는 모듈(mid)이 만들어 놓은 내용물에 대해서는 확인하지 않는다. ... 00027 부운영자 2020.08.13 49
» 모듈 입력 컨트롤러(Controller) Module Admin Controller for Insert/Update 모듈 입력/수정과 컨트롤러(Controller) 예제로 만들고 있는 example 모듈에서 새로운 모듈(mid)을 추가하고 수정할 수 있는 액션과 그에 따른 진행 과정을 그린 설계도이다. 모듈(module)을 추가 한다는 것은 example 모듈과 같이 기능적인 모듈을 추가한다는 것이 아니라, 앞으... 00026 부운영자 2020.08.13 44
229 모듈 모듈 확장과 모델(Model) 모듈 확장과 모델(Model) 관리자를 위한 백 엔드 뷰(View)가 실행되면 관리자-인덱스로 설정했던 dispExampleAdminList 액션이 작동하고 그 진행과정을 설명한 그림이다. 또한 앞으로 만들게 될 관리자 목록 보기를 위한 설계도이다. 이 과정에서는 어드민 모델(example.admin.model.php)을 이용할 계획이다. 실제로 게시판(... 00025 부운영자 2020.08.13 26
228 모듈 프론트엔드와 백엔드 뷰(View) Front and back ends 프론트 엔드(front-end)와 백 엔드(back-end)는, 사용자가 접근하는 영역을 말하는데 이때 사용자는 사람이 아닌 프로그램이 될 수도 있다. 예를 들어 컴퓨터 OS의 그래픽 파일 관리자는 컴퓨터의 파일 시스템에 대한 프론트 엔드이고 사용자와 직접 상호작용을 할 수 있다. 백 엔드 응용프로그램은 보... 00024 부운영자 2020.08.13 316
227 모듈 MVC 구조의 이해 Model-View-Controller XE Core는 모델-뷰-컨트롤러(Model-View-Controller) 개발 패턴에 기반한다. 이것을 줄여서 MVC 구조라고 말한다. 소프트웨어 공학에서 프로그램의 설계는 건축(architecture)과 같다. 시스템의 운영 구조를 목적과 명세에 따라 유기적 관계로 설계하고 업그레이드를 통제하는 지침과 원칙, 이것을 아... 00023 부운영자 2020.08.13 55
226 모듈 폼(form)과 DB Form &amp; DB XE 모듈을 이해하기 위한 기초 과정으로 폼(form)의 동작 방식을 살펴보자. 모듈은 결론적으로 폼과 DB의 관계이다. 모듈은 자신이 관리하는 테이블을 한두개 이상 가지고 있고 이것을 다루기 위해 폼을 사용한다. 이때 모듈에서의 폼의 처리 과정은 모델 뷰 컨트롤러 (Model-View-Controller) 개발 패턴에 기반한... 00022 부운영자 2020.08.13 60
List
Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 ... 14 Next
/ 14