원문 : http://manual.cakephp.org/appendix/blog_tutorial

cakePHP로 블로그 만들기

섹션 1

소개

Cake에 오신것을 환영한다! 사용자는 이 튜토리얼에 만족할 것이다. 왜냐하면 사용자는 Cake가 어떻게 작동하는지에 대해 더 알고싶어하기 때문이다.생산성을 높이고 코딩을 더 즐겁게 하는것이 우리의 목표이다. 이 튜토리얼을 통해 사용자가 코드와 좀 더 친숙해지기를 바란다.

이 튜토리얼은 사용자가 간단한 블로그 어플리케이션을 만들게 인도해줄 것이다. 먼저 Cake를 다운로드 받고 설치한 후 데이터베이스를 생성하고 설정한다. 그리곤 블로그 포스트의 리스트, 추가, 수정, 삭제에 대한 어플리케이션 로직을 만든다.

사용자에게 필요한 것들:

1. 실행중인 웹서버. 사용자가 아파치를 사용하고 있다고 가정한다. 다른 서버에서 사용하는 명령어도 비슷하다. 어쩌면 서버 설정 몇군데를 만져줘야 할지도 모른다. 하지만 대부분의 경우 어떤 설정변경도 없이 Cake를 띄우고 실행할 수 있다.

2. 데이터베이스. 이 튜토리얼에서는 MySQL을 사용할 것이다. 사용자가 DB를 생성하는 SQL문 정도는 알고 있을 필요가 있다. Cake는 거기서부터 시작할 것이다.
3. 기본적인 PHP지식. OOP(객체지향 프로그래밍)를 할 수 있다면 더 좋다. 하지만 구조적인 프로그래밍을 해왔다고 해서 겁먹을 필요는 없다.

4. 마지막으로 MVC프로그래밍 패턴에 대한 기본지식이 필요하다.  "기본 개념"과 섹션 2: MVC패턴에 간략한 개요를 볼 수 있다. 걱정하지 말라. 반페이지 정도 밖에 안되니까...


자 이제 시작해 보자!

섹션 2

Cake 얻기

먼저, 최신 Cake 코드를 얻자. 최신 소스를 얻기 위해서는 Cakeforge의 CakePHP 프로젝트를 방문해서 안정된 릴리스를 다운로드 하라.

Cakeforge: http://cakeforge.org/projects/cakephp/

사용자는 또한 서브버전의 트렁크에서 최신 소스를 체크아웃하거나 익스포트할 수 있다.

서브버전 저장소 : https://svn.cakephp.org/repo/trunk/cake/1.x.x.x/

다운로드 받은 파일을 사용자의 웹루트 폴더안에 풀어 놓는다.(역자주: 이때 폴더명은 사용자 임의로 결정해도 된다. 실습을 할때는 보통 cake라는 폴더 아래 소스가 위치하도록 하면 좋다.) 이 과정이 끝나고 나면 사용자의 폴더 구조는 아래와 같을 것이다:

  1. /path_to_document_root
        /app
        /cake
        /vendors
        .htaccess
        index.php
        VERSION.txt
    

이제 Cake의 디렉토리 구조와 작동원리에 대해 배울때가 된것 같다. "기본 개념"의 섹션3 : Cake의 파일 배치 개요를 살펴보라.

섹션 3

블로그 데이터베이스 생성

다음으로 블로그에서 사용할 데이터베이스를 만들어보자. 지금은 블로그 글을 저장할 테이블을 하나 만들어 볼것이다. 또한 테스트를 위해 사용할 글들도 몇개 함께 넣어 볼것이다. 데이터베이스에 아래 SQL문을 실행해 보라

  1. /* First, create our posts table: */
    CREATE TABLE posts (
        id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
        title VARCHAR(50),
        body TEXT,
        created DATETIME DEFAULT NULL,
        modified DATETIME DEFAULT NULL
    );
    
    /* Then insert some posts for testing: */
    INSERT INTO posts (title,body,created)
        VALUES ('The title', 'This is the post body.', NOW());
    INSERT INTO posts (title,body,created)
        VALUES ('A title once again', 'And the post body follows.', NOW());
    INSERT INTO posts (title,body,created)
        VALUES ('Title strikes back', 'This is really exciting! Not.', NOW());
    

