원문: http://ellislab.com/codeigniter/user-guide/tutorial/create_news_items.html



지금쯤이면 Codegniter를 사용하여 데이터베이스에서 데이터를 읽어오는 방법을 알 것이다. 이제는 데이터베이스에 정보를 추가하는 방법을 알아보자. 이 장에서는 앞서 만든 news 컨트롤러와 모델 클래스를 확장해서, 새로운 뉴스 아이템을 추가하는 방법을 설명하려고 한다.



아이템 생성하기


데이터를 데이터베이스에 입력하기 위해서는 폼(form)을 만들어서 정보를 입력한 후 저장해야 한다. 다시 말해 2개의 필드를 가지는 폼이 필요한데, 하나는 타이틀을 나머지 하나는 텍스트를 입력하기 위한 것이다. slug는 모델의 title로부터 추출하여 만든다.


새로운 뷰 파일인 application/views/news/create.php을 만들자.

<h2>Create a news item</h2>


<?php echo validation_errors(); ?>


<?php echo form_open('news/create')

?>


<label for="title">Title</label>

<input type="input" name="title" />

<br />


<label for="text">Text</label>

<textarea name="text"></textarea>

<br />

<input type="submit" name="submit" value="Create news item" />


</form>


이 코드에서 익숙하지 않은 구문은 단지 2개 뿐이다. form_open() 함수와 validation_errors() 함수다. 


첫 번째 함수는 form_helper가 제공하며, 폼 요소를 렌더링하며 추가적인 기능을 제공한다. 예를 들면 CSFR 보호 필드와 같은 기능이 있다. 두 번째 함수는 폼 검증시 발생하는 에러를 출력하는 기능을 담당한다.


이제 news 컨트롤러로 다시 가자. 여기에서는 2가지 작업이 필요한데, 하나는 전달된 폼이 submit되었는지 확인하는 일과 나머지 일은 전달된 데이터가 유효성 규칙을 만족하는지 확인하는 일이다. 이를 위해서 form_validataion 라이브러리를 사용한다.

public function create() {

    $this -> load -> helper('form');

    $this -> load -> library('form_validation');


    $data['title'] = 'Create a news item';


    $this -> form_validation -> set_rules('title', 'Title', 'required');

    $this -> form_validation -> set_rules('text', 'text', 'required');


    if ($this -> form_validation -> run() === FALSE) {

        $this -> load -> view('templates/header', $data);

        $this -> load -> view('news/create');

        $this -> load -> view('templates/footer');


    } else {

        $this -> news_model -> set_news();

        $this -> load -> view('news/success');

    }

}


위 코드는 여러가지 기능을 추가한다. 먼저 첫 부분에서는 form_helper와 form_validation 라이브러리를 로드한다. 그리고 나서 폼 검증을 위한 규칙을 설정한다. set_rules() 메서드는 3개의 인자를 받는다. 입력 필드의 이름, 에러 메시지에서 사용할 이름, 그리고 규칙이다. 여기에서는 타이틀과 텍스트는 필수값이다.


CodeIgniter는 앞에서 보는 바와 같이 강력한 폼 검증 라이브러리를 제공한다. 폼 검증 라이브러리에 대한 자세한 설명은 여기에서 살펴보라. 


또한 폼 검증을 실행했을 때 성공했는지 검사하는 조건문이 있다. 만약 성공하지 못한다면, 폼이 재출력된다. 만약 모든 규칙을 통과하면, 모델이 호출된다. 그런 후, 뷰가 로드되어 성공 메시지를 출력한다. application/view/news/success.php 뷰 파일을 만들어서, 적당한 성공 메시지를 작성한다.



모델


마지막으로 데이터베이스에 데이터를 입력하는 메서드를 만들자. Active Record 클래스를 사용하여 정보를 입력하며, input 라이브러리를 사용하여 POST 방식으로 전달된 데이터에 접근할 것이다. 앞서 만든 모델 클래스를 열어서, 아래의 코드를 추가하자.

public function set_news() {

    $this -> load -> helper('url');


    $slug = url_title($this -> input -> post('title'), 'dash', TRUE);


    $data = array('title' => $this -> input -> post('title'), 'slug' => $slug, 'text' => $this -> input -> post('text'));


    return $this -> db -> insert('news', $data);

}


이 메서드에서는 데이터베이스에 새로운 뉴스 아이템을 입력하기 전에 신중한 처리 작업을 한다. 3번째 라인의 새로운 함수인 url_title()이 바로 그 함수다. URL helper 에서 제공하는 이 함수는 문자열을 치환한다. 공백은 모두 대시(-)로, 그리고 모든 문자를 소문자로 변환한다. 이러한 과정을 통해 적당한 slug를 만들 수 있으며, 이는 또한 URI를 만드는데도 제격이다.


데이터베이스 입력할 레코드를 준비하는 작업을 이어서 만든다. 레코드는 $data 배열에 저장한다. 각 요소는 앞서 만든 데이터베이스 테이블의 각 컬럼에 대응한다. 여기에 새로운 메서드가 나오는데, 바로 post() 메서드다. 이 메서드는  input 라이브러리에서 제공한다. 이 메서드는 데이터의 유효성을 검증하여, 공격을 시도하는 공격 문구로부터 보호하도록 해준다. input 라이브러리는 기본적으로 자동으로 로드된다. 마지막으로 $data 배열을 데이터베이스에 입력한다.



라우팅


CodeIgniter 어플리케이션에서 이제 뉴스 아이템을 추가하기 전에, 추가적인 작업이 하나 남아 있는데 바로 config/routes.php 파일에 규칙을 추가하는 일이다. 이 파일을 아래와 같이 수정한다. 이를 통해 CodeIgniter가 'create'을 뉴스 아이템의 slug가 아닌, 메서드로 인식할 수 있게 된다.

$route['news/create'] = 'news/create';

$route['news/(:any)'] = 'news/view/$1';

$route['news'] = 'news';

$route['(:any)'] = 'pages/view/$1';

$route['default_controller'] = 'pages/view';


이제 브라우저를 열어서 index.php/news/create 을 URL에 입력한 후 호출하자. 축하한다! 이제 ㅇ당신은 첫번째 CodeIgniter 어플리케이션을 완성했다. 새로운 뉴스를 몇개 추가해보고, 이전에 만든 나머지 페이지들을 사용해 보자.



Posted by socurites