Hello,

kok nae-ga ha-myun an-dweneun MAGIC...🧚

웹 프로그래밍/PHP

[ XE ] 사용자 모듈 만드는 방법

✿도담도담 2018. 12. 8. 11:04

XE의 실행 순서부터 간단히 설명하자면 맨처음 루트 디렉토리에 있는 index.php를 실행 시키면 config폴더와 class( 라이브러리 )등을 포함 시킨 후 모듈 제작으로 이어집니다.

index.php 파일 설명 참조 http://www.xeschool.com/xe/xenote_indexphp

실행 순서 참조 http://www.xeschool.com/xe/xenote_operation_sequence


그럼 모듈을 만드는 방법을 알아보겠습니다 😏

세부적인 코드보다는 흐름 위주로 어떠한 파일들이 필요한지 설명을 하도록 하겠습니다.

(폴더를 만드는 순서는 개인적인 기준입니다 :) )

/moduels 폴더에 가면 xe에서 만든 기본 모듈들이 많이 존재합니다. 제가 많이 썼었던 board 모듈도 있구요 :) 모듈들의 폴더 구조를 보면 동일하게 구성되어 있다는 것을 아실 것입니다.


1.우선 모듈 폴더를 만든 뒤 모듈 정보를 가지고 있는 conf폴더를 만들어 줄 것입니다.

conf폴더 안에는 이 모듈의 정의를 하는 info.xml파일과 모듈에 어떠한 액션이 있는지 선언을 해주는 module.xml파일이 존재합니다. 안드로이드에서 매니페스트파일이라고 보시면 됩니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?xml version="1.0" encoding="utf-8"?>
<module>
    <grants/>
    
    <permissions>
        <!--admin-->
        <permission action="" target="" />
    </permissions>
    
    <actions>
        <!--admin-->
        <action name="" type="view" admin_index="true" menu_index="true" menu_name="" meta-noindex="true" />
    </actions>
    
    <menus>
 
    </menus>
</module>
cs


module.xml은 위와 같은 구조로 되어 있습니다. permissions 말그대로 권한을 부여 하는 것입니다.

관리자에게만 권한을 주고 싶다면 target="manager"이라고 사용해 주는 것이죠.

그다음 액션을 선언합니다. name에는 함수명이 들어갈 것이구요. 후에 설명을 하겠지만 xe모듈은 MVC패턴을 따르고 있습니다. 이의 타입이 view냐 controller냐에 따라 type에 들어갈 것입니다.

admin_index는 해당 모듈에 들어갔을 시 가장 먼저 뜨는 뷰를 설정해준 것입니다.

그리고 menu_name으로 메뉴 그룹을 만들 수 가 있는데 이는 필수사항은 아니고 관리자 설정에서 관리자 메뉴에 추가할때의 명칭을 지정해주는 것입니다.

이제 모듈의 설명에 대해 정의를 했으니 모듈을 실행 할 수 있도록 클래스 파일을 만들어 주려고합니다.


2.반드시 만들어준 폴더명.class.php로 모듈폴더 아래 만들어 주시기 바랍니다.

모듈을 만들때 가장 중요한 것이 네이밍 입니다! 규칙을 지켜주지 않으면 xe에서 인식하지 못합니다.

클래스에서는 모듈의 설치 및 업데이트 기능을 담당하고 있습니다.

다른 모듈의 클래스를 보면 함수명들이 나와 있으니 확인 후 사용하시면 됩니다 :)


3.그다음 저는 schemas폴더를 만든 후 그 안에 테이블을 만들어주려고합니다.

xe에서는 쿼리를 모두 xml로 관리하고 있습니다. 쿼리를 xml로 정의를 해주게 되면 어떤 데이터베이스를 사용해도 호환성있게 바꿔주는 장점이 있습니다. ( 아래 예제 )

1
2
3
<table name="table_name">
    <column name="srl" type="number" notnull="notnull" primary_key="primary_key" />
</table>
cs

모듈이 정상적으로 연결 되었고 테이블 생성 xml이 있다면 관리자 페이지에 갔을때 테이블을 생성할지 여부를 묻습니다. 이때 만들기를 눌러 테이블을 생성할 수 있습니다.


4.이제부터 본격적으로 기능을 만들어 보려고 합니다.

앞에서 잠깐 말했다 시피 xe의 모듈은 model, view, controller로 이루어 져 있습니다.

Model : 백그라운드에서 동작하는 로직을 처리

View : 사용자가 보게 될 결과 화면을 출력

