BOOK Module Table & Language
books 테이블 설치와 언어팩
1. DB 테이블의 설치 (Database Table)
모듈의 스키마(schemas) 폴더에 XML 언어 형식으로 만들어진 DB 스키마 파일이 있다면 XE코어는 설치시 사용했던 DB 머릿말을 자동으로 붙여서 XML 파일의 이름과 같은 테이블을 만들어 준다. 예를 들어 books.xml 파일이 있다면 xe_books 라는 테이블을 만들어 준다. xe_ 라는 DB 머릿말은 XE코어가 알아서 처리해 주기 때문에 신경쓸 필요는 없다. 처음 설치시 bbs를 머릿말로 사용했다면 bbs_books 라는 테이블이 생성될 것이다. XE코어는 스키마 파일을 보게 되면 관리자>모듈>모듈 목록 화면에서 모듈 설치 버튼을 보여준다. 그리고 스키마 파일의 갯수와 미설치된 테이블의 갯수를 빨간색 텍스트로 알려준다. 만약 모듈이 기존에 사용하는 테이블에서 추가할 컬럼(column)이 있다거나 변경된 내용이 있다면 업데이트하라고 출력할 것이다.(물론 업데이트 메소드는 기본 클래스에서 정의해 두어야 한다.)
즉, 스키마(schemas) 폴더 안에 들어 있는 스키마 파일의 갯수만큼 만들어 준다. 생성될 테이블의 이름은 파일의 이름과 같다.
|
|
좌측 테이블은 BOOK 모듈이 책의 정보 값을 저장하고 조회할 테이블과 컬럼의 이름이고 계획표이다. 예제를 위해 최소한으로 계획하였다. 여기에 BOOK 모듈이 목적한 기능으로 동작하기 위해서는 책의 고유한 원자값도 필요하고 모듈 관리자에서 생성할 모듈($mid)의 자손임을 알 수 있도록 모듈 식별 번호($module_srl)도 함께 저장해야 한다. 따라서 오른쪽과 같이 책의 고유 식별 번호로 사용할 $book_srl 컬럼과 BOOK 모듈(mid)의 식별 번호를 저장할 $module_srl 컬럼을 추가한다. $book_srl은 자동증가(auto_increment)로 설정해 두면 DB row가 증가할 때마다 값이 1씩 증가할 것이다.
생성된 BOOK 모듈(mid)이 자신의 책만 모두 가져와 목록으로 출력하고 싶다면 $module_srl 컬럼을 조건(WHERE)으로 확인하면 된다. 책의 정보를 수정하거나 삭제하기를 원한다면 책의 고유 식별 번호 $book_srl 컬럼을 조건으로 확인하면 된다.
다음과 같이 테이블 생성을 위한 XML 스키마 파일을 작성하여 업로드 한다.
book/schemas/books.xml
<table name="books"> <column name="book_srl" type="number" size="11" notnull="notnull" auto_increment="auto_increment" primary_key="primary_key" /> <column name="module_srl" type="number" size="11" default="0" notnull="notnull" index="idx_module_srl" /> <column name="book_title" type="varchar" size="40" /> <column name="book_author" type="varchar" size="40" /> <column name="book_publisher" type="varchar" size="40" /> <column name="book_price" type="number" size="11" /> <column name="regdate" type="date" notnull="notnull" /> </table> </pre> <p>$book_srl과 $module_srl 컬럼은 값이 결코 NULL이어서는 안 될 중요한 값이기 때문에 NOT NULL로 설정한다. DB 테이블에 대한 이해는 개인적으로 공부하기 바라며 XE코어에서 사용하는 XML 스키마 언어 레퍼런스는 개발자 메뉴얼을 꼭 참고하기 바란다.(p.38)</p> <p>테이블 스키마 파일을 업로드하면 관리자>모듈>모듈 목록 화면에서 모듈설치가 출력된다. 모듈 설치를 완료하자. 만약 BOOK 모듈을 만들면서 문제가 있다면 phpMyAdmin을 이용해 DB에 접속하여 xe_books 테이블을 삭제해도 XE코어에는 아무 영향도 주지 않는다. 테이블이 삭제되면 다시 모듈 설치 버튼이 출력된다.</p> <h3>2. 모듈 언어팩 (Language) </h3> <p>언어 변수를 담는 그릇은 $lang 변수(배열)다. 이 그릇에 맴버 변수 형식으로 미리 대입해 두고 {$lang->book_title} 형식의 템플릿 구문으로 출력하여 사용한다. $lang 변수는 모듈만 사용하는 것이 아니다. XE코어 전반에 걸쳐 공통으로 사용한다. 공통 언어팩은 xe/common/lang/ko.lang.php 파일이다.</p> <p>모듈은 템플릿 파일 또는 스킨 파일에서 자신이 사용하는 언어팩을 먼저(?) 찾아 본다. 정확한 의미로 같은 변수명을 사용한다면, 공통 언어 변수가 먼저 로드된 후에 나중에 로드된 모듈의 언어 변수가 새로운 값으로 갱신해 둘 것이다...^^ 모듈이 사용하는 언어팩은 모듈 안의 <span class="font_red">모듈이름/lang/ko.lang.php</span>이다. 그런데 예상치 못한 문제가 있었다. 도서명을 title로, 저자를 author로 했던 경우에는 폼 검사 스크립트에서 title은 "제목"으로, author는 "작성자"로 출력 되었다. 원하지 않는 결과값이었다. 모듈 스킨에서는 나중에 갱신된 언어 변수가 출력 되었지만 스크립트에서는 공통 언어팩을 참조하고 그곳에 설정된 변수의 값이 그대로 출력되는 것이다...? 할 수 없이 book_title, book_author로 바꾸었다. 따라서 모듈을 만들때는 항상 공통 모듈이 사용하는 언어변수를 참고하고 모듈에서 사용하는 언어에 대해서는 새로운 변수를 만들고 사용하자.</p> <p><strong>book/lang/ko.lang.php</strong></p> <pre class="brush: php; html-script: true; toolbar: false; gutter: false;"> <?php /** * @file ko.lang.php * @author XE스쿨 BOOK 모듈 만들기 예제 * @brief BOOK 모듈의 기본 언어팩 **/ // 모듈 상단에 사용되는 언어 $lang->book_management = 'BOOK 모듈'; $lang->about_book = 'XE스쿨 BOOK 모듈 만들기 예제입니다.<br />BOOK 모듈 예제는 데이터베이스(DB)에 자료의 입력/수정/삭제를 구현하기 위한 예제 모듈입니다.'; // 버튼에 사용되는 언어 $lang->cmd_book_list = 'BOOK 목록'; $lang->cmd_book_insert = 'BOOK 등록'; $lang->cmd_book_config = 'BOOK 정보'; // 기본 단어 $lang->book_title = '도서명'; $lang->book_author = '저자'; $lang->book_publisher = '출판사'; $lang->book_infomation = '도서 정보'; $lang->book_no = '도서번호'; $lang->book_price = '가격'; $lang->book_insert_date = '입력일자'; ?> </pre> <br /> </div><!-- // XE노트 서브페이지 끝 --> </div> <div id="copyright"><p>Copyright ©2016 XE SCHOOL All rights reserved.</p></div> </div> </div><!-- // panel end --> </div><!-- // content end --> <div id="sidebar"> <div id="side"> <div class="bar_title top_radius bar_gradient shadow_black"> <span class="side_title">모듈</span> </div> <div class="side_content bottom_radius op shadow_black"> <ul class="lnb"> <li><a href="/xe/xenote_module_story">모듈의 기본 이해</a> <ul class="lnb_sub"> <li><a href="/xe/xenote_module_urls">XE의 URL 규칙</a></li><li><a href="/xe/xenote_module_form_db">폼(form)과 DB</a></li><li><a href="/xe/xenote_module_mvc">MVC 구조의 이해</a></li><li><a href="/xe/xenote_module_front_back_end">프론트엔드와 백엔드 뷰(View)</a></li><li><a href="/xe/xenote_module_admin_model">모듈 확장과 모델(Model)</a></li><li><a href="/xe/xenote_module_admin_controller_insert">입력 컨트롤러(Controller)</a></li><li><a href="/xe/xenote_module_admin_controller_delete">삭제 컨트롤러(Controller)</a></li><li><a href="/xe/xenote_module_admin_tab_menu">관리자 모듈 탭메뉴</a></li><li><a href="/xe/xenote_module_admin_grant_skininfo">액션 권한과 스킨정보</a></li> </ul> </li><li class="active"><a href="/xe/xenote_module_book_about">BOOK 모듈 만들기</a> <ul class="lnb_sub"> <li><a href="/xe/book_example">Book 모듈 미리보기</a></li><li><a href="/xe/xenote_module_book_config">모듈 설정 파일</a></li><li class="active"><a href="/xe/xenote_module_book_table_language">테이블 설치와 언어팩</a></li><li><a href="/xe/xenote_module_book_backend">백엔드 MVC</a></li><li><a href="/xe/xenote_module_book_contentlist">목록(List)과 모델</a></li><li><a href="/xe/xenote_module_book_contentview">보기(View)와 모델</a></li><li><a href="/xe/xenote_module_book_contentwrite">입력(Insert/Update) 컨트롤러</a></li><li><a href="/xe/xenote_module_book_contentdelete">삭제(Delete) 컨트롤러</a></li> </ul> </li><li><a href="/xe/xenote_module_about_bookmark">룰셋과 북마크 모듈 만들기</a> <ul class="lnb_sub"> <li><a href="/xe/xenote_module_bookmark_mvc">북마크 모듈의 MVC</a></li><li><a href="/xe/xenote_bookmark_registration">북마크 모듈 등록하기</a></li><li><a href="/xe/xenote_bookmark_adminlist">백엔드 북마크 목록보기</a></li><li><a href="/xe/xenote_bookmark_admininsert">백엔드 북마크 입력하기</a></li><li><a href="/xe/xenote_bookmark_admindelete">백엔드 북마크 삭제하기</a></li><li><a href="/xe/xenote_bookmark_list">프론트엔드 북마크 목록보기</a></li><li><a href="/xe/xenote_bookmark_insert">프론트엔드 북마크 입력하기</a></li><li><a href="/xe/xenote_bookmark_delete">프론트엔드 북마크 삭제하기</a></li> </ul> </li> </ul> </div> </div><!-- // side end --> </div><!-- // sidebar end --> </div><!-- // contentwrap end --> <div id="footer"> </div><!-- // footer end --> </div><!-- // container end --> </div><!-- // wrapper end --> <script type="text/javascript"> var _gaq = _gaq || []; _gaq.push(['_setAccount', 'UA-27987546-1']); _gaq.push(['_trackPageview']); (function() { var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); })(); </script> <div id="waitingforserverresponse"></div> <script type="text/javascript" src="./addons/captcha/captcha.js"></script> <script type="text/javascript" src="./files/cache/js_filter_compiled/5e93526d838489c482d47d95cc345914.ko.compiled.js"></script> </body> </html> <!-- FILE ARCHIVED ON 11:57:37 Nov 29, 2016 AND RETRIEVED FROM THE INTERNET ARCHIVE ON 07:04:06 Aug 13, 2020. JAVASCRIPT APPENDED BY WAYBACK MACHINE, COPYRIGHT INTERNET ARCHIVE. ALL OTHER CONTENT MAY ALSO BE PROTECTED BY COPYRIGHT (17 U.S.C. SECTION 108(a)(3)). --> <!-- playback timings (ms): esindex: 0.017 PetaboxLoader3.resolve: 89.615 exclusion.robots.policy: 0.384 captures_list: 489.681 exclusion.robots: 0.4 LoadShardBlock: 181.713 (3) CDXLines.iter: 21.223 (3) PetaboxLoader3.datanode: 86.486 (4) load_resource: 199.248 RedisCDXSource: 281.553 -->