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は以下の通りになります。
とりあえず怒られました。
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’);データは連想配列で受け取る