홈페이지를 만드는 사람들을 위한 안내서

사용자 모듈 만드는 방법(1) (도담도담)

조회 수 23 추천 수 0 2022.10.06 14:55:34
이온디 *.186.100.73
제목 작성자 날짜
사용자 모듈 만드는 방법(1) (도담도담) (current) 이온디 2022.10.06 14:55:34
복원
<p>XE의 실행 순서부터 간단히 설명하자면 맨처음 루트 디렉토리에 있는 index.php를 실행 시키면 config폴더와 class( 라이브러리 )등을 포함 시킨 후 모듈 제작으로 이어집니다.</p><p>index.php 파일 설명 참조&nbsp;<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>그럼 모듈을 만드는 방법을 알아보겠습니다&nbsp;&#x1f60f;</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>&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;</p><p>&lt;module&gt;</p><p>&nbsp; &nbsp; &lt;grants/&gt;</p><p>&nbsp; &nbsp;&nbsp;</p><p>&nbsp; &nbsp; &lt;permissions&gt;</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &lt;!--admin--&gt;</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &lt;permission action=&quot;&quot; target=&quot;&quot; /&gt;</p><p>&nbsp; &nbsp; &lt;/permissions&gt;</p><p>&nbsp; &nbsp;&nbsp;</p><p>&nbsp; &nbsp; &lt;actions&gt;</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &lt;!--admin--&gt;</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &lt;action name=&quot;&quot; type=&quot;view&quot; admin_index=&quot;true&quot; menu_index=&quot;true&quot; menu_name=&quot;&quot; meta-noindex=&quot;true&quot; /&gt;</p><p>&nbsp; &nbsp; &lt;/actions&gt;</p><p>&nbsp; &nbsp;&nbsp;</p><p>&nbsp; &nbsp; &lt;menus&gt;</p><p>&nbsp;</p><p>&nbsp; &nbsp; &lt;/menus&gt;</p><p>&lt;/module&gt;</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=&quot;manager&quot;이라고 사용해 주는 것이죠.</p><p>그다음 액션을 선언합니다. name에는 함수명이 들어갈 것이구요. 후에 설명을 하겠지만 xe모듈은 MVC패턴을 따르고 있습니다. 이의 타입이 view냐 controller냐에 따라&nbsp;type에 들어갈 것입니다.</p><p>admin_index는 해당 모듈에 들어갔을 시 가장 먼저 뜨는 뷰를 설정해준 것입니다.</p><p>그리고 menu_name으로 메뉴 그룹을 만들 수 가 있는데 이는 필수사항은 아니고 관리자 설정에서 관리자 메뉴에 추가할때의 명칭을 지정해주는 것입니다.</p><p>이제 모듈의 설명에 대해 정의를 했으니 모듈을 실행 할 수 있도록 클래스 파일을 만들어 주려고합니다.</p><p><br></p><p>2.반드시 만들어준 폴더명.class.php로 모듈폴더 아래 만들어 주시기 바랍니다.</p><p>모듈을 만들때 가장 중요한 것이 네이밍 입니다! 규칙을 지켜주지 않으면&nbsp;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>&lt;table name=&quot;table_name&quot;&gt;</p><p>&nbsp; &nbsp; &lt;column name=&quot;srl&quot; type=&quot;number&quot; notnull=&quot;notnull&quot; primary_key=&quot;primary_key&quot; /&gt;</p><p>&lt;/table&gt;</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> 해당 네이밍 규칙을 따라 파일을 만드셔야합니다.&nbsp;</p><p>( 관리자일 경우 모듈파일명.admin.model.php )</p><p><br></p><p>3개의 파일을 만드셨다면 저는 뷰에 먼져 함수를 만들어 화면에 뜨는지 테스트하는&nbsp;편입니다.</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>&lt;?php</p><p>&nbsp; &nbsp;</p><p>Class 모듈폴더명(Admin)View extends 클래스명</p><p>{</p><p>&nbsp; &nbsp; //초기화</p><p>&nbsp; &nbsp; function init(){</p><p><br></p><p>&nbsp; &nbsp; }</p><p>&nbsp; &nbsp;&nbsp;</p><p>&nbsp; &nbsp; function disp모듈폴더명(Admin)(){&nbsp; &nbsp; &nbsp; &nbsp;</p><p><br></p><p>&nbsp; &nbsp; &nbsp; &nbsp; //템플릿 설정</p><p>&nbsp; &nbsp; &nbsp; &nbsp; $this-&gt;setTemplateFile(&#39;템플릿명&#39;); &nbsp; &nbsp;</p><p>&nbsp; &nbsp; }</p><p>}</p><p>?&gt;</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>계속해서 네이밍에 신경써주시기 바랍니다.&nbsp;</p><p>이때 함수에서는 <strong>모듈폴더명의 첫번째 알파벳이 대문자</strong>여야 합니다.</p><p>4-1.뷰에 함수를 만들어 주었다면 위의 <strong>conf/module.xml</strong>에 해당 함수가 있다는 것을 선언 해 주셔야 합니다.&nbsp;</p><p><br></p><p>5.여기서 또 필요한 것이 템플릿입니다. ( html ) 템플릿은 tpl폴더를 만드신 후 html파일을 만들어 주시면됩니다. 그리고 뷰에서 setTemplateFile(&#39;템플릿명&#39;);으로 넘어가주시면 되는데&nbsp;</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>&nbsp;</p><p>&nbsp; &nbsp; function dispTest_modelAdmin(){&nbsp;</p><p>&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</p><p>&nbsp; &nbsp; &nbsp; &nbsp; //받은&nbsp;변수</p><p>&nbsp; &nbsp; &nbsp; &nbsp; $args=new stdClass();</p><p>&nbsp; &nbsp; &nbsp; &nbsp; $args-&gt;moudle=Context::get(&#39;moudle&#39;);</p><p>&nbsp; &nbsp; &nbsp; &nbsp; $args-&gt;page=Context::get(&#39;page&#39;);</p><p>&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</p><p>&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</p><p>&nbsp; &nbsp; &nbsp; &nbsp; //리스트</p><p>&nbsp; &nbsp; &nbsp; &nbsp; $oModuleModel=getModel($this-&gt;module);</p><p>&nbsp; &nbsp; &nbsp; &nbsp; $product_list=$oModuleModel-&gt;함수명($args);</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</p><p>&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</p><p>&nbsp; &nbsp; &nbsp; &nbsp; //출력&nbsp;변수&nbsp;설정</p><p>&nbsp; &nbsp; &nbsp; &nbsp; Context::set(&quot;filter_search_target&quot;,$filter_search_target);</p><p>&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</p><p>&nbsp; &nbsp; &nbsp; &nbsp; //템플릿&nbsp;설정</p><p>&nbsp; &nbsp; &nbsp; &nbsp; $this-&gt;setTemplateFile(&#39;템플릿명&#39;);</p><p>&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</p><p>&nbsp; &nbsp; }</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에서는 데이터베이스에 접속하는 작업이 이루어질 것이구요.&nbsp;</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>&nbsp; &nbsp; //초기화</p><p>&nbsp; &nbsp; function init(){</p><p>&nbsp; &nbsp; }</p><p>&nbsp; &nbsp;&nbsp;</p><p>&nbsp;</p><p>&nbsp; &nbsp; Public function getTestList($args=null){</p><p>&nbsp;</p><p>&nbsp; &nbsp; &nbsp; &nbsp; //쿼리&nbsp;아이디</p><p>&nbsp; &nbsp; &nbsp; &nbsp; $query_id=&quot;모듈폴더명.쿼리파일명&quot;;</p><p>&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</p><p>&nbsp; &nbsp; &nbsp; &nbsp; //쿼리&nbsp;실행</p><p>&nbsp; &nbsp; &nbsp; &nbsp; $output=executeQueryArray($query_id,&nbsp;$args);</p><p>&nbsp;</p><p>&nbsp; &nbsp; &nbsp; &nbsp; //출력&nbsp;변수</p><p>&nbsp; &nbsp; &nbsp; &nbsp; return&nbsp;$output;</p><p>&nbsp; &nbsp; }</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>한가지&nbsp;설명할 것이 있다면 쿼리 실행문에는 두가지가 있습니다. 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>&lt;query id=&quot;파일명&quot; action=&quot;select&quot;&gt;</p><p>&nbsp; &nbsp; &lt;tables&gt;</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &lt;table name=&quot;테이블명&quot; /&gt;</p><p>&nbsp; &nbsp; &lt;/tables&gt;</p><p>&nbsp; &nbsp; &lt;columns&gt;</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &lt;column name=&quot;*&quot; /&gt;</p><p>&nbsp; &nbsp; &lt;/columns&gt;</p><p>&nbsp; &nbsp; &lt;conditions&gt;</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &lt;condition operation=&quot;equal&quot; column=&quot;컬럼명&quot; var=&quot;변수명&quot; filter=&quot;number&quot; notnull=&quot;notnull&quot; /&gt;</p><p>&nbsp; &nbsp; &lt;/conditions&gt;</p><p>&lt;/query&gt;</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
도구모음