1.CakePHPで作る掲示板の構成を考える

1.とりあえず掲示板の構成

項目:題名/名前/コメント/日付
動き:レス無し/削除なし/編集なし

初めてだし、とっても簡単にしてみた
そして開発の順序

1. データベースにテーブル作る
2. モデルとやらを作る
3. コントローラとやらを作る
4. ビューとやらを作る
5. 完成star.gif

らしい…

CakePHPはMVCという構成でできてる…意味わかんないけども。

M はモデル
V はビュー
C はコントローラ

意味は…いろんなところを見る限り…

1.モデルとは…
 データベースを指定して定義してやるやつ
2.ビューとは…
 表示するやつ
3.コントローラ
 いろんな動きをプログラミングしてやるやつ

みたいなイメージ。あくまでイメージ。だからあってるかどうかはこれから作りながら確認

そんで…それぞれ名前を付ける法則が全部決まってるらしい。
その法則でこのモデルではこのデータベース使うよとか、コントローラ使うよとか
内部で動くみたいなので、名前はきっちり付けなくちゃいけないみたい。

命名についてはそれぞれ作るときに確認しながら作るですよkusyami01.gif




2.データベースを作る

2.データベースを作る

CakePHPでデータベースも作れるのかと…勘違いhatena02.gif

テーブル自体はCakePHPでは作れないようなので…
普通にphpmyadminで作成することにします

enpitu02.gif ここでテーブル名の命名規則

1. なるべく英単語を使う。
2. テーブル名は複数形で。
3. 単語の区切りはアンダーバー(_)を使う。複数形になるのは最後尾の単語のみ

で…複数形は「s」を付けるだけじゃダメできちんとした複数形でなくてはいけないです

なので、今回はbbsと付けたかったんですが、複数形が分からない(英語苦手)のでboardの複数形「boards」という名前のテーブルを作成します。

enpitu02.gif フィールド名の命名規則

フィールド名は自由に付けれるようですが以下のような便利な命名規則があります。めんどいけども…naku01.gif

全部小文字の英語で…

id
主キーとして扱われる

created
レコードの作成日時 (初期値Nullにすること)
updated,modified
レコードの修正日時 (初期値Nullにすること)

psword,passwd, password
パスワードとして認識される

title,name
リスト表示で見出しとして使用される

以上をふまえて、こんなSQLでテーブルを作りました

