뉴스 섹션¶
지난 섹션에서는 정적 페이지를 포함하는 클래스를 작성하여 프레임워크의 기본 개념을 배웠습니다. 사용자 정의 라우팅 규칙을 추가하여 URI를 정리했습니다. 이제 동적 콘텐츠를 소개하고 데이터베이스 사용을 시작할 차례입니다.
모델 설정¶
데이터베이스 작업을 컨트롤러에 직접 작성하는 대신, 나중에 쉽게 재사용할 수 있도록 쿼리를 모델에 배치해야 합니다. 모델은 데이터베이스나 기타 데이터 저장소에서 정보를 검색, 삽입, 업데이트하는 곳입니다. 모델은 데이터를 나타냅니다.
application/models/ 디렉터리를 열고 News_model.php 라는 새 파일을 만들어 다음 코드를 추가하세요. 여기 에 설명된 대로 데이터베이스를 올바르게 구성했는지 확인하세요.
<?php
class News_model extends CI_Model {
public function __construct()
{
$this->load->database();
}
}
이 코드는 앞서 사용된 컨트롤러 코드와 비슷합니다. CI_Model 을 확장하여 새 모델을 만들고
데이터베이스 라이브러리를 로드합니다. 이를 통해 $this->db 오브젝트를 통해
데이터베이스 클래스를 사용할 수 있습니다.
데이터베이스를 쿼리하기 전에 데이터베이스 스키마를 만들어야 합니다. 데이터베이스에 연결하고 아래 SQL 명령(MySQL)을 실행하세요. 시드 레코드도 추가하세요.
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)
);
이제 데이터베이스와 모델이 설정되었으므로 데이터베이스에서 모든 게시물을 가져오는 메소드가 필요합니다. 이를 위해 CodeIgniter에 포함된 데이터베이스 추상화 레이어인 Query Builder 를 사용합니다. 이를 통해 쿼리를 한 번 작성하고 지원되는 모든 데이터베이스 시스템 에서 작동하게 할 수 있습니다. 모델에 다음 코드를 추가하세요.
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 로 뉴스 항목을 가져올 수 있습니다. 쿼리를 실행하기 전에 $slug 변수가
살균(sanitize)되지 않았다는 것을 눈치챘을 것입니다.
Query Builder 가 대신 처리해 줍니다.
뉴스 표시¶
이제 쿼리가 작성되었으므로 모델을 뉴스 항목을 사용자에게 표시할 뷰에 연결해야 합니다.
앞서 만든 Pages 컨트롤러에서 이를 수행할 수 있지만, 명확성을 위해 새 News
컨트롤러를 정의합니다. application/controllers/News.php 에 새 컨트롤러를 만드세요.
<?php
class News extends CI_Controller {
public function __construct()
{
parent::__construct();
$this->load->model('news_model');
$this->load->helper('url_helper');
}
public function index()
{
$data['news'] = $this->news_model->get_news();
}
public function view($slug = NULL)
{
$data['news_item'] = $this->news_model->get_news($slug);
}
}
코드를 보면 앞서 만든 파일과 유사점이 있습니다. 먼저 __construct() 메소드:
부모 클래스(CI_Controller)의 생성자를 호출하고 모델을 로드하여 이 컨트롤러의
다른 모든 메소드에서 사용할 수 있도록 합니다. 나중에 뷰에서 사용할 함수를 포함하는
URL 헬퍼 함수 모음도 로드합니다.
다음으로 뉴스 항목을 보기 위한 두 가지 메소드가 있습니다: 모든 뉴스 항목용과 특정
뉴스 항목용. 두 번째 메소드에서 $slug 변수가 모델의 메소드에 전달되는 것을 볼 수
있습니다. 모델은 이 slug를 사용하여 반환할 뉴스 항목을 식별합니다.
이제 모델을 통해 컨트롤러에서 데이터를 검색했지만 아직 표시되는 것은 없습니다. 다음으로 할 일은 이 데이터를 뷰에 전달하는 것입니다.
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');
}
위의 코드는 모델에서 모든 뉴스 레코드를 가져와 변수에 할당합니다. title 값도
$data['title'] 요소에 할당되고 모든 데이터가 뷰에 전달됩니다. 이제 뉴스 항목을
렌더링할 뷰를 만들어야 합니다. application/views/news/index.php 를 만들고
다음 코드를 추가하세요.
<h2><?php echo $title; ?></h2>
<?php foreach ($news as $news_item): ?>
<h3><?php echo $news_item['title']; ?></h3>
<div class="main">
<?php echo $news_item['text']; ?>
</div>
<p><a href="<?php echo site_url('news/'.$news_item['slug']); ?>">View article</a></p>
<?php endforeach; ?>
여기서 각 뉴스 항목이 루프되어 사용자에게 표시됩니다. 템플릿이 HTML과 혼합된 PHP로 작성된 것을 볼 수 있습니다. 템플릿 언어를 사용하려면 CodeIgniter의 Template Parser 클래스나 서드파티 파서를 사용할 수 있습니다.
뉴스 개요 페이지는 이제 완성되었지만, 개별 뉴스 항목을 표시하는 페이지가 아직 없습니다.
앞서 만든 모델은 이 기능에 쉽게 사용할 수 있도록 만들어졌습니다. 컨트롤러에 코드를 추가하고
새 뷰를 만들기만 하면 됩니다. News 컨트롤러로 돌아가 view() 를 다음과 같이 업데이트하세요:
public function view($slug = NULL)
{
$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'];
라우팅¶
앞서 만든 와일드카드 라우팅 규칙 때문에 방금 만든 컨트롤러를 보기 위한 추가 라우트가
필요합니다. 라우팅 파일(application/config/routes.php)을 다음과 같이 수정하세요.
이렇게 하면 요청이 Pages 컨트롤러로 직접 가는 대신 News 컨트롤러에 도달합니다.
첫 번째 줄은 slug가 있는 URI를 News 컨트롤러의 view() 메소드로 라우팅합니다.
$route['news/(:any)'] = 'news/view/$1';
$route['news'] = 'news';
$route['(:any)'] = 'pages/view/$1';
$route['default_controller'] = 'pages/view';
브라우저를 문서 루트로 향하고 index.php/news 를 추가하여 뉴스 페이지를 확인하세요.