사용자 도구

사이트 도구


language:php:codeigniter:tutorial

차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

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