CREATE TABLE `boards` (
   `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
   `title` VARCHAR( 50 ) NOT NULL ,
   `contributor` VARCHAR( 50 ) NOT NULL ,
   `comment` TEXT NOT NULL ,
   `created` TIMESTAMP NOT NULL
) ENGINE = MYISAM ;

内容はすっごくシンプルに
id が主キーで、titleは題名、contributorは投稿者、commentがコメント、createdが投稿日
のテーブルです

さて。次からようやくCakePHPを使っていくのかな。モデルとやらにとりかかります。

CakePHPのテーブル作成/参照URL
http://book.cakephp.org/ja/view/68/Creating-Database-Tables




3.モデルを作る

ここからが未知の世界…hatena03.gif

モデルとやらを作ります。
まずまずモデルの命名規則と、どこに作ったらいいか。。

app/models/テーブル名の単数形.php

としなければいけないようです。
なので、今回作ったテーブルは「boards」なんで、

app/models/ ディレクトリ内に、

app/models/board.php

を作成します

中身はというと…

<?php
class モデルの名前の最初を大文字にしたやつ extends AppModel {
   var $name = 'モデルの名前の最初を大文字にしたやつ';
}
?>

になるそうなので

■app/models/board.php■

<?php
class Board extends AppModel {
   var $name = 'Board';
}
?>

としました




4.コントローラを作る#1コントローラって何?

4.コントローラを作る#1コントローラって何?

ここまでで…テーブルができた。モデルができてテーブル指定した。次はコントローラ。

コントローラってのは…
動きを設定するらしいので、多分動きのキモになる分かと予想。

参照URL:CakePHPマニュアル:コントローラ

で。命名規則と作る場所は…

/app/controllers/テーブル名の複数形小文字_controller.php

になるらしいので

/app/controllers/boards_controller.php

としました

で中身

<?php
class クラス名 extends AppController
{
   //・・・・いろんな処理
}
?>

【クラス名の命名規則】
1.大文字で始める
2.複数形で指定して「Controller」を末尾につける

となるようなので…

■/app/controllers/boards_controller.php■

<?php
class BoardsController extends AppController
{
   //・・・・いろんな処理
}
?>

とクラス名をつけてあげます

で…やりたいことは掲示板だし

・書き込み
・一覧を見せる

とりあえずこの2点。まぁ、他にも編集とか削除とか色々あるけども今はとりあえずシンプルにこの2点

次に続きますw01.gif




4.コントローラを作る#2コントローラの中身

4.コントローラを作る#2コントローラの中身

とりあえず

<?php
class BoardsController extends AppController
{
・・・・いろんな処理
}
?>

のいろんな処理の所を作っていきます
いろんなサイトを調べたら

var $name = “なんとか”;
var $uses = array(”なんとか”);

てのを必ず入れているようです…調べたら

$nameはphp4で現在のクラス名をきちんと返してくれない時に指定しましょう
$usesはモデル名を指定しましょう(ただしきちんとクラス名を「名前複数形+Controller」にしていれば自動的にモデルを読み込む)
[array]を使ってるんでもちろん、配列として扱ってくれるので複数OK

とのことなんで…「php5の環境下で動かす」&「名前はきっちりつけた」&「使うモデルは1個」の今回の場合は無くてもいいような気がするんですがおまじない的に付けてみるですよ

なんで…

<?php
class BoardsController extends AppController
{
var $name = "Boards";
var $uses = array("Board");
}
?>

としました

ここまではただ変数を指定してあげただけなんで、これから本題の動き(アクション)を作っていきます

アクションはfunctionで作っていってあげるようなので、今回やりたい「書き込む(write)と見る(view)」を作るんですが…

ここで名前のつけかた

function hogehoge(){
  いろんな作業
}

「hogehoge.ctp」というビュー(後で作る)を作ることでそのアクションが呼び出される

ということなんで、一番最初はやっぱり一覧表示よねheart02.gifということで、閲覧表示は「view」ではなくて「index」で作ることにします

なんでこんな骨組みを作りました

■/app/controllers/boards_controller.php■編集

<?php
class BoardsController extends AppController
{
   var $name = "Boards";
   var $uses = array("Board");

   function index(){
      //表示するのよ
   }
   function write(){
      //書き込むのよ
   }
}
?>

続きます




4.コントローラを作る#3表示用のアクションを作る

4.コントローラを作る#3表示用のアクションを作る

そんでもってアクションを作るんですがここからがCakePHPの本領発揮というか、便利な関数がたくさんあるようです

参照URL:CakePHPマニュアル:ビューとの連携
参照URL:CakePHPマニュアル:CakePHPブログチュートリアル»Postsコントローラの作成

とてもよく使われているのが

set($var, $value);
$valueの値を$varに変数として入れてくれる
中身は配列でもなんでもOK

ってことなので…

今回は、テーブルの値(配列)を全て変数に放り込みたいですのでコレ使います。ってか、ビューにデータを渡すのは基本的にはコレみたい

そんで…テーブルの値をとってくるのは

findAll($conditions,$fields,$order,$limit,$page,$recursive)
$conditions:配列そのものまたはwhere文
$fields:フィールド
$order:並び
$limit:読む数
$page:読むページ数
$recursive:モデルのアソシエーションを何階層表示するか(??)
参考URL:http://sandman.s6.xrea.com/nucleus/item-72.html
findAllは1.2から非推奨となっています。代わりにfind('all')を使います
参照URL:CakePHPマニュアル:findAll

を使います。はっきり言って最後の変数とか意味不明だけども

で。$board って変数に、テーブルboardの値全部を放り込むから…
テーブルboardの値全部は全部だから変数指定しないで

$this->Board->findl('all');

それを変数に放り込むから

$this->set("boards",$this->Board->findl('all'));

結果…
■/app/controllers/boards_controller.php■編集

<?php
class BoardsController extends AppController
{
   var $name ="Boards";
   var $uses = array("Board");

   function index(){
      $this->set("boards",$this->Board->find('all'));
   }
   function write(){
      //書き込むのよ
   }
}
?>

としました。。。こんだけ?こんだけです。w03.gif

で。書き込みのアクションを作ってみたいんですが…

どんな風にデータが受け渡されて表示されるかを見てみたいんでここでとりあえずいったんビューに行きますですkira01.gif

続きます




4.コントローラを作る#4表示用のビューを作る

4.コントローラを作る#4表示用のビューを作る

ちょっと寄り道で…ビューを作ってみますfutaba.gif
ビューを作る前にテーブルにデータがなければもちろんデータ表示されませんので、直接DBの方から5個くらい適当にテーブルにデータを追加しました。
文字コードはUTF-8を使ってます

で。先ほど作ったコントローラで表示用のアクションは

function index()

としたので表示用のビューの名前は

index.ctp

とします。場所は/app/views内にディレクトリを作って置くようになるので

/app/views/boards/index.ctp

としました

中身はただ単にタイトルを表示させるだけ…なんで
■/app/views/boards/index.ctp■

<?php
foreach ($boards as $board) {
   echo $board["Board"]["id"].":".$board["Board"]["title"]."/".$board["Board"]["contributor"]."<br>";
   echo $board["Board"]["comment"]."<br><hr>";
}
?>

として(ビューの作り方はまた後で復習)

http://cake.chorochoro.com/boards
(表示するには…名前/アクション名 となるので、ホントのアドレスはhttp://cake.chorochoro.com/boards/index です~)

に接続したら見事に表示されました

がっ!…表示したら見事に文字化け!!「????」になってます
テーブルもUTF-8だし、php自体もUTF-8だし出力もUTF-8なのに何故…

調べたところ、インストールの際に設定したapp/config/database.phpに

'encoding' => 'utf8'

を追加すればいいらしい…ということで末尾に追加したところ、きちんと表示されました

viewtest

参考URL:http://www.syuhari.jp/blog/archives/141

すごいです。書いてるのはほとんど1行、2行の話なのに簡単にできてしまった…w03.gif




4.コントローラを作る#5投稿用コントローラ

4.コントローラを作る#5投稿用コントローラ

ちょっと寄り道しちゃいましたが…
ビューできちんと表示されるのを確認できてうれしい気分です

またコントローラに戻って…

次は投稿用のアクションを書いていくんですが、あくまで投稿ボタンを押したときの動きということになるので本当はビューから作った方が良いような気もします

が、ここではやっぱりアクションを考えます

先ほどとは違って、ビューにデータを渡すわけではなくて、ビューのフォームからデータをもらうわけですが…

なんだかとっても簡単みたい…

$this->Model->save($this->data);

こんだけ?こんだけ。
だから…

$this->Board->save($this->data);

にすればとりあえず、ごそっと登録してくれる。

でもこのやり方は「危険なので必要なパラメータのみsaveしましょう」という記事があった
参考URL:http://www.a24loveweb.net/cake/save%E6%99%82%E3%81%AE%E6%B3%A8%E6%84%8F%E7%82%B9/
その記事によると

$data = array();
$data["name"] = $this->data["Model"]["name"];
$this->Model->save($data);

という風にしましょうということなので…

$data = array();
$data["title"] = $this->data["Board"]["title"];
$data["contributor"] = $this->data["Board"]["contributor"];
$data["comment"] = $this->data["Board"]["comment"];
$this->Board->save($data);

としてみました

のでコントローラはこうなりました
■/app/controllers/boards_controller.php■編集

<?php
class BoardsController extends AppController
{
   var $name = "Boards";
   var $uses = array("Board");

   function index(){
      $this->set("boards",$this->Board->find('all'));
   }
   function write(){
      $data = array();
      $data["title"] = $this->data["Board"]["title"];
      $data["contributor"] = $this->data["Board"]["contributor"];
      $data["comment"] = $this->data["Board"]["comment"];
      $this->Board->save($data);
   }
}
?>

これはあくまで投稿用→保存用の動作を設定しただけなんで、続けて投稿用のフォームを作ります

次からビューをきちんと見ることにしますonegai03t.gif




5.ビューを作る#1基本

5.ビューを作る

ビューはチラッと作りましたが基本hana05.gif

/app/views/小文字名前の複数形/コントローラのfunction名.ctp

となります
うちの場合で行くとコントローラには「index()」と「write()」があるんで

app/views/boards/index.ctp
app/views/boards/write.ctp

の2つを作ります。

そんで…いくら作ったって見えなきゃ意味無いんで呼び出す時は

http://hogehoge/cakeディレクトリ/名前/function名

になります。うちの場合…

一覧を呼び出す時
http://cake.chorochoro.com/boards
または
http://cake.chorochoro.com/boards/index
書き込みフォームを表示するとき
http://cake.chorochoro.com/boards/write

になります

一覧用はさっき作ったんですが、ビューにテーブルの値を渡す方法を次でまとめてみたいと思います




5.ビューを作る#2渡されたデータを表示する

5.ビューを作る#2渡されたデータを表示する

ビューの拡張子は「.ctp」なんですが中身は普通にphpで書くことができます

データは「4.コントローラを作る#3表示用のアクションを作る」で$boardsって変数に入ってビューに渡されてきていますので、ただそれを表示させるphpを書けばすみます

ここではごそっと配列に入れましたので

foreachを使ってとにかく全部echoで表示させます

<?php
foreach ($boards as $board) {
   echo $board["Board"]["id"].":".$board["Board"]["title"]."<br>";
   echo $board["Board"]["comment"]."<br><hr>";
}
?>

◆覚書◆
$名前["テーブル名"]["フィールド名"]
でテーブルの値をひっぱってくれるようです
これは配列とか関係なくなのかどうかちょっとわかんないので留保

こうすると表示される画面は
viewtest
こうなります

確かに表示されてるんですが、画面がCakePHPのものになってます(ヘッダとかSQL文が表示されたりとか)
なので次はこれらを自分専用にカスタマイズしてみたいと思います




AUTHOR

  • footerWrite up a little something about yourself here. Something short and sweet, or longer if you'd like.

FLICKR

  • add flickr code here, or delete this and use the widget version.

TWEETS

  • add twitter code here, or delete this and use the widget version.

Pets