https://web.archive.org/web/20161130070911/http://www.xeschool.com/xe/xenote_module_book_contentview

BOOK Module dispBookContentView

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

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/8938a7d7-fb38-4767-a0a5-8db2ae2f52a2/book1.png

  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 데이터 접근 쿼리