Controller : 사용자의 입력처리와 흐름 제어

또한 사용자 model, view, controller와 관리자 model, view, controller로 나뉘는데 디폴트 폴더로 사용 되는 것은 사용자 mvc입니다. ( 관리자것이 없다면 사용자 mvc를 사용, 관리자는 사용자 파일들을 확장해서 사용할 수있다는 느낌! )

MVC를 만들 때 또 다시 중요한 것은 네이밍입니다.

모듈 파일명.model.php 해당 네이밍 규칙을 따라 파일을 만드셔야합니다. 

( 관리자일 경우 모듈파일명.admin.model.php )


3개의 파일을 만드셨다면 저는 뷰에 먼져 함수를 만들어 화면에 뜨는지 테스트하는 편입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
    
Class 모듈폴더명(Admin)View extends 클래스명
{
    //초기화
    function init(){
    }
    
    function disp모듈폴더명(Admin)(){        
        //템플릿 설정
        $this->setTemplateFile('템플릿명');    
    }
}
?>
cs

계속해서 네이밍에 신경써주시기 바랍니다. 

이때 함수에서는 모듈폴더명의 첫번째 알파벳이 대문자여야 합니다.

4-1.뷰에 함수를 만들어 주었다면 위의 conf/module.xml에 해당 함수가 있다는 것을 선언 해 주셔야 합니다. 


5.여기서 또 필요한 것이 템플릿입니다. ( html ) 템플릿은 tpl폴더를 만드신 후 html파일을 만들어 주시면됩니다. 그리고 뷰에서 setTemplateFile('템플릿명');으로 넘어가주시면 되는데

확장자 명을 제외한 파일명만 써주시면 됩니다.

템플릿이 정상적으로 나왔으면 성공!


6.우리는 저렇게 화면만 나오게 하는게 아니겠죠?

데이터 베이스에서 값을 꺼내오거나 update하거나 insert하는 작업이 필요하실 겁니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
    function dispTest_modelAdmin(){ 
        
        //받은 변수
        $args=new stdClass();
        $args->moudle=Context::get('moudle');
        $args->page=Context::get('page');
        
        
        //리스트
        $oModuleModel=getModel($this->module);
        $product_list=$oModuleModel->함수명($args);
                            
        
        //출력 변수 설정
        Context::set("filter_search_target",$filter_search_target);
        
        //템플릿 설정
        $this->setTemplateFile('템플릿명');
        
    }
cs

위의 함수에 여러 코드가 추가 되었네요.

Context::get으로 get방식으로 받은 필요한 데이터를 배열로 만들어준뒤 모델을 가져와 함수를 실행 해 줄 것입니다. model에서는 데이터베이스에 접속하는 작업이 이루어질 것이구요. 

그리고 model의 함수 결과 값을 Context::set으로 html에 출력해 줄 것입니다.


7.이제 model에 함수를 만들어 보도록 하겠습니다!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Class 모듈폴더명Model extends 클래스명
{
    //초기화
    function init(){
    }
    
 
    Public function getTestList($args=null){
 
        //쿼리 아이디
        $query_id="모듈폴더명.쿼리파일명";
        
        //쿼리 실행
        $output=executeQueryArray($query_id, $args);
 
        //출력 변수
        return $output;
    }
}
cs

사실 설명을 하지 않아도 직관적으로 보이실 것 같습니다.

한가지 설명할 것이 있다면 쿼리 실행문에는 두가지가 있습니다. executeQuery와 executeQueryArray인데 단순히 배열로 받을 것이냐 아니냐의 차이입니다. 직접 실행 후 결과값을 print_r해보시면 가장 이해가 빠를것같습니다 :)


8.그럼 쿼리 파일은 어디에다가 만드나?

쿼리는 queries폴더 안에 xml파일로 저장되어 있습니다.

1
2
3
4
5
6
7
8
9
10
11
<query id="파일명" action="select">
    <tables>
        <table name="테이블명" />
    </tables>
    <columns>
        <column name="*" />
    </columns>
    <conditions>
        <condition operation="equal" column="컬럼명" var="변수명" filter="number" notnull="notnull" />
    </conditions>
</query>
cs


xml 데이터베이스에 대한 정보는 xe개발자 메뉴얼에 참고하셔서 필요한 속성을 적으시면 될 것 같습니다.


우선은 여기까지 하고 마무리 하도록하겠습니다.

아직 필터부분과 컨트롤러 부분을 다루지 않았는데 추후에 또 시간이 되면 정리하도록 하겠습니다 :)