홈페이지를 만드는 사람들을 위한 안내서
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개발자 메뉴얼에 참고하셔서 필요한 속성을 적으시면 될 것 같습니다.
우선은 여기까지 하고 마무리 하도록하겠습니다.
아직 필터부분과 컨트롤러 부분을 다루지 않았는데 추후에 또 시간이 되면 정리하도록 하겠습니다 :)