ウェブ、ショウジン

CakePHP 1.2でブログチュートリアル その3

2009-8-18
Category
PHP

次に「モデル」を作成する。

Postモデルの作成

モデルクラスはCakePHPでアプリケーションを作成するにあたって基本中の基本らしい。

モデルを作成することでデータベースとやりとりできるようになる。(コントローラに直にメソッドを記述することでモデルを使用しないで利用することもできるけれど、よろしくない)

表示(view)、追加(add)、編集(edit)、削除(delete)といったデータベース操作に必要な土台を手に入れることになる。

CakePHPのモデルクラスのファイルは/app/models/の中にあり、今回は/app/models/post.phpというファイルを作る。

app/models/post.php

<pre lang="PHP"><?php
class Post extends AppModel {
    var $name = 'Post';
}
?>

モデル名をPostとすることで、CakePHPは自動的に「このモデルはPostsController」で使用されるのだと判断する。また、postsという名前のデータベーステーブル(先に用意した)と結びつけられるようになる。(これもCakePHPの命名規則による)

モデルの詳細についてはマニュアルの「モデル」の章を参照のこと。

Postsコントローラの作成

次に、投稿記事(posts)に対するコントローラファイルを作成する。

この場合のコントローラとは、投稿記事に関連する実際の作業を行う部分で、今回はposts_controller.phpという名前でapp/controllers/ディレクトリの中に配置する。

app/controllers/posts_controller.php
超基本のコントローラ内容

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

}

これにひとつアクションを加えてみる。アクションは、アプリケーションの中のひとつの関数か、インタフェースを表す。例えば、今回のチュートリアルアプリケーションにおいて

http://IPアドレス/cakeblog/posts/index(http://IPアドレス/cakeblog/posts/と同じ意味)をブラウザからリクエストした場合に、投稿記事の一覧が表示されるようにするアクションは次のようになる。

<?php
class PostsController extends AppController {
    var $name = 'Post';

    // indexアクション
    function index() {
        $this->set('posts', $this->Post->find('all'));
    }
}

今回の場合でいうと、PostsControllerの中にindex()という関数を定義したことによってhttp://IPアドレス/cakeblog/posts/indexというURLでそのロジックにアクセス出来るようになる。

同様に、foobar()という関数を定義するとhttp://IPアドレス/cakeblog/posts/foobarでアクセス出来るようになる。

上記のindexアクションについてもう少し詳しく説明すると、$this->setによって、このコントローラからビュー(ユーザが目にする部分をテンプレート化したもの)にデータを渡している。この行はPostモデルのfind(‘all’)メソッドから帰ってきた値で、postsというビューの変数を設定している。Postモデルは自動的に$this->Postとして呼び出されている。(命名規則に従ったおかげで)

コントローラに関する詳細は「CakePHPによる開発」の中の「コントローラ」を参照のこと。

この段階でhttp://IPアドレス/cakeblog/posts/indexにブラウザでアクセスすると、以下のようなエラーが表示される。これは前述の「ビュー」ファイルが見つからない(まだ用意されていない)ため。

cakeblog_005

Postsビューを作成する

前段階で作成したindexアクション用のビューを作成する。indexアクションでは投稿記事一覧を表示するように定義されているので、これを(posts)表示するための「Postsビュー」を作成することになる。(現段階で、モデルにはデータが入り、コントローラにはアプリケーションロジックと流れが定義されている)

CakePHPのビュー(view)は、アプリケーションのレイアウト(layout)の内側にはめこまれる、データ表示用(ユーザ側に見せる)の部分。中身は、たいていの場合PHPのコードが含まれる(x)htmlになるけれど、XMLやCSV、バイナリのデータの場合もあり得る。

レイアウト(Layout)はビューを囲む表示用のコードで、別に定義することも切り替えることも可能だけれども、今のところはデフォルトのものを使用して進めることにする。

ビューには、データベースから取得した投稿記事一覧のデータが配列として渡される。これを取り出してブラウザ上で表示出来るように、そのためのビューファイルを用意する。

CakePHPのビューファイルは/app/viewsの中で「コントローラ名に対応するフォルダ内」に保存する。なので、今回は/app/viewsの中に「posts」というフォルダを作成し、この中にindexアクションのためのビューファイルをindex.ctpという名で作成する。

app/views/posts/index.ctp
記述の仕方は(x)htmlにPHPスクリプトを埋め込んでいく普通の形。

<h1>Blog posts</h1>
<table>
    <tr>
        <th>Id</th>
        <th>Title</th>
        <th>Created</th>
    </tr>
    <!-- $posts配列をループして投稿記事一覧を表示する -->
    <?php foreach ($posts as $post): ?>
    <tr>
        <!-- Postモデルからidを取得して表示 -->
        <td><?php echo $post['Post']['id']; ?></td>
        <td>
            <!-- Postモデルからtitleを取得して表示しつつ該当記事へのリンクも張っている -->
            <!-- link()メソッドによって指定されたタイトル(最初のパラメータ)とURL(二つ目のパラメータ)でHTMLリンクを生成して>いる -->
            <?php echo $html->link($post['Post']['title'], "/posts/view/".$post['Post']['id']); ?>
        </td>
        <!-- Postモデルからcreated情報(いつ投稿されたか)を取得して表示 -->
        <td><?php echo $post['Post']['created']; ?></td>
    </tr>
    <?php endforeach; ?>
</table>

Cake内でURLを指定する場合、単にアプリケーションのrootパスに対する相対パスを指定するだけで良いらしい。通常は/コントローラ名/アクション名/パラメータ1/パラメータ2といった形。

ブラウザでhttp://IPアドレス/cakeblog/posts/indexにアクセスすると、用意されたビューファイルによって「投稿記事一覧」ページが表示される。

cakeblog_006

この段階で、投稿記事のタイトルをクリックして該当記事本文を開こうとすると次のようなエラーが表示される。

cakeblog_007

これは当然で、そのアクション(この場合viewアクション)はまだ定義されていない(コントローラファイルに記述されていない)から。次のようにコードをコントローラに追加する。

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

    // indexアクション
    function index() {
        $this->set('posts', $this->Post->find('all'));
    }

    // viewアクション
    function view($id = null) {
        // Postモデルからidを取得して変数$idに代入
        $this->Post->id = $id;
        // 記事はidにひもづく一件だけ取得できればいいのでfind('all')ではなくread()
        $this->set('post', $this->Post->read());
    }

}

この状態でブラウザをリロードすると「Error: The view for PostsController::view() was not found.」というエラーメッセージで「Postsコントローラのviewアクションに対応するviewファイルがないよ」と示される。

その次の行で親切丁寧に「Error: Confirm you have created the file: /var/www/cakeblog/app/views/posts/view.ctp」と示してくれるので、指示されているディレクトリ(indexアクション用のビューファイルを用意した時に作成済み)「app/views/posts/」に「view.ctp」という名前でviewアクション用ビューファイルを作成する。

app/views/posts/view.ctp

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

ブラウザで再度記事自体にアクセスしてみると、用意したビューファイルでもって表示される。

cakeblog_008

Categories

Tag Cloud

AdMob Android Apache centos CodeIgniter EC-CUBE facebookアプリ facebookページ feed Firefox Flash google googleanalytics htaccess iPad iPhone JavaScript lamp mobile nginx ogp pear php plugin rollover rss sendmail setting smarty ssh Titanium Mobile Titanium Studio tutorial ubuntu vim VirtualBox vmware vps Windows WordPress xampp youtube さくらインターネット アクセス解析 カスタム投稿