https://web.archive.org/web/20161130070911/http://www.xeschool.com/xe/xenote_module_book_contentview
BOOK 모듈(mid)의 목록에서 책의 제목을 클릭하면 도서 정보를 보여주는 프론트 엔드 뷰(View)이다. 목록에서 다 소개하지 못한 정보의 값을 마저 출력해 보여주는 것이 목적이다. 목록에서 제목에는 다음과 같은 링크로 dispBookContentView 액션을 요청한다. {getUrl('book_srl', $book_info->book_srl,'act','dispBookContentView')} 즉 제목에 할당된 책의 고유 식별 번호($book_srl)를 찾아 URL에 붙여 액션을 실행 할 힌트로 제공하는 것이다. $book_srl을 넘겨 받은 액션은 MVC를 돌기 시작한다.
프론트 엔드 뷰(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} 형식으로 간단히 값을 찾아 출력하기만 하면 된다.