cakephpでブックマークアプリを作る(1) ITかあさん

ITかあさん

cakephpでブックマークアプリを作る(1)

最小のMVCをつくる

Mはmodel(データベース),Vはview(HTMLや見た目の部分),Cはcontrollers(プログラムの制御を行う)でcakephpは構成されています。

modelを作成する

データベースにて、postsテーブルを作成しましたので、/app/models/フォルダの中に
post.phpというファイルを作成して、以下の記述をします。

php4ならこの記述

<?php
class Post extends AppModel
{
var $name = 'Post';//PHP4のときは書く
}
?>

php5以降ならこの記述

<?php
class Post extends AppModel
{
}
?>

class Post extends AppModel
class Post extends AppModelでは、postが単数形であることに注意してください。単数系であることだけ注意していただければ、特にこれと言って説明もありません。

controllersの作成

次にコントローラーを作成します。今回postというテーブルを使うことにしたので、/app/controllors/に新しくposts_controller.phpというファイルを作成して、以下の記述をします

<?php
  class PostsController extends AppController {
}
  ?>

posts_controller postsが複数系であることに注意してください。
モデル(データベース)は単数形、コントローラーは複数形といった感じでしょうか?

まだposts_controllerの中身は空ですが、ここでいったん、アクセスしてみたいと思います。
(途中からで申し訳ないのですが、ローカル環境にしてしまいました。)
ローカルのbookmarkフォルダで作って、postsコントローラーで作っているので、
URLは以下の通りになります。

http://localhost/bookmark/posts/

とりあえず怒られました。

cakephpには、コントローラーがあれば、必ずそれを出力するview(HTMLとかコントローラーの内容を出力するほう)が必要になります。

エラーが気になるのでとりあえず先にposts_controller.phpを出力するファイルを作成しておきます。
C:\xampp\htdocs\bookmark\app\views

コントローラー名がposts_controller.phpとしているので、viewフォルダに新しくpostsフォルダを作成して、その中にindex.ctpというファイルを作成します。viewの拡張子は.ctpとなっていることに注意してください。

C:\xampp\htdocs\bookmark\app\views\posts\view.ctp

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Bookmarkアプリ ブックマーク出力画面</title>
</head>

<body>
<h1>Bookmarkアプリ ブックマーク出力画面</h1>

<table>
<tr>
<th>サイト名</th>
<td>URL</td>
<td>登録日時</td>
<td>更新日時</td>
</tr>
</table>

</body>
</html>

うん、見るからに普通のHTMLファイルですね。WEBデザイナーの方なんかは、なんら気にする点はないと思います。

まずは一覧表示用のコントローラーを作成していきます。
{}の中にトップページ表示用の記述を追加します。

class PostsController extends AppController {
function index($id = null) {
$post = $this->Post->find('all');
debug($post);
}
}
}

これで一旦出力してみましょう。すると、

Array
(
    [0] => Array
        (
            [Post] => Array
                (
                    [id] => 1
                    [title] => Yahoo
                    [url] => http://www.yahoo.co.jp
                    [created] => 2011-02-18 14:34:44
                    [modified] => 
                )

        )

    [1] => Array
        (
            [Post] => Array
                (
                    [id] => 2
                    [title] => Google
                    [url] => http://www.google.co.jp/
                    [created] => 2011-02-18 14:35:11
                    [modified] => 
                )

        )

)

データベースの中身が連想配列で表示されました。debug()とは、cakePHPのコントローラー内で変数の中身を自由に参照するためのものです。文字列だろうが、配列だろうがどちらでもdebug()でいけます。便利ですね。

無事データベースの中身が参照できたところで、出力ファイル用に変数に代入してあげます。Smartyで言うところのsmarty assignのようなものです。function index($id = null){}の中に$this->set(‘post’,$post);と書いてあげるだけです

class PostsController extends AppController {
function index($id = null) {

$post = $this->Post->find('all');
debug($post);
$this->set('post',$post); }

}
}

長くなりましたが、あともう少し。先ほどのviewフォルダのindex.ctpを変更します

<table>
<tr>
<th>サイト名</th>
<td>URL</td>
<td>登録日時</td>
<td>更新日時</td>
</tr>
<tr>
<?php foreach ($posts as $post ): ?>
<th><?php echo $post['Post']['title'];?></th>
<td><?php echo $post['Post']['url'];?></td>
<td><?php echo $post['Post']['created'];?></td>
<td><?php echo $post['Post']['modified'];?></td>
</tr>
<?php endforeach; ?>
</table>

赤字の書き方でctpファイル内でのforeachになります。Smartyとそっくりです。

<table>
<tr>
<th>サイト名</th>
<td>URL</td>
<td>登録日時</td>
<td>更新日時</td>
</tr>
<tr>
<?php foreach ($posts as $post ): ?>
<th><?php echo $post['Post']['title'];?></th>
<td><?php echo $post['Post']['url'];?></td>;
<td><?php echo $post['Post']['created'];?></td>
<td><?php echo $post['Post']['modified'];?></td>
</tr>
<?php endforeach; ?>
</table>

<th><?php echo $post[‘Post’][‘title’];?></th>に注目してください。[‘Post’]と、model名が来ていますね!Postモデルのtitleというフィールドを出力しますよという意味になります。

長くなりましたが、以上で、一覧表示については終わります。

次回はORDER BYやWHEREのデータの条件の絞込みについてやります。

今回の内容は圧縮してこちらにおきました。
細かくコメントアウトでより詳しく解説してありますので、よろしかったらダウンロードしてください。
ダウンロードはこちら

今日のまとめ

・model→単数形
・controllers→複数形
・データベースのtable→複数形
・データを表示するにはcontrollerとそれに対応するviewが必要
・$post = $this->Post->find(‘all’);データは連想配列で受け取る

初夏のJavaScript祭 in サーキュレーションビル ForPro