* User ID : leesungmin
* Homepage : https://4880.net
* Email : imadonis@naver.com
* Following : 랩퍼투혼 whom the member is following.
* Following Count : 1people
* Followed by : 랩퍼투혼, 탑돌이 ... now follwing this member.
* Followed Count : 2people

< 빌립보서 4장 13절>
내가 주 안에서 크게 기뻐함은 너희가 나를 생각하던 것이 이제 다시 싹이 남이니 너희가 또한 이를 위하여 생각은 하였으나 기회가 없었느니라 ! 내가 궁핍하므로 말하는 것이 아니니라! 어떠한 형편에든지 나는 자족하기를 배웠노니 나는 비천에 처할 줄도 알고 풍부에 처할 줄도 알아 모든 일 곧 배부름과 배고픔과 풍부와 궁핍에도 처할 줄 아는 일체의 비결을 배웠노라! 내게 능력 주시는 자 안에서 내가 모든 것을 할 수 있느니라 !

* Document Count : 17511
* Comment Count : 82
* Document Count : 36
* Document Count : 115
* Comment Count : 123
* Document Count : 2
* Comment Count : 2
* Document Count : 1
* Comment Count : -1

CMS

  • List
  • Down
  • Up
  • Write
  • Search

모듈 보기(View)와 모델

부운영자 부운영자
92 0 0

BOOK Module dispBookContentView

 

보기(View)와 모델(Model)

BOOK 모듈(mid)의 목록에서 책의 제목을 클릭하면 도서 정보를 보여주는 프론트 엔드 뷰(View)이다. 목록에서 다 소개하지 못한 정보의 값을 마저 출력해 보여주는 것이 목적이다. 목록에서 제목에는 다음과 같은 링크로 dispBookContentView 액션을 요청한다.
{getUrl('book_srl', $book_info->book_srl,'act','dispBookContentView')}
즉 제목에 할당된 책의 고유 식별 번호($book_srl)를 찾아 URL에 붙여 액션을 실행 할 힌트로 제공하는 것이다. $book_srl을 넘겨 받은 액션은 MVC를 돌기 시작한다.

dispBookContentView

1. 프론트 엔드 뷰(View)

프론트 엔드 뷰(View) 파일은 URL에 따라온 책의 고유 식별 번호($book_srl)을 떼어 낸다...^^ 방법은 Context::get('book_srl')이다. 이렇게 얻은 값을 일단 $book_srl 변수에 대입한 후 모델(Model)에 던져주기 위해 $obj->book_srl 형식으로 대입하여 모델(Model)이 가지고 있는 getBookContentBook 메소드를 호출한다. 모델(Model)에게 이렇게 이야기하는 것과 같다. "모델! 너 이것(책 번호) 가지고 도서실(books)에 가봐! 그러면 번호가 같은 책이 있을꺼야! 그 책을 가져다 줘! 1권이니까 쉽겠지?"

book.view.php

 

 

<?php
    /**
     * @class  bookView
     * @author XE스쿨 BOOK 모듈 만들기 예제
     * @brief book 모듈의 view class
     **/
 
    class bookView extends book {
 
        /**
         * @brief 선택된 BOOK 내용보기
         **/
        function dispBookContentView() {
 
            // 보기 권한 체크
            if(!$this->grant->view) return $this->dispBookMessage('msg_not_permitted');
 
            // book의 식별번호를 가져옴
            $book_srl = Context::get('book_srl');
            $obj->book_srl = $book_srl;
 
            // book model에서 내용을 가져옴
            $oBookModel = &getModel;('book');
            $output = $oBookModel->getBookContentBook($obj);
             
            // $output->data의 배열 형식을 변경하여 $book_info 변수에 Context 세팅
            Context::set('book_info', $this->arrangeBookInfo($output));
 
            // template_file을 view.html로 지정
            $this->setTemplateFile('view');
        }
 
        /**
         * @brief book model에서 받아온 $output->data를 스킨파일에 보내기 전에 배열 형식 변경
         **/
        function arrangeBookInfo($output) {
            // 1차 배열 형식으로 변경
            if($output->data) {
                foreach($output->data as $val) {
                    $obj = null;
                    $obj->book_srl = $val->book_srl;
                    $obj->book_title = $val->book_title;
                    $obj->book_author = $val->book_author;
                    $obj->book_publisher = $val->book_publisher;
                    $obj->book_price = $val->book_price;
                    $obj->regdate = $val->regdate;
                }
                return $obj;
            }
        }
 
    }
