|
|
복원
<p>XE의 실행 순서부터 간단히 설명하자면 맨처음 루트 디렉토리에 있는 index.php를 실행 시키면 config폴더와 class( 라이브러리 )등을 포함 시킨 후 모듈 제작으로 이어집니다.</p><p>index.php 파일 설명 참조 <a class="tx-link" href="http://www.xeschool.com/xe/xenote_indexphp" target="_blank">http://www.xeschool.com/xe/xenote_indexphp</a></p><p>실행 순서 참조 <a class="tx-link" href="http://www.xeschool.com/xe/xenote_operation_sequence" target="_blank">http://www.xeschool.com/xe/xenote_operation_sequence</a></p><p><br></p><p>그럼 모듈을 만드는 방법을 알아보겠습니다 😏</p><p>세부적인 코드보다는 흐름 위주로 어떠한 파일들이 필요한지 설명을 하도록 하겠습니다.</p><p>(폴더를 만드는 순서는 개인적인 기준입니다 :) )</p><p>/moduels 폴더에 가면 xe에서 만든 기본 모듈들이 많이 존재합니다. 제가 많이 썼었던 board 모듈도 있구요 :) 모듈들의 폴더 구조를 보면 동일하게 구성되어 있다는 것을 아실 것입니다.</p><p><br></p><p>1.우선 모듈 폴더를 만든 뒤 모듈 정보를 가지고 있는 <strong>conf폴더</strong>를 만들어 줄 것입니다.</p><p>conf폴더 안에는 이 모듈의 정의를 하는 info.xml파일과 모듈에 어떠한 액션이 있는지 선언을 해주는 module.xml파일이 존재합니다. 안드로이드에서 매니페스트파일이라고 보시면 됩니다.</p><div class="colorscripter-code"><table cellpadding="0" cellspacing="0" class="colorscripter-code-table"><tbody><tr><td><p>1</p><p>2</p><p>3</p><p>4</p><p>5</p><p>6</p><p>7</p><p>8</p><p>9</p><p>10</p><p>11</p><p>12</p><p>13</p><p>14</p><p>15</p><p>16</p><p>17</p><p>18</p></td><td><p><?xml version="1.0" encoding="utf-8"?></p><p><module></p><p> <grants/></p><p> </p><p> <permissions></p><p> <!--admin--></p><p> <permission action="" target="" /></p><p> </permissions></p><p> </p><p> <actions></p><p> <!--admin--></p><p> <action name="" type="view" admin_index="true" menu_index="true" menu_name="" meta-noindex="true" /></p><p> </actions></p><p> </p><p> <menus></p><p> </p><p> </menus></p><p></module></p><p><a href="http://colorscripter.com/info#e" target="_blank">Colored by Color Scripter</a></p></td><td><a href="http://colorscripter.com/info#e" target="_blank">cs</a></td></tr></tbody></table></div><p><br></p><p>module.xml은 위와 같은 구조로 되어 있습니다. permissions 말그대로 권한을 부여 하는 것입니다.</p><p>관리자에게만 권한을 주고 싶다면 target="manager"이라고 사용해 주는 것이죠.</p><p>그다음 액션을 선언합니다. name에는 함수명이 들어갈 것이구요. 후에 설명을 하겠지만 xe모듈은 MVC패턴을 따르고 있습니다. 이의 타입이 view냐 controller냐에 따라 type에 들어갈 것입니다.</p><p>admin_index는 해당 모듈에 들어갔을 시 가장 먼저 뜨는 뷰를 설정해준 것입니다.</p><p>그리고 menu_name으로 메뉴 그룹을 만들 수 가 있는데 이는 필수사항은 아니고 관리자 설정에서 관리자 메뉴에 추가할때의 명칭을 지정해주는 것입니다.</p><p>이제 모듈의 설명에 대해 정의를 했으니 모듈을 실행 할 수 있도록 클래스 파일을 만들어 주려고합니다.</p><p><br></p><p>2.반드시 만들어준 폴더명.class.php로 모듈폴더 아래 만들어 주시기 바랍니다.</p><p>모듈을 만들때 가장 중요한 것이 네이밍 입니다! 규칙을 지켜주지 않으면 xe에서 인식하지 못합니다.</p><p>클래스에서는 모듈의 설치 및 업데이트 기능을 담당하고 있습니다.</p><p>다른 모듈의 클래스를 보면 함수명들이 나와 있으니 확인 후 사용하시면 됩니다 :)</p><p><br></p><p>3.그다음 저는 schemas폴더를 만든 후 그 안에 테이블을 만들어주려고합니다.</p><p>xe에서는 쿼리를 모두 xml로 관리하고 있습니다. 쿼리를 xml로 정의를 해주게 되면 어떤 데이터베이스를 사용해도 호환성있게 바꿔주는 장점이 있습니다. ( 아래 예제 )</p><div class="colorscripter-code"><table cellpadding="0" cellspacing="0" class="colorscripter-code-table"><tbody><tr><td><p>1</p><p>2</p><p>3</p></td><td><p><table name="table_name"></p><p> <column name="srl" type="number" notnull="notnull" primary_key="primary_key" /></p><p></table></p><p><a href="http://colorscripter.com/info#e" target="_blank">Colored by Color Scripter</a></p></td><td><a href="http://colorscripter.com/info#e" target="_blank">cs</a></td></tr></tbody></table></div><p>모듈이 정상적으로 연결 되었고 테이블 생성 xml이 있다면 관리자 페이지에 갔을때 테이블을 생성할지 여부를 묻습니다. 이때 만들기를 눌러 테이블을 생성할 수 있습니다.</p><p><br></p><p>4.이제부터 본격적으로 기능을 만들어 보려고 합니다.</p><p>앞에서 잠깐 말했다 시피 xe의 모듈은 <strong>model, view, controller</strong>로 이루어 져 있습니다.</p><p>Model : 백그라운드에서 동작하는 로직을 처리</p><p>View : 사용자가 보게 될 결과 화면을 출력</p><p>Controller : 사용자의 입력처리와 흐름 제어</p><p>또한 사용자 model, view, controller와 관리자 model, view, controller로 나뉘는데 디폴트 폴더로 사용 되는 것은 사용자 mvc입니다. ( 관리자것이 없다면 사용자 mvc를 사용, 관리자는 사용자 파일들을 확장해서 사용할 수있다는 느낌! )</p><p>MVC를 만들 때 또 다시 중요한 것은 네이밍입니다.</p><p><strong>모듈 파일명.model.php</strong> 해당 네이밍 규칙을 따라 파일을 만드셔야합니다. </p><p>( 관리자일 경우 모듈파일명.admin.model.php )</p><p><br></p><p>3개의 파일을 만드셨다면 저는 뷰에 먼져 함수를 만들어 화면에 뜨는지 테스트하는 편입니다.</p><div class="colorscripter-code"><table cellpadding="0" cellspacing="0" class="colorscripter-code-table"><tbody><tr><td><p>1</p><p>2</p><p>3</p><p>4</p><p>5</p><p>6</p><p>7</p><p>8</p><p>9</p><p>10</p><p>11</p><p>12</p><p>13</p><p>14</p><p>15</p><p>16</p><p>17</p></td><td><p><?php</p><p> </p><p>Class 모듈폴더명(Admin)View extends 클래스명</p><p>{</p><p> //초기화</p><p> function init(){</p><p><br></p><p> }</p><p> </p><p> function disp모듈폴더명(Admin)(){ </p><p><br></p><p> //템플릿 설정</p><p> $this->setTemplateFile('템플릿명'); </p><p> }</p><p>}</p><p>?></p><p><a href="http://colorscripter.com/info#e" target="_blank">Colored by Color Scripter</a></p></td><td><a href="http://colorscripter.com/info#e" target="_blank">cs</a></td></tr></tbody></table></div><p>계속해서 네이밍에 신경써주시기 바랍니다. </p><p>이때 함수에서는 <strong>모듈폴더명의 첫번째 알파벳이 대문자</strong>여야 합니다.</p><p>4-1.뷰에 함수를 만들어 주었다면 위의 <strong>conf/module.xml</strong>에 해당 함수가 있다는 것을 선언 해 주셔야 합니다. </p><p><br></p><p>5.여기서 또 필요한 것이 템플릿입니다. ( html ) 템플릿은 tpl폴더를 만드신 후 html파일을 만들어 주시면됩니다. 그리고 뷰에서 setTemplateFile('템플릿명');으로 넘어가주시면 되는데 </p><p><strong>확장자 명을 제외한 파일명</strong>만 써주시면 됩니다.</p><p>템플릿이 정상적으로 나왔으면 성공!</p><p><br></p><p>6.우리는 저렇게 화면만 나오게 하는게 아니겠죠?</p><p>데이터 베이스에서 값을 꺼내오거나 update하거나 insert하는 작업이 필요하실 겁니다.</p><div class="colorscripter-code"><table cellpadding="0" cellspacing="0" class="colorscripter-code-table"><tbody><tr><td><p>1</p><p>2</p><p>3</p><p>4</p><p>5</p><p>6</p><p>7</p><p>8</p><p>9</p><p>10</p><p>11</p><p>12</p><p>13</p><p>14</p><p>15</p><p>16</p><p>17</p><p>18</p><p>19</p><p>20</p><p>21</p></td><td><p> </p><p> function dispTest_modelAdmin(){ </p><p> </p><p> //받은 변수</p><p> $args=new stdClass();</p><p> $args->moudle=Context::get('moudle');</p><p> $args->page=Context::get('page');</p><p> </p><p> </p><p> //리스트</p><p> $oModuleModel=getModel($this->module);</p><p> $product_list=$oModuleModel->함수명($args);</p><p> </p><p> </p><p> //출력 변수 설정</p><p> Context::set("filter_search_target",$filter_search_target);</p><p> </p><p> //템플릿 설정</p><p> $this->setTemplateFile('템플릿명');</p><p> </p><p> }</p><p><a href="http://colorscripter.com/info#e" target="_blank">Colored by Color Scripter</a></p></td><td><a href="http://colorscripter.com/info#e" target="_blank">cs</a></td></tr></tbody></table></div><p>위의 함수에 여러 코드가 추가 되었네요.</p><p>Context::get으로 get방식으로 받은 필요한 데이터를 배열로 만들어준뒤 모델을 가져와 함수를 실행 해 줄 것입니다. model에서는 데이터베이스에 접속하는 작업이 이루어질 것이구요. </p><p>그리고 model의 함수 결과 값을 Context::set으로 html에 출력해 줄 것입니다.</p><p><br></p><p>7.이제 model에 함수를 만들어 보도록 하겠습니다!</p><div class="colorscripter-code"><table cellpadding="0" cellspacing="0" class="colorscripter-code-table"><tbody><tr><td><p>1</p><p>2</p><p>3</p><p>4</p><p>5</p><p>6</p><p>7</p><p>8</p><p>9</p><p>10</p><p>11</p><p>12</p><p>13</p><p>14</p><p>15</p><p>16</p><p>17</p><p>18</p><p>19</p></td><td><p>Class 모듈폴더명Model extends 클래스명</p><p>{</p><p> //초기화</p><p> function init(){</p><p> }</p><p> </p><p> </p><p> Public function getTestList($args=null){</p><p> </p><p> //쿼리 아이디</p><p> $query_id="모듈폴더명.쿼리파일명";</p><p> </p><p> //쿼리 실행</p><p> $output=executeQueryArray($query_id, $args);</p><p> </p><p> //출력 변수</p><p> return $output;</p><p> }</p><p>}</p><p><a href="http://colorscripter.com/info#e" target="_blank">Colored by Color Scripter</a></p></td><td><a href="http://colorscripter.com/info#e" target="_blank">cs</a></td></tr></tbody></table></div><p>사실 설명을 하지 않아도 직관적으로 보이실 것 같습니다.</p><p>한가지 설명할 것이 있다면 쿼리 실행문에는 두가지가 있습니다. executeQuery와 executeQueryArray인데 단순히 배열로 받을 것이냐 아니냐의 차이입니다. 직접 실행 후 결과값을 print_r해보시면 가장 이해가 빠를것같습니다 :)</p><p><br></p><p>8.그럼 쿼리 파일은 어디에다가 만드나?</p><p>쿼리는 queries폴더 안에 xml파일로 저장되어 있습니다.</p><div class="colorscripter-code"><table cellpadding="0" cellspacing="0" class="colorscripter-code-table"><tbody><tr><td><p>1</p><p>2</p><p>3</p><p>4</p><p>5</p><p>6</p><p>7</p><p>8</p><p>9</p><p>10</p><p>11</p></td><td><p><query id="파일명" action="select"></p><p> <tables></p><p> <table name="테이블명" /></p><p> </tables></p><p> <columns></p><p> <column name="*" /></p><p> </columns></p><p> <conditions></p><p> <condition operation="equal" column="컬럼명" var="변수명" filter="number" notnull="notnull" /></p><p> </conditions></p><p></query></p><p><a href="http://colorscripter.com/info#e" target="_blank">Colored by Color Scripter</a></p></td><td><a href="http://colorscripter.com/info#e" target="_blank">cs</a></td></tr></tbody></table></div><p><br></p><p>xml 데이터베이스에 대한 정보는 xe개발자 메뉴얼에 참고하셔서 필요한 속성을 적으시면 될 것 같습니다.</p><p><br></p><p>우선은 여기까지 하고 마무리 하도록하겠습니다.</p><p>아직 필터부분과 컨트롤러 부분을 다루지 않았는데 추후에 또 시간이 되면 정리하도록 하겠습니다 :)</p>
|
이온디 |
2022.10.06 14:40:33 |