Tutorial - News section
동적 컨텐츠 생성과 database를 사용하는 튜토리얼.
Setting up your model
컨트롤러가 DB 직접 쓰지 않고, 모델이 DB에 쓰도록 만들어서, 후에 다시 사용할 수 있게 한다. 모델은 DB에 insert,update,select 를 하거나 그외 데이터를 관리하는 곳이다. 모델은 데이터를 관리하는 부분.
application/models 폴더에 news_model.php 파일을 만든다. 아래 코드를 추가한다. DB에 제대로 접속하게 설정했는지 확인하는 것은 필수.
<?php class News_model extends CI_Model { public function __construct() { $this->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를 사용한다. '쿼리'를 한번만 사용해도 지원하는 모든 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 파일에 추가한다.
<?php class News extends CI_Controller { public function __construct() { paret::__construct(); $this->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 파일을 추가한다.
<?php foreach ($news as $news_item): ?> <h2><?php echo $news_item['title'] ?></h2> <div id="main"> <?php echo $news_item['text'] ?> </div> <p><a href="news/<?php echo $news_item['slug'] ?>">View article</a></p> <?php endforeach ?>
모든 뉴스항목이 반복처리 되어 화면에 표시된다. 이 코드는 php와 html을 mix 해서 사용했지만 템플릿을(template language) 사용하고 싶다면 CodeIgniter의 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 파일에 다음 코드를 추가한다.
<?php echo '<h2>'.$news_item['title'].'</h2>'; echo $news_item['text'];
CodeIgniter Tutorial