目次:CakePHP入門
Cakephpとは人気のフレームワークの一つです。
SQLを書かなくても、何と10分足らずでプログラムが作れちゃいます!
そんな大人気のCakephpの入門をまとめました。
この記事の通りに進めていくと、オリジナルのデザインリンク集を作ることが可能です。
ぜひこの記事を通してCakephpの魅力を存分に知ってくださいね!
Cakephpとは人気のフレームワークの一つです。
SQLを書かなくても、何と10分足らずでプログラムが作れちゃいます!
そんな大人気のCakephpの入門をまとめました。
この記事の通りに進めていくと、オリジナルのデザインリンク集を作ることが可能です。
ぜひこの記事を通してCakephpの魅力を存分に知ってくださいね!
前回までの内容で、cakephpを利用して、データベースの内容を表示するところまではできました。ブックマークアプリらしく、さらにはよくありがちな『WEBデザインのリンク集』なんかにも応用できるようになるよう、登録したURLをカテゴリ別けして、カテゴリごとに表示できるようにしてみましょう。
ALTER TABLE `posts` ADD `category` INT NULL AFTER `url` , ADD INDEX ( `category` )
URLをカテゴリごとに振り分けするフィールドを用意します。INT型にしてINDEXも設定するといいでしょう。
まだデータ数が2件しかないので、表示用のデータを追加しましょう。
さきほどカテゴリーも追加しましたが、このcategoryフィールドのルールは
とでもしておきましょうか
INSERT INTO `bookmark`.`posts` ( `id` , `title` , `url` , `category` , `created` , `modified` ) VALUES ( NULL , 'コリス', 'http://coliss.com/', '1', '2011-02-23 13:21:33', NULL ), ( NULL , 'CREAMU', 'http://blog.creamu.com/mt/', '1', '2011-02-23 13:23:36', NULL ), ( NULL , 'ITかあさん', 'http://www.kaasan.info/', '1', '2011-02-23 13:23:50', NULL );
(強制はしませんが、ITかあさんも追加してくれると嬉しいです。)
前回までに登録したデータのcategoryフィールドはまだNULLなので、カテゴリのデータを追加してあげてください。
UPDATE `bookmark`.`posts` SET `category` = '0' WHERE `posts`.`id` =1 LIMIT 1 ; UPDATE `bookmark`.`posts` SET `category` = '0' WHERE `posts`.`id` =2 LIMIT 1 ;
なぜ`category` = ‘0’ と、1からではなく、0から始まっているかというと、Cakephpのフォームヘルパーで仮にプルダウンを作ると、
デフォルトでは0から始まるからなのです。ま、当面なんでもデフォルトでいきましょう。
これで今回の内容に必要なデータが揃いました。
今回の覚える内容はcakephpのconditionsの話です。conditionsを設定すると、前回はデータベースに登録してある内容をすべて表示しましたが、条件を絞ってデータを表示する、というものです。SQLで言う、WHEREにあたる部分です。
<?php
class PostsController extends AppController {var $uses = array('Post');//自分が使うmodelを配列で書きます。今回はひとつだけ
function index($id = null) {
$con = array('conditions'=>
array('Post.category'=>1)
);$post = $this->Post->find('all',$con);
debug($post);
$this->set('posts',$post);//SmartyのAssignと同じ。viewに出力用の変数として渡します
}}
?>
追加・変更になったのは赤字の部分だけ。すると、debug($post);の結果が変わりましたね
Array ( [0] => Array ( [Post] => Array ( [id] => 1 [title] => Yahoo [url] => http://www.yahoo.co.jp [category] => 0 [created] => 2011-02-18 14:34:44 [modified] => ) ) [1] => Array ( [Post] => Array ( [id] => 2 [title] => Google [url] => http://www.google.co.jp/ [category] => 0 [created] => 2011-02-18 14:35:11 [modified] => ) ) )
[category] => 0
の条件のものだけが無事出力されましたね。
この conditionsには色々ありまして、例えばOR検索、AND検索、LIKE検索も条件が複合検索になっても当然OKです。
CakephpでWHEREができるということは、ORDER BYもできるんです。とっても簡単!
<?php
class PostsController extends AppController {var $uses = array('Post');
function index($id = null) {
$con = array('conditions'=>
array('Post.category'=>1)
'order' => array('Post.id DESC'),
);$post = $this->Post->find('all',$con);
debug($post);
$this->set('posts',$post);
}}
?>
これだけで降順になりました!簡単!WHEREと同様に複合的に順番を入れかえることもできます。
今日の分は、前回の続きなので、PostsControllerのファイルだけをあげておきますね。
ダウンロードはこちら
次回はこのカテゴリをページごとに別けたいと思います。
$conditions = array(‘conditions’=>array(‘Post.category’ =>1),
‘order’ => array(‘Post.id DESC’),
);
これで条件も、ソートもばっちり!
どうでもいいですが、私の文章や記事が明らかにCakephpの初めての記事からだいぶ『エラソー』になったのにお気づきでしょうか?
Cakephpが楽しすぎて、Cakephp初めて1ヶ月で会員サイト、携帯サイトの構築ができてしまったんです!エヘヘ。
Mはmodel(データベース),Vはview(HTMLや見た目の部分),Cはcontrollers(プログラムの制御を行う)でcakephpは構成されています。
データベースにて、postsテーブルを作成しましたので、/app/models/フォルダの中に
post.phpというファイルを作成して、以下の記述をします。
<?php class Post extends AppModel { var $name = 'Post';//PHP4のときは書く } ?>
<?php class Post extends AppModel { } ?>
class Post extends AppModel
class Post extends AppModelでは、postが単数形であることに注意してください。単数系であることだけ注意していただければ、特にこれと言って説明もありません。
次にコントローラーを作成します。今回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’);データは連想配列で受け取る
CakePHPでコントローラーを作る前にやること、確認することが2点あります。
それはsecurity saltの変更とデバッグモードの確認です。
/app/config/core.php の52行目に
define('DEBUG', 2);
と書いてあるやつです。
ざっと説明しますと、
一通り開発が終わったらエラーやダンプを表示させないよう、最後は
define('DEBUG', 0);
とします。
ひとまず、私はdefine('DEBUG', 2);
これでいこうと思います。CakePHP1.3をダウンロードするとデフォルトは2になっていますけどね。
ハッシュの生成に用いられているようです。マニュアルにそう書いてあった。
/app/config/core.phpの153行目を編集し、デフォルトのsalt値を変更します。
デフォルトから1文字でも修正してあればいいそうです。
例えばローカルの開発環境から本番のサーバーにまるごと移動した場合、このsecurity saltの変更を求めてエラーが出力されます。
サーバーを移動したらsecurity saltも一緒に変更してあげます。
これでCakePHPの開発環境が整いました!
動画をもっと大きく見たい方はこちら
CakePHPの便利なところは
これに限ると思います。
これらの便利な機能を存分に発揮するにはCakePHPに沿ったデータベースの設計が必要です。
CakePHPの機能を存分に使うためにはCakePHP独自の命名規則を守らなければなりません。
今回は簡易的なブックマークアプリを作成します。
CREATE TABLE posts (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(50),
url VARCHAR(50),
created DATETIME DEFAULT NULL,
modified DATETIME DEFAULT NULL
);
まずテーブル名ですが、これにも大事な規則があり、仮にpostという内容のテーブルを作成したいなら、postsと、必ず複数形にします。
id名はpost_idとか余計なことはせず、ただidと書きます。で、
URLとタイトルについては特に変わらずいつものデータベース設計と一緒。
登録日時と更新日時の登録については重要な命名規則があります。
登録日時や更新日時をデータベースに登録するにはPHP側でdate関数を使って取得しなくてもCakePHPが勝手にやってくれます!すばらしか!
登録日時と更新日時がほしい場合は登録日時はcreated,更新日時はmodifiedというフィールド名を作成し、DATETIME型にする。これだけです。
なお、今回は多数の書き込みを予想してデータベースの種類はMysqlのinnoDBにしました。私もまだデータベースについてはまだ初心者ですが、SELECT文についてはMyisamが早く、トランザクション機能とサブクエリが投げられるのがnnoDB。それぞれの特徴をつかんで使い分けるとよさげです。
テーブル名は複数系。オートインクリメントはid、登録日時はcreated,更新日時はmodifiedとそれぞれCakePHPの命名規則に沿って名前をつけること!
まずPHPmyadminより、テーブル作成しました。
CakePHPで初めてのDB操作なので、最小限に留めました。
ちなみにMySQL の文字コードは UTF-8 Unicodeです。
データベース作成後、サンプル表示用にデータを入力します。
CakePHPでは データベースに関する情報(データベースの種類、ユーザー名、パスワード)をappフォルダの中のconfigフォルダに置くそうです。
CakePHPをインストールした時に、app/config/ディレクトリ内にdatabase.php.defaultというファイルがあります。
ファイル名をdatabase.phpと変更して、このファイルの下にデータベースに関する情報を入れるところがありますので、各自変更してあげるようです。
class DATABASE_CONFIG { var $default = array( 'driver' => 'mysql', 'persistent' => false, 'host' => 'localhost', 'login' => 'user', 'password' => 'password', 'database' => 'database_name', 'prefix' => '', ); var $test = array( 'driver' => 'mysql', 'persistent' => false, 'host' => 'localhost', 'login' => 'user', 'password' => 'password', 'database' => 'test_database_name', 'prefix' => '', ); }
$test…というのは、テスト用のデータベースの設定なので、上の$defaultだけ設定すればいいそうです。
今回は一番ユーザーの多いMysqlを元に進めていきますので、変更するところは
・’login’ => ‘user’,
・’password’ => ‘password’,
・’database’ => ‘database_name’,
この3つだけです。各自環境にあわせて変更してください。
変更したら、さきほどのフォルダに再びアップロードします。(私は念のため、database.php.defaultは残しておきました。)
database.phpをconfigフォルダにアップしたら、さっそくWEBページにアクセスしてみます。…どうでしょうか?
一見すると表示に変化はほとんどありませんが、ページ中間に、Cake is able to connect to the database.の記述が出れば接続成功です。
CakePHPを本家サイトからダウンロードすることから始めていきましょう!
CakePHPのインストールは非常に簡単です。公開用のディレクトリにダウンロードしたCakePHPをフォルダごとまとめてアップするだけ。簡単ですね。
まずはCakePHPの公式サイトに行って、ダウンロードボタンをクリックします。
ダウンロードページに行くと、CakePHPのバージョン一覧が出てくる。
ここで注意したいのが、CakePHP 1.3.0-betaのように、数字の後ろに何か付いているものは安定版じゃないそうなので、それ以外のものをダウンロードするとよい。注意するのはそれだけ。私は1.3.5をダウンロードしました。
これがダウンロードした中身。後はこのフォルダの中身を公開ディレクトリにアップロードするだけ
で、アップしたディレクトリに対してブラウザでアクセスしてみます。
すると最上部に早速エラーが出ててきました。
Warning (512): /home/sites/webmin/web/kodomo119/app/tmp/cache/ is not writable [CORE/cake/libs/cache/file.php, line 267]
Warning (512): /home/sites/webmin/web/kodomo119/app/tmp/cache/persistent/ is not writable [CORE/cake/libs/cache/file.php, line 267]
Warning (512): /home/sites/webmin/web/kodomo119/app/tmp/cache/models/ is not writable [CORE/cake/libs/cache/file.php, line 267]
is not writableというのは、書き込み権限に対するエラーですね。
/app/tmp/cache/って書いてあるので、ここのフォルダに書き込み権限が無いといっているわけですね。FFFTPやWinSCPを使って、パーミッションの変更を行います
同様にエラーの出ていた
/home/sites/webmin/web/kodomo119/app/tmp/cache/persistent/
/home/sites/webmin/web/kodomo119/app/tmp/cache/models/
この2つのディレクトリに対してもパーミッション『777』にしてあげたところ、エラーは無事でなくなりましたとさ!
インストールした先はこちら。
もっと大きくしてみたい方はこちらからどうぞ!
先日会社で『フレームワークの本一冊購入したい』と言って、買ってきました。基礎からCakePHPについて説明してくれています。ある一定のPHP+Mysqlのサイト作成経験があればすんなり入っていけます。非常に読み進めやすく、いかにCakePHPが楽しいかを解説してくれていて読んでいて『早くCakePHPでサイト構築したい!』という気持ちになれます