?>

 

그런데 모델(Model)이 가져온 $output의 값을 좀 보자. 문제가 있다. 모델(Model)은 자신이 한 일에 대해 오류가 없고 또한 시킨 일에 대해 성공했다고 좋아한다. 그리고 자신이 했던 일의 내용에 대해서도 무척 꼼꼼하게 기록해 둔다.

$output 값
Object Object ( [error] => 0 
                      [message] => success 
                      [variables] => Array ( [_query] => select * from `xe_books` as books where (book_srl = 2) 
                                                      [_elapsed_time] => 0.00006 
                                                    )
                      [data] => Array ( [0] => stdClass Object ( [book_srl] => 2 
                                                                                   [module_srl] => 3626 
                                                                                   [book_title] => 자바스크립트 
                                                                                   [book_author] => 자바 
                                                                                   [book_publisher] => 스크립트 
                                                                                   [book_price] => 10000 
                                                                                   [regdate] => 20110918 
                                                                                )
                                            )
                    )

 

목록(list)을 만들거라면 모델(Model)이 보내준 $output 값은 매우 훌륭하다. 목록 만들기에서 처럼 $output->data 값만 활용하면 된다. 그러나 단 1권의 도서 정보를 view.html 파일로 그냥 보내기에는 다소 무리가 있다.

 

$output->data 값
Array ( [0] => stdClass Object ( [book_srl] => 2 
                                              [module_srl] => 3626 
                                              [book_title] => 자바스크립트 
                                              [book_author] => 자바 
                                              [book_publisher] => 스크립트 
                                              [book_price] => 10000 
                                              [regdate] => 20110918 
                                           ) 
        )

 

만약 $output->data 값을 $book_info 변수에 대입하여 view.html 파일로 보내게 되면 view.html은 재차 foreach문을 이용해 값에 접근해야 한다. 단 1개의 값인데도 말이다. 그래서 고민한 끝에 배열을 풀어서 보내주기로 한다...^^ 반환 받은 다차원 배열의 $output 값을 바로 아래의 맴버 메소드(arrangeBookInfo())를 이용해 한번더 1차 배열 형식으로 변경하고 반환 받아 보자.

 

변경된 $book_info 값
stdClass Object ( [book_srl] => 2 
                          [book_title] => 자바스크립트 
                          [book_author] => 자바 
                          [book_publisher] => 스크립트 
                          [book_price] => 10000 
                          [regdate] => 20110918 
                       ) 

 

$output->data의 값을 키 없는 값으로 접근하여 각각 $obj의 맴버 변수로 대입해 둔다. 그렇게 모아진 $obj 는 $book_info 변수에 Context::set() 즉, URL에 예쁘게 붙여 보낸다는 뜻이다. 그러면 값을 전달 받는 view.html 문서 안에는 foreach문을 사용하지 않아도 된다. {$book_info->book_title} 형식으로 간단히 값을 찾아 출력하기만 하면 된다.

2. 모델(Model)과 XML 데이터 접근 쿼리

모델과 XML 쿼리 언어는 목록 만들기와 같다. 모델이 인자값으로 넘겨 받는 중요한 키워드는 $book_srl의 값이고 이것을 이용해 DB에서 같은 값을 갖는 row 데이터의 값을 찾아 올 것이다.

book.view.php

 

<?php
    /**
     * @class  bookModel
     * @author XE스쿨 BOOK 모듈 만들기 예제
     * @brief  book 모듈의 model class
     **/
 
    class bookModel extends book {
 
        // 내용 가져오기
        function getBookContentBook($args){
            $output = executeQueryArray('book.getBookContentBook', $args);
            return $output;
        }
 
   }
