A.8. Post Views の作成

モデルを使用してデータベースに接続できるようになりました。そして、コントローラによって、アプリケーションロジックと流れが定義されました。今度は上で定義した、index アクションに対するビューを作成してみます。

Cake のビューは、アプリケーションの layout の中にはめこんだ、単なる HTML と PHP の断片的なコードでできています。Layout(レイアウト)は、独自に定義したり、切り替えたりすることができますが、今のところは、デフォルトのものを使っておきましょう。

前のセクションで、set() メソッドを使用して、 'posts' 変数をビューに渡したのを覚えているでしょうか。このデータはビューに、次のような形で渡されます:

// print_r($posts) 出力:

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'という名のフォルダを作成する必要があります。)に合うフォルダの中に保存されます。この投稿データを table を使用した形にするには、ビューのコードは次のようになります:

例 A.4. /app/views/posts/index.thtml

<h1>ブログの投稿</h1>
<table>
    <tr>
        <th>Id
        <th>タイトル</th>
        <th>作成日</th>
    </tr>

   <!-- ここで、 $posts 配列のループをまわして、投稿情報を printing out します。 -->

    <?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 というオブジェクトを使用していることに気づくかもしれません。これは、 HtmlHelper  クラスのインスタンスです。 Cake には一連のビュー 'ヘルパー' があり、リンクの作成、フォームの出力、JavaScript, Ajax といったものを素早く作成することができます。その使用法については、 "ヘルパー"の章を参照してください。しかし、ここで大切なのは、 link() メソッドが、 HTML のリンクを、与えられたタイトル(最初のパラメータ)と URL (2番目のパラメータ)で生成する、ということです。

Cake の中で URL を指定する時は、アプリケーションのベースに対する相対パスを設定するだけでよく、残りの部分は Cake が補います。したがって、URL は、 /controller/action/id という形を取ることになります。

さて、ブラウザで、 http://www.example.com/posts/index を読めるようになったはずです。タイトルとテーブルによって正しく整えられた投稿の一覧が見えるようになったはずです。

このビューの中に作ったリンク( URL /posts/view/some_id にリンクの張られた投稿タイトル)をクリックした場合、おそらく、Cake が、そのアクションはまだ定義されていないという情報を表示するはずです。そうならない場合には、何かがおかしいか、あなたが“卑怯にも”すでに定義したかのどちらかのはずです。まだ作っていない、という場合には、作ってみましょう:

例 A.5. /app/controllers/posts_controller.php (view アクションの追加)

<?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() を使用していることに注意してください。投稿情報を一つしか必要としないからです。

この view アクションはパラメータを取ることに注目してください。このパラメータは、 URL が呼ばれた時にアクションに渡されます。ユーザが /posts/view/3 をリクエストすると、 '3' という値が $id として渡されます。

今度は、新しい 'view' アクションに対するビューを作成して、 /app/views/posts/view.thtml として配置しましょう。

例 A.6. /app/views/posts/view.thtml

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

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

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

/posts/index で表示されたリンクでも、 /posts/view/1 と手動でリクエストした場合でも動作することを確認してください。