사용된 테이블명과 컬럼명들은 임의로 한것이 아니다. 사용자가 Cake의 데이터베이스(역자 주 : 나중에 모델과 깊은 관련이 있다.) 작명 규약을 따른다면 Cake 클래스 작명 규약(둘다 부록" Cake 규약"에서 볼 수 있다. 더 많은 정보를 얻고 싶다면 해당 페이지를 살펴보라.(역자 주 : 아직 번역이 되어 있지 않네요.) 암튼, 위의 규약에 따라서 테이블(posts)은 자동으로 Post모델과 연결된다. 그리고 "modified"와 "created" 필드는 Cake에 의해 자동으로 관리된다.

섹션 4

Cake 데이터베이스 설정

Onward and upward: Cake의 데이터베이스 설정은 어디에 있고 데이터베이스에 연결하는 방법에 대해 얘기해 보자. 이것은 사용자가 건드리는 처임이자 마지막 설정이 될것이다. Cake의 데이터베이스 설정 파일 복사본은 /app/config/database.php.default에 있다. 같은 디렉토리에 파일을 복사하고 database.php로 파일이름을 바꾼다. 설정파일은 매우 직관적이고 간단하다. $default 배열에 있는 변수들을 사용자 설정에 맞게 바꿔주기만 하면 된다. 예제로 완성된 배열을 아래와 같은 형태가 될것이다.

  1. var $default = array('driver'   => 'mysql',
                         'connect'  => 'mysql_pconnect',
                         'host'     => 'localhost',
                         'login'    => 'cakeBlog',
                         'password' => 'c4k3-rUl3Z',
                         'database' => 'cake_blog_tutorial' );

database.php파일을 저장했을때 사용자는 브라우저를 열어서 Cake 환영페이지를 볼 수 있어야 한다. 이 페이지에서 사용자의 데이터베이스 연결파일을 발견했다는 사실을 알려준다. 그리고 Cake는 데이터베이스에 연결할 수 있다.

섹션 5

mod_rewrite에 대한 주의사항

때때로 새로운 사용자들은 mod_rewrite issues에서 실해될 것이다. 그래서 여기서 그 문제들에 관해서 언급하겠다. 만약 Cake 환영 페이지가 약간 웃기게 보인다면(이미지도 없고 css 스타일도 없는), 그것은 mod_rewrite 기능이 잘 작동하고 있지 않다는 것이다. 여기 사용자가 해당 기능을 실행시킬수 있는 몇가지 팁이 있다.

1. .htaccess override가 가능하도록 허가하라: 사용자의 httpd.conf파일에서, 서버에 각 디렉토리를 위한 섹션에 대한 정의가 있는 곳이 있다. 해당 디렉토리에 AllowOverride를 집어넣어라.

2.사용자나 특정 사이트를 위한 httpd.conf파일이 아니라 시스템의 httpd.conf파일을 수정하라.

어떤 이유에서든, 사용자는 .htaccess파일들 대신 CakePHP의 복사본에서 해결할 수 있을지 모른다. 이 어떤때는 실제로 일어날 수 있는 상황이다. 왜냐하면 어떤 시스템들은 '.'을 숨김속성으로 인식해 버려서 복사를 할 수 없기때문이다. CakePHP의복사본을 사이트의 다운로드 섹션이나 서브버전 저장소에서 다운로드 받으라.
4. mod_rewrite를 제대로 설정하라! httpd.conf파일에LoadModule rewrite_module libexec/httpd/mod_rewrite.so 와 AddModule mod_rewrite.c 와 같은 라인을 볼 수 있어야 한다.


사용자가 서버에 mod_rewrite를 원하지 않거나 얻을 수 없다면(혹은 다른 비슷한 모듈을), 사용자는 Cake에 내장된 깔끔한 URL들이 필요할 것이다./app/config/core.php에, 아래 라인의 코멘트를 제거하라:

  1. define ('BASE_URL', env('SCRIPT_NAME'));

이 설정은 사용자의 URL이 www.example.com/index.php/controllername/actionname/param 에서 www.example.com/controllername/actionname/param로 보이도록 해줄 것이다.

섹션 6

포스트 모델 생성

CakePHP 어플리케이션의 빵과 버터는 모델 클래스이다.Cake 모델을 통해서 데이터베이스와 상호작용을 하게 될것이다. 나중에는 view, add, edit, delete가 필요한 곳에 모델을 만들 것이다.


Cake의 모델 클래스 파일들은 /app/models 에 위치한다. 만들어질 파일은 /app/models/post.php라는 이름으로 저장될 것이다. 완성된 파일은 이렇게 나와야 한다:

/app/models/post.php

  1. <?php

    class Post extends AppModel
    {
        var $name = 'Post';
    }

    ?>

클래스와 파일 이름을 짓는 방식은 사용자가 원하는 Post 모델은 사용자의 기본 데이터베이스에 호출된 'posts'라는 테이블과 연결된 PostController에서 사용할 수있다는 의미다. $name이라는 변수는 항상 추가하기 위한 좋은 생각이다. PHP4 에서는 몇몇 클래스 명은 이상하게 사용되어진다.

모델에 대한 더 많은 정보를 얻고 싶다면(테이블 접두사, 콜백과 인증) "모델"장을 살펴보라.

섹션 7

Posts Controller 생성


다음으로 포스트를 위한 콘트롤러를 만들어 볼것이다. 콘트롤러는 포스트를 위한 상호작용이 일어나는 모든 로직이 있다. 그리고 또한 발견된 모델을 위한 모든 액션이 있는 곳이기도 하다. 사용자는 /app/controllers디렉토리에 posts_controller.php라는 이름으로 저장해야 한다. 기본 콘트롤러는 이런 코드여야 한다:

/app/controllers/posts_controller.php

  1. <?php

    class PostsController extends AppController
    {
        var $name = 'Posts';
    }

    ?>

자 이제 콘트롤러에 액션을 추가해 보자. 사용자가 www.example.com/posts 라는 페이지에 요청을 할때, www.example.com/posts/index라는 요청을 하는 것과 같은 의미이다. 만약 URL에 접근했을때 포스트 리스트를 보고 싶다면, index액션은 이렇게 생겼을 것이다:

/app/controllers/posts_controller.php (index action added)

  1. <?php

    class PostsController extends AppController
    {
        var $name = 'Posts';

        function index()
        {
            $this->set('posts', $this->Post->findAll());
        }
    }

    ?>

액션에 대해서 조금 더 설명해 보자. PostsController 에 index()함수를 정의함으로 인해, 사용자는 www.example.com/posts/index 페이지 요청을 통해서 로직에 접근할 수 있다. 유사하게 foobar()라는 함수가 정의되어 있었다면, 사용자들은 www.example.com/posts/foobar에 접근할 수 있다는 것이다.

액션에 사용된 함수는 set()인데 view에(우리가 나중에 만들...) 데이터를 넘긴다. 이 라인은 Post모델의 findAll()의 결과값을 되돌려준다. Post 모델은$this->Post에서 자동으로 사용 가능하다. 왜냐하면 Cake의 작명 규약을 따랐기 때문이다. Cake 콘트롤러에 대하 더 배우고 싶다면 "콘트롤러"장을 참고하라.

섹션 8

포스트 뷰 생성

현재 모델에 연결된 데이터베이스가 있다. 그리고 콘트롤러에 어플리케이션 로직과 플로우가 정의되어 있다. 이제 우리가 위에서 정의한 index액션을 위한 view를 만들어 보자.

Cake의 뷰는 어플리케이션의 레이아웃속에 있는 HTML 과 PHP프로그래밍의 형태를 띄는 코드들의 조합이다. 레이아웃은 정의될수 있고 서로 변환될수도 있지만 여기서는 기본적인 사항들만 다루도록 하겠다. 마지막 섹션에서 set()메서드를 사용해서 'posts'변수들을 어떻게 할당했는지 기억하는가? 그 데이터를 풀어서 쓰게 되면 아래와 같은 형태가 될것이다:

  1. // print_r($posts) output:

    Array
    (
        [0] => Array
            (
                [Post] => Array
                    (
                        [id] => 1
                        [title] => The title
                        [body] => This is the post body.
                        [created] => 2006-03-08 14:42:22
                        [modified] =>
                    )
             )
        [1] => Array
            (
                [Post] => Array
                    (
                        [id] => 2
                        [title] => A title once again
                        [body] => And the post body follows.
                        [created] => 2006-03-08 14:42:23
                        [modified] =>
                    )
            )
        [2] => Array
            (
                [Post] => Array
                    (
                        [id] => 3
                        [title] => Title strikes back
                        [body] => This is really exciting! Not.
                        [created] => 2006-03-08 14:42:24
                        [modified] =>
                    )
             )
    )


Cake의 뷰파일들은 /app/views에 콘트롤러에서 정의한 것과 일치하는 이름으로 저장한다.(이 경우 'posts'라는 폴더를 만들어야 한다.) 테이블에 이 포스트 데이터 포맷을 위해서 뷰 코드는 이런 모습을 하고 있을 것이다:

/app/views/posts/index.thtml

  1. <h1>Blog posts</h1>
    <table>
        <tr>
            <th>Id</th>
            <th>Title</th>
            <th>Created</th>
        </tr>

       <!-- Here's where we loop through our $posts array, printing out post info -->

        <?php foreach ($posts as $post): ?>
        <tr>
            <td><?php echo $post['Post']['id']; ?></td>
            <td>
                <?php echo $html->link($post['Post']['title'], "/posts/view/".$post['Post']['id']); ?>
            </td>
            <td><?php echo $post['Post']['created']; ?></td>
        </tr>
        <?php endforeach; ?>

    </table>

    이 코드가 아주 심플했으면 한다. 사용자는 $html이라는 오브젝트를 사용한다는 것을 알고 있을 것이이다. 이것은 Html헬퍼 클래스의 실례이다. Cake는 링크, 폼 출력, 자바스크립트, Ajax와 같은 기능을 사용하기 위해 뷰 헬퍼를 사용한다. "헬퍼"장에서 좀더 자세한 내용을 배울 수 있을 것이다. 하지만 여기서 중요한 메서드는 타이틀(첫번째 파라미터)과 URL(두번째 파라미터)로 링크를 위한 HTML 링크를 생성하는 link()메서드이다.


Cake에서 URL을 표현할때 사용자는 어플리케이션을 기준으로 한 상대 경로를 표시해 주기만 하면 된다. 나머지는 Cake가 채워준다. 그래서 보통 URL은 /controller/action/id의 형태를 띄게 될것이다. 이제 웹 브라우저에서 http://www.example.com/posts/index 를 사용할 수 있어야 한다. 사용자는 뷰를 볼 수 있어야하고 올바른 제목과 포스트 리스트를 볼 수 있어야 한다는 말이다.

만약 사용자가 리스트의 링크중 하나를 클릭하게 된다면(포스트 타이틀에 걸린 이 링크는 /posts/view/some_id의 형태이다.), Cake는 해당 액션이 아직 정의되지 않았다는 것을 알려줄 것이다. 만약 알려주지 않는다면, 뭔가 잘못된 경우나, 사용자가 이미 액션을 정의한경우라고 볼 수 있으며 매우 비밀스러운 경우이다. 그렇지 않다면, 이제 뷰 액션을 만들어 볼 것이다.:

/app/controllers/posts_controller.php (view action added)

  1. <?php

    class PostsController extends AppController
    {

        var $name = 'Posts';

        function index()
        {
              $this->set('posts', $this->Post->findAll());
        }

        function view($id = null)
        {
            $this->Post->id = $id;
            $this->set('post', $this->Post->read());
        }
    }

    ?>

set()이라는 함수가 눈에 익어야 한다. 또한 findAll()보다 read()를 사용한 부분에 주목하라. 필요한 것은 한개의 포스트 정보이다. 뷰 액션은 파라미터를 갖는다는 것도 명심하라. 이 파라미터는 호출된 URL에 의해서 액션에 넘겨진다. 만약 사용자가 /posts/view/3에 대해 요청을 하게 되면 $id에 넘겨지는 값은 '3'이 된다. 이제 새로운 '뷰' 액션을 위한 뷰를 만들어 보자. 위치는 /app/views/posts/view.thtml이다.

/app/views/posts/view.thtml

  1. <h1><?php echo $post['Post']['title']?></h1>

    <p><small>Created: <?php echo $post['Post']['created']?></small></p>

    <p><?php echo $post['Post']['body']?></p>

/posts/index를 통해 해당 링크가 작동하는지 확인해 보라. 혹은 /posts/view/1로 접근해서 포스트에 대한 요청이 잘 처리되는지 확인해 보라.


섹션 9

포스트 추가하기

reading from the database and showing us the posts is fine and dandy, but let's allow for the adding of new posts. 데이터베이스에서 자료를 읽어오고 포스트 내용을 보여주는 것은 아주 잘 되었다. 그럼, 이젠 새 포스트를 추가하는 부분을 해보도록 하자. 먼저, PostsController에 add() 액션을 추가하는 것부터 시작해 보자.


/app/controllers/posts_controller.php (add action added)

  1. <?php

    class PostsController extends AppController
    {
        var $name = 'Posts';

        function index()
        {
             $this->set('posts', $this->Post->findAll());
        }

        function view($id)
        {
            $this->Post->id = $id;
            $this->set('post', $this->Post->read());

        }

        function add()
        {
            if (!empty($this->data))
            {
                if ($this->Post->save($this->data))
                {
                    $this->flash('Your post has been saved.','/posts');
                }
            }
        }
    }

    ?>

add()액션을 영어문장 형태로 설명해 주겠다: 만약 폼 데이터가 비어 있지 않으면, 해당 데이터를 이용해서 포스트 모델에 저장을 시도한다. 만약 몇가지 이유때문에 저장이 되지 않으면, 사용자에게 데이터 검출에러를 출력하고 해당 에러를 뷰를 통해서 보여준다.

어플리케이션에 포스트 데이터를 저장하기 위해 폼을 사용할때, 그 정보는 $this->params를 통해서 사용 가능하다. 만약 $this->params가 어떻게 생겼는지 보고 싶다면 pr()함수를 통해 어떤 형태인지 볼 수 있다. $this->data는 $this->params['data']에 알리아스가 걸려 있다.

$this->flash()라는 함수는 사용자에서 메시지를 출력하고 두번째 파라미터로 넘겨진 URL을 향하도록 한다.(이 경우에는 '/posts') 만약 DEBUG가 0로 셋팅이 되어 있으면 $this->flash()는 자동으로 리다이렉팅을 하게 된다. 그러나 만약 DEBUG가 0보다 크게되면 메시지를 클릭해야만 해당 URL로 리다이렉팅 될 것이다. save()메서드를 호출하면 검증에러를 체크하고 만약 이상이 있으면 저장하지 않을 것이다. 검증 에러를 체크할 수 있는 몇가지 메서드들이 있다. 하지만 validateErrors()에 대해서만 언급하도록 하겠다. 나머지는 데이터 검증에 대한 섹션에 가서 알려주도록 하고 잠시동안 그 부분에 대해서는 언급하지 않겠다.

섹션 10

데이터 검증

 Cake는 폼 입력 검증의 반복을 벗어나기 위한 해법을 제시한다. 폼과 검증을 위한 루틴이 끝도없이 반복되는 것은 누구나 싫어할말한 일이다. Cake가 그 작업을 쉽고 빠르게 해준다.

To take advantage of the validation features, you'll need to use Cake's HtmlHelper in your views. The HtmlHelper is available by default to all views at $html 검증 기능의 이점을 살리려면, 사용자는 뷰에 HTML 헬퍼를 사용할 필요가 있다. Html헬퍼는 모든 뷰에서 기본적으로 $html을 사용해서 사용가능하다. 여기 add뷰가 있다.:

/app/views/posts/add.thtml

  1. <h1>Add Post</h1>
    <form method="post" action="<?php echo $html->url('/posts/add')?>">
        <p>
            Title:
            <?php echo $html->input('Post/title', array('size' => '40'))?>
            <?php echo $html->tagErrorMsg('Post/title', 'Title is required.') ?>
        </p>
        <p>
            Body:
            <?php echo $html->textarea('Post/body', array('rows'=>'10')) ?>
            <?php echo $html->tagErrorMsg('Post/body', 'Body is required.') ?>
        </p>
        <p>
            <?php echo $html->submit('Save') ?>
        </p>
    </form>


$html->link(), $html->url()을 사용해서 주어진 콘트롤러와 액션으로 부터 적절한 URL을 만들어 낼 것이다. 기본으로, POST폼 태그를 출력한다. 하지만 두번째 파라미터를 통해서 수정이 가능하다. $html->input()과 $html->textarea()함수는 함수명과 같은 폼 요소를 만들어 준다. 첫번째 파라미터는 Cake의 "모델/필드"와 일치하는 것을 의미하고, 두번째 파라미터는 다른 HTML 속성을 의미한다.(input 필드의 크기 같은). 더 많은 정보를 얻고 싶다면 "헬퍼"장을 참조하라. tagErrorMsg()함수 호출은 검증에 문제가 있을 경우 출력할 에러메시지이다. 만약 원한다면 /app/views/posts/index.thtml 파일에 www.example.com/posts/add라는 링크를 가진 "Add Post"라는 텍스트를 추가해 줄 수도 있다. 그 정도면 충분하지만 Cake에게 검증에 대한 조건을 어떻게 전달해 줄 수 있을까? 이제 모델로 돌아갈 때이다.


/app/models/post.php (validation array added)

  1. <?php

    class Post extends AppModel
    {
        var $name = 'Post';

        var $validate = array(

            'title'  => VALID_NOT_EMPTY,
            'body'   => VALID_NOT_EMPTY

        );
    }

    ?>


$validate 배열은 Cake에게 save()메서드가 호출되었을때 어떻게 사용자 데이터를 검증해야 하는지 알려준다. 이 키들을 위한 변수들은 정규표현식과 일치하게( /cake/libs/validators.php를 보라) 번역된 Cake에 의한 변하지 않는 세트이다. 현재 Cake의 검증은 정규표현식을 기반으로 한다. 그러나 사용자는 자신만의 고유한 검증을 위해 Model::invalidate()를 사용할 수 있다. .

이제 검증에 대한 부분더 추가했으니 포스트를 추가할때 타이틀이나 바디가 없으면 어떤일이 일어나는지 보도록 하자.


섹션 11

포스트 지우기

다음으로 포스트를 지우는 부분을 만들어 보자. PostsController에 delete()액션을 추가하는 것부터 시작한다.:

/app/controllers/posts_controller.php (delete action only)

  1. function delete($id)
    {
        $this->Post->del($id);
        $this->flash('The post with id: '.$id.' has been deleted.', '/posts');
    }

이 로직은 특정 $id를 가진 포스트를 삭제한다. 그리고 flash()함수를 통해 /posts로 리다이렉팅을 하기 전에 확인 메시지를 보여준다. 단지 어떤 로직을 실행하고 리다이렉팅을 할 것이기때문에 이 액션은 뷰가 없다. 하지만, 포스트를 삭제하고 난 후에는 index뷰를 업데이트하고 싶을것이다.

/app/views/posts/index.thtml (add and delete links added)

  1. <h1>Blog posts</h1>
    <p><?php echo $html->link('Add Post', '/posts/add'); ?></p>
    <table>
        <tr>
            <th>Id</th>
            <th>Title</th>
            <th>Created</th>
        </tr>

       <!-- Here's where we loop through our $posts array, printing out post info -->

        <?php foreach ($posts as $post): ?>
        <tr>
            <td><?php echo $post['Post']['id']; ?></td>
            <td>
                <?php echo $html->link($post['Post']['title'], '/posts/view/'.$post['Post']['id']);?>
                <?php echo $html->link(
                    'Delete',
                    "/posts/delete/{$post['Post']['id']}",
                    null,
                    'Are you sure?'
                )?>
            </td>
            </td>
            <td><?php echo $post['Post']['created']; ?></td>
        </tr>
        <?php endforeach; ?>

    </table>


이 뷰 코드는 포스트를 삭제하기 전에 사용자에게 확인 메시지를 출력하기 위해서 Html핼퍼를 사용하고 있다.

섹션 12

포스트 수정하기

자.... 그럼 포스트를 수정해보자: 시작한다. 이제 Cake 프로가 다 된거다. 그러니 이제 어떤 패턴을 발견해야 한다. 액션을 만들고, 그 다음 뷰를 만든다. PostsController의 edit액션은 아래와 같은 형태가 될것이다.:

/app/controllers/posts_controller.php (edit action only)

  1. function edit($id = null)
    {
        if (empty($this->data))
        {
            $this->Post->id = $id;
            $this->data = $this->Post->read();
        }
        else
        {
            if ($this->Post->save($this->data['Post']))
            {
                $this->flash('Your post has been updated.','/posts');
            }
        }
    }

이 액션은 제출된 폼 데이터를 체크한다. 만약 제출된 것이 없으면, 포스트를 찾아서 볼 수 있도록 해준다. 만약 몇개의 데이터가 제출되었다면 포스트 모델에 저장하려고 할 것이다.(혹은 되돌리거나(kick back) 검증 에러를 보여줄 것이다.) 뷰는 이런 형태가 될것이다.:

/app/views/posts/edit.thtml

  1. <h1>Edit Post</h1>
    <form method="post" action="<?php echo $html->url('/posts/edit')?>">
        <?php echo $html->hidden('Post/id'); ?>
        <p>
            Title:
            <?php echo $html->input('Post/title', array('size' => '40'))?>
            <?php echo $html->tagErrorMsg('Post/title', 'Title is required.') ?>
        </p>
        <p>
            Body:
            <?php echo $html->textarea('Post/body', array('rows'=>'10')) ?>
            <?php echo $html->tagErrorMsg('Post/body', 'Body is required.') ?>
        </p>
        <p>
            <?php echo $html->submit('Save') ?>
        </p>
    </form>

이 뷰는 edit폼을 출력한다.(이미 저장된 값과 함께...) 그리고 필요한 에러 메시지도 보여준다.(만약 있다면). 여기서 알아야 할 것이 있다: Cake는 사용자가 모델에 이미 존재하는 'id'필드가 있다고 가정한다. 만약 'id'가 없으면(앞에서 만들었던 add뷰를 돌아보라.) Cake는 save()를 호출할때 새 모델을 삽입했다고 가정한다. 이제 index 뷰에 포스트를 수정하는 링크를 추가할 수 있게 되었다.:

/app/views/posts/index.thtml (edit links added)

  1. <h1>Blog posts</h1>
    <p><?php echo $html->link("Add Post", "/posts/add"); ?>
    <table>
        <tr>
            <th>Id</th>
            <th>Title</th>
            <th>Created</th>
        </tr>

       <!-- Here's where we loop through our $posts array, printing out post info -->

        <?php foreach ($posts as $post): ?>
        <tr>
            <td><?php echo $post['Post']['id']; ?></td>
            <td>
                <?php echo $html->link($post['Post']['title'], '/posts/view/'.$post['Post']['id']);?>
                <?php echo $html->link(
                    'Delete',
                    "/posts/delete/{$post['Post']['id']}",
                    null,
                    'Are you sure?'
                )?>
                <?php echo $html->link('Edit', '/posts/edit/'.$post['Post']['id']);?>
            </td>
            </td>
            <td><?php echo $post['Post']['created']; ?></td>
        </tr>
        <?php endforeach; ?>

    </table>

섹션 13

라우트

이 부분은 옵션이다, 하지만 Cake에서 URL을 위한 특정함수를 어떻게 호출하는지 이해하는데 도움이 될것이다. 이 튜토리얼에서는 빠르게 라우트를 바꾸는 것을 할 것이다. 더 많은 정보를 얻고 싶다면, "설정"장의 섹션3:라우트 설정을 보라. Cake의 기본 라우트는 PostsController에 사용자 사이트의(예를 들어 http://www.example.com) 루트에 방문하는 사람을 데려갈 것이다. 그리고 홈으로 호출된 뷰를 랜더링한다. 그렇게 하기보다, 블로그 어플리케이션의 사용자들이 곧 만들어질 PostsController로 가기를 원할 것이다. Cake라우팅은 /app/config/routes.php에서 찾을 수 있다. 이와 같은 라인을 제거하거나 코멘트를 없애고 싶을 수도 있다.:

  1. $Route->connect ('/', array('controller'=>'pages', 'action'=>'display', 'home'));

이 라인은 Cake 홈페이지의 / URL로 연결한다. 이것을 사용자가 만든 Controller로 연결하고 싶다. 그래서 다음과 같은 라인을 추가한다.:

  1. $Route->connect ('/', array('controller'=>'posts', 'action'=>'index'));

이것은 곧 만들어질 PostsController의 index()액션에 '/'에 대한 사용자의 요청을 연결하도록 해야 한다.

섹션 14

결론

이런 방식으로 어플리케이션을 제작하는 것은 개발자를 편안함과 여러가지 즐거움들을 제공해줄것이다. 간단하지 않은가? 이 튜토리얼은 매우 기본적인 것이라는 것을 명심하기 바란다. Cake에서 제공하는 보다 많은 기능들이 있다. 그리고 여기서 다루지 못한 더 유연한 방법들이 있다. 이 메뉴얼의 나머지 부분을 좀더 풍성한 기능이 있는 어플리케이션을 만드는데 사용하라. 이제 기본 어플리케이션을 제작해 봤으니 실전을 하기 위한 준비는 모두 마쳤다. 실제 자신의 프로젝트를 시작하라. 메뉴얼의 나머지 부분과 API에 대한 부분을 읽어라. 도움이 필요하다면 cakephp사이트를 방문하라. Cake의 세계에 온걸 환영한다.

이올린에 북마크하기(0) 이올린에 추천하기(0)
Posted by RoyTim