?>

 

queries/getBookContentList.xml

 

<query id="getBookContentBook" action="select">
    <tables>
        <table name="books" />
    </tables>
    <columns>
        <column name="*" />
    </columns>
    <conditions>
        <condition operation="equal" column="book_srl" var="book_srl" />
    </conditions>
</query>
</pre>
  
 
<h3>3. 사용자 스킨</h3>
 
<p>$book_info 변수를 전달 받은 view.html 파일은 foreach문을 사용하지 않더라도 $book_info 값에 접근할 수 있게 되었다. XE 템플릿 구문으로 해당하는 셀(Cell)에 값을 채워 넣는다.</p>
 
<p><strong>skins/default/view.html</strong></p>
<pre class="brush: xhtml; toolbar: false; gutter: false;">
<!--#include("_header.html")-->
 
<h2>Book View : {$book_info->book_title}</h2>
 
<!-- 도서 정보 -->
<table border="0" class="bookTable">
    <tr>
        <th>BOOK</th>
        <th>{$lang->book_infomation}</th>
    </tr>
    <tr>
        <th>{$lang->category}</th>
        <td>{$module_info->browser_title}</td>
    </tr>
    <tr>
        <th>{$lang->book_no}</th>
        <td>{$book_info->book_srl}</td>
    </tr>
    <tr>
        <th>{$lang->book_title}</th>
        <td>{$book_info->book_title}</td>
    </tr>
    <tr>
        <th>{$lang->book_author}</th>
        <td>{$book_info->book_author}</td>
    </tr>
    <tr>
        <th>{$lang->book_publisher}</th>
        <td>{$book_info->book_publisher}</td>
    </tr>
    <tr>
        <th>{$lang->book_price}</th>
        <td>{$book_info->book_price}</td>
    </tr>
    <tr>
        <th>{$lang->book_insert_date}</th>
        <td>{zdate($book_info->regdate,"Y-m-d")}</td>
    </tr>
</table>
 
<!-- 버튼 -->
<div class="btn">
    <span class="button"><input type="button" value="{$lang->cmd_back}" onclick="history.back(); return false;" /></span> 
    <a href="{getUrl('act','dispBookContentWrite','book_srl',$book_info->book_srl)}" class="button red" title="{$lang->cmd_modify}"><span>{$lang->cmd_modify}</span></a>
    <a href="{getUrl('act','dispBookContentDelete','book_srl',$book_info->book_srl,'book_title',$book_info->book_title)}" class="button black" title="{$lang->cmd_delete}"><span>{$lang->cmd_delete}</span></a>
</div>
 
<!--#include("_footer.html")-->
</pre>
 
<p>도서 정보를 확인하는 페이지 하단에는 수정 버튼과 삭제 버튼이 출력된다. 두 기능 모두 중요한 힌트는 도서의 식별 번호($book_srl)이다. 수정 버튼의 액션은  dispBookContentWrite 이다. 즉 수정과 새로 등록하는 액션은 모두 같은 이름의 함수를 호출하게 된다. 또한 템플릿 스킨 파일 역시 write.html 파일로 같은 파일을 사용한다. 하지만 새로 등록하는 버튼에는 식별 번호가 없고, 수정하는 버튼에는 이미 구해 놓은 식별 번호를 URL에 붙여 보내게 된다. 다시 말해서 같은 이름의 액션을 요청할 때 도서의 식별 번호를 붙여 가는 것과 아닌 차이가 있고 이것은 결국 함수 안에서 해야 할 일이 달라진다는 것을 말해준다. </p>
 
