====== Tutorial - News section ======
동적 컨텐츠 생성과 database를 사용하는 튜토리얼.
===== Setting up your model =====
컨트롤러가 DB 직접 쓰지 않고, 모델이 DB에 쓰도록 만들어서, 후에 다시 사용할 수 있게 한다. 모델은 DB에 insert,update,select 를 하거나 그외 데이터를 관리하는 곳이다. 모델은 데이터를 관리하는 부분.
**application/models** 폴더에 **news_model.php** 파일을 만든다. 아래 코드를 추가한다. DB에 제대로 접속하게 설정했는지 확인하는 것은 필수.
load->database();
}
}
**CI_Model**로부터 상속되어 database 라이브러리를 로드한다. **$this->db** 오브젝트를 활성화 한다.
db에 쿼리를 날리기 위해, db 스키마를 만든다. db에 접속해서 아래 쿼리를 실행해서 테이블을 추가하고 테스트용 데이터를 넣는다.
CREATE TABLE news (
id int(11) NOT NULL AUTO_INCREMENT,
title varchar(128) NOT NULL,
slug varchar(128) NOT NULL,
text text NOT NULL,
PRIMARY KEY (id),
KEY slug (slug)
);
db와 모델이 설정되었다. db로부터 데이터를 읽어올 메소드가 필요하다. CodeIgniter 의 db를 추상화한 레이어 (abstraction layer), **Active Record**를 사용한다. '쿼리'를 한번만 사용해도 지원하는 [[http://ellislab.com/codeigniter/user-guide/general/requirements.html|모든 DB]]에 동작하도록 되어 있다. 아래의 코드를 추가한다.
public function get_news( $slug = FALSE )
{
if( $slug == FALSE )
{
$query = $this->db->get('news');
return $query->result_array();
}
$query = $this->db->get_where( 'news', array('slug'=>$slug) );
return $query->row_array();
}
이 코드로 두 종류의 쿼리를 얻을 수 있다. 첫번째는 전부, 두번째는 slug 에 의한 news만. **$slug** 변수에 대해서 그다지 신경쓰지 않았을텐데, ActiveRecord가 알아서 처리해줬기 때문이다.
===== Display the news =====
쿼리 작성은 완료되었다. (오호) 모델은 뉴스를 출력할 뷰와 연결되어야 한다. 모델과 뷰를 바로 연결하지 않고 컨트롤러를 거쳐 연동된다. (이전의 static page를 만드는 방법처럼)
"news"라는 새 컨트롤러를 **application/controllers/news.php** 파일에 추가한다.
load->model('news_model');
} // 컨트롤러가 모델을 사용하는구나.
public function index() {
$data['news'] = $this->news_model->get_news();
}
public function view( $slug ) {
$data['news'] = $this->news_model->get_news( $slug );
}
}
생성자에서 부모의 생성자를 실행 시켜 (parent::__construct();) 모델을 로딩하게 한 다음, 이 컨트롤러에서 모두 모델을 쓸 수 있게 했다.
다음, 두개의 메소드를 추가 했다. index()는 기본으로 호출되는 함수로 모든 뉴스를 불러온다. view() 함수는 $slug 파라미터를 받아, $slug에 매치 되는 뉴스만 읽어온다. (위의 위의 코드)
db에서 읽어온 모든 뉴스는 $data['news'] 에 저장된다.
위의 코드는 컨트롤러가 모델을 사용해 뉴스 데이터를 읽어오기만 했다. 다음과 같이 고쳐서, 뷰에 반영되도록 수정한다.
public function index()
{
$data['news'] = $this->news_model->get_news();
$data['title'] = 'News archive';
$this->load->view('templates/header', $data);
$this->load->view('news/index', $data);
$this->load->view('templates/footer');
}
위의 코드는 뉴스 데이터를 모델로부터 읽어와서 변수에 저장한다. 타이틀을 위한 변수, $data['title'] 뿐만 아니라 모든 데이터가 저장되어 뷰로 전달된다. 뷰를 위한 코드를 추가한다.
**application/views/news/index.php** 파일을 추가한다.
View article
모든 뉴스항목이 반복처리 되어 화면에 표시된다. 이 코드는 php와 html을 mix 해서 사용했지만 템플릿을(template language) 사용하고 싶다면 CodeIgniter의 [[http://ellislab.com/codeigniter/user-guide/libraries/parser.html|Template Parser]]나 외부 파서를 사용해도 된다.
뉴스 전체를 보는 페이지는 완료 되었다. 개별 뉴스를 보는 페이지는 아직 없다. ($slug를 사용하는 페이지) 모델에는 이미 기능이 추가 되어 있으므로 컨트롤러에 새 뷰를 위한 함수를 추가한다.
public function view($slug) {
$data['news_item'] = $this->news_model->get_news($slug);
if (empty($data['news_item'])) {
show_404();
}
$data['title'] = $data['news_item']['title'];
$this->load->view('templates/header', $data);
$this->load->view('news/view', $data);
$this->load->view('templates/footer');
}
파라미터 없는 get_news()를 사용하는 대신, $slug를 파라미터로 넘겨주었다. 결과, 특정 검색 결과의 뉴스만 출력된다. 다음 할일은, 컨트롤러에 응답하는 뷰 페이지를 추가하는 것.
**application/views/news/view.php** 파일에 다음 코드를 추가한다.
'.$news_item['title'].'';
echo $news_item['text'];
{{tag> CodeIgniter Tutorial}}