<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><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 class="active"><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 07:09:11 Nov 30, 2016 AND RETRIEVED FROM THE
     INTERNET ARCHIVE ON 07:22: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):
  PetaboxLoader3.resolve: 510.43 (2)
  LoadShardBlock: 256.397 (3)
  PetaboxLoader3.datanode: 317.897 (4)
  exclusion.robots: 0.386
  RedisCDXSource: 2.526
  esindex: 0.013
  captures_list: 287.259
  exclusion.robots.policy: 0.371
  load_resource: 622.178
  CDXLines.iter: 22.386 (3)
-->

 

부운영자 부운영자
93 Lv. 785830/795240P

< 빌립보서 4장 13절>
내가 주 안에서 크게 기뻐함은 너희가 나를 생각하던 것이 이제 다시 싹이 남이니 너희가 또한 이를 위하여 생각은 하였으나 기회가 없었느니라 ! 내가 궁핍하므로 말하는 것이 아니니라! 어떠한 형편에든지 나는 자족하기를 배웠노니 나는 비천에 처할 줄도 알고 풍부에 처할 줄도 알아 모든 일 곧 배부름과 배고픔과 풍부와 궁핍에도 처할 줄 아는 일체의 비결을 배웠노라! 내게 능력 주시는 자 안에서 내가 모든 것을 할 수 있느니라 !

ReportShareScrap

Comment 0

Comment Write
WYSIWYG

Report

"님의 댓글"

Are you sure you want to report this comment?

Comment Delete

"님의 댓글"

I want to Are you sure you want to delete?

Share

Permalink
  • memcache, memcached 비교 PHP Client Comparison There are primarily two clients used with PHP. One is the older, mor... 네이버 블로그 | brian2님의 블로그 - 네이버 블로그 | brian2님의 블로그
  • Extra_vars Widget 확장변수 출력(extra_vars) 위젯 만들기 sol님의 글을 전문인용하여 재구성하였다. - http://xe.xpressengine.net/18235319 게시판의 게시물의 확장 변수를 출력하는 위젯입니다. Document 모듈을 ...
  • Member_join_extend Add-on 14세 이상/미만 구분 회원가입 애드온 만들기 SMaker님의 글을 전문인용하여 재구성하였다. - http://xe.xpressengine.net/wiki/18257064 회원가입시 14세 이상/미만 구분 및 약관/개인정...
  • Block_Word Add-on 단어 차단 애드온 만들기 sol님의 글을 전문인용하여 재구성하였다. - http://xe.xpressengine.net/18229352 block_word 애드온은? 사용자가 쓴 게시물과 댓글이 출력될 때 애드온 설정에 등록해 ...
  • 위 두개 안먹힘 라이믹스 스케치북 게시판 및 스케치북 게시판 1.72 스크롤 이슈 https://xetown.com/index.php?mid=qna&category=671911&document_srl=757026&comment_srl=757413&page=1 기존에 작성했던 글입니다. ...
  • Popup window Add-on 기초 팝업 윈도우 애드온 만들기 애드온의 작동 방법과 호출 시점을 살펴보고 확장변수를 활용하여 외부 HTML 파일을 찾아 팝업윈도우 형태로 출력해 주는 기초적인 팝업 윈도우 애드온을 만들어...
  • 애드온의 제작 규칙
    Creating Rules of Add-on 애드온의 제작 규칙 애드온의 제작 규칙 애드온의 디렉토리 구조 info.xml 제작 애드온이름.addon.php 제작 XE XML Query의 사용 애드온 제작시 주의사항 애드온의 제작 규칙 애드온을 제작...
  • 애드온의 기초 이해
    The basis of add-on XE 애드온의 기초 이해 SMaker님의 글을 전문인용하여 재구성하였다. - http://xe.xpressengine.net/wiki/18180622 애드온이란? 애드온의 호출 시점 애드온 호출시 전달 변수 애드온(Addon)이란?...
  • XE 애드온 개발하기
    The Story of XE Addons XE코어의 간섭쟁이 애드온 이야기... 애드온의 이해 - SMaker 기초 팝업 윈도우 애드온 만들기 단어 차단(block_word) 애드온 만들기 - sol 14세이상/미만 연령구분 회원가입 애드온 만들기 -...
  • XE 애드온
    탑돌이 Views 46 20.08.14.13:34
    XE 애드온 개발하기 애드온의 기초 이해 애드온의 제작 규칙 기초 팝업 윈도우 애드온 만들기 단어 차단 애드온 만들기 연령구분 회원가입 애드온
  • 3개 서버 로그인 공유 가능한가요? 3개 서버 모두 라이믹스로 적용하고 파일서버와 DB 서버 내용이 모두 동일합니다. 그냥 사용자 분산을 위해서 .. 2개 서버는 아이피로... htttp://111.111.111.11 로 접속하고 1개 ...
  • 보기(View)와 모델
    부운영자 Views 92 20.08.13.16:27
    BOOK Module dispBookContentView 보기(View)와 모델(Model) BOOK 모듈(mid)의 목록에서 책의 제목을 클릭하면 도서 정보를 보여주는 프론트 엔드 뷰(View)이다. 목록에서 다 소개하지 못한 정보의 값을 마저 출력해 ...
  • 부운영자 Views 156 20.08.13.16:19
    BOOK Module dispBookContentList 목록(List)과 모델(Model) BOOK 모듈의 관리자 화면(back-end)에서 새로운 모듈(mid)을 생성하였다면, "Book 모듈 미리보기"와 같이 메뉴를 만들고 모듈(mid)을 연결하였을 것이다. ...
  • 부운영자 Views 44 20.08.13.16:13
    BOOK Module Back-end BOOK 모듈의 백엔드 MVC BOOK 모듈의 백엔드(back-end) 프로그램은 예제(example) 모듈과 같다. 폴더의 이름은 곧 모듈의 이름이기 때문에 example을 book으로 변경한다. 또한 클래스 파일의 이...
  • 테이블 설치와 언어팩
    BOOK Module Table & Language books 테이블 설치와 언어팩 1. DB 테이블의 설치 (Database Table) 모듈의 스키마(schemas) 폴더에 XML 언어 형식으로 만들어진 DB 스키마 파일이 있다면 XE코어는 설치시 사용했던 DB...
  • 모듈 설정 파일
    부운영자 Views 94 20.08.13.16:02
    BOOK Module Config BOOK 모듈 설정 파일 예제(example) 모듈을 만들어 보고 BOOK 모듈의 작동 방법을 미리 보았다면 다음 과정들이 그렇게 어렵지 않을 것이다. BOOK 모듈은 이전 과정에서 "폼(form)과 DB"의 예제로...
  • 웹 관련 도서
    부운영자 Views 36 20.08.13.16:00
    Book List : 웹 관련 도서 번호 도서명 저자 출판사 가격 106 dfsdf sss sss 123165 105 ㅁㄴㅇ ㅁㄴㅇ asd 11 104 1243 4325324 ㅈㄷㄱㄴㅇ 123124 103 Test Book Test Auther Test 1000 102 sad asdasd asdasdasd 1...
  • BOOK 모듈 만들기
    부운영자 Views 57 20.08.13.15:58
    BOOK Module BOOK 모듈 만들기 프론트 엔드 뷰(View) 구현을 위한 BOOK 모듈 만들기 예제 모듈의 기본 이해 과정은, 모듈이 폼을 다루는 방법에 대하여 예제 모듈의 백엔드(back-end) 프로그램을 직접 만들어 보면서 ...
  • 액션 권한과 스킨정보
    Module Admin Action Grant & SkinInfo 액션 권한과 스킨 정보 액션의 권한 관리와 프로트 엔드 스킨의 정보를 출력하기 위한 과정이다. 액션 권한(permission)은 함수의 실행 권한을 확인하여 관리자가 아닌 경우 요...
  • Module Admin Tab Menu 관리자 모듈 탭메뉴 모듈의 관리자 목록 페이지 헤더에 위치한 가로 탭메뉴의 구현이다. 1. 탭메뉴 header.html 탭메뉴 구성을 위한 header.html 파일을 tpl폴더에 다음과 같이 추가한다. tpl/...