[学習 cakePHP #04] postアクションを作ったので投稿可能になった。
前回 #03はGuest Bookの記事一覧と投稿フォームを作ったところで終わりました。今回は投稿フォームからデータを受け取ってデータベースに保存するpostアクションを作ります。
コントローラーにpostアクションを追加。
Boardsコントローラーにpostアクションを追加します。これで投稿できるようになるので多少はGuest Bookっぽくなります。
<?php
class BoardsController extends AppController {
var $name = 'Boards';
function index() {
$this->set("posts", $this->Board->findAll());
}
function post() {
if ($this->data) {
$this->Board->save($this->data);
$this->flash("投稿しました。", "/boards/index");
return;
} else {
$this->redirect("/boards");
}
}
}
?>
indexアクションと比べると行数が多くはなっていますが、それでも全然少ない行数です。
if文の条件式にある「$this->data」はcakePHPのフォームでポストされたらセットされている配列のデータです。dataにデータがセットされているならDBに保存をします。フォームからのポストではないのならリダイレクト処理をしています。
ざっとですがpostアクションを作ってみました。しかし、これだと問題が起きてしまいます。投稿フォームで何も記入せずにpostボタンを押すと空データでも書き込んでしまいます。ここで対策を書くとまた長くなりそうな気がするので後のエントリにて書くことにします。
今回覚えた関数とか。
cakePHP → data, save, flash, redirect
PHP → if ~ else ~
save
Model::save($data = null,
$validate = true,
$fieldList = array())
モデル経由でデータの保存を行います。今回はsave($this->data)とだけしているのでValidateチェックはありで、データは全フィールド保存となっています。例えばtitleだけ保存をしたい場合は、
save($this->data, true, array("title"))
とすればtitleのみ保存されて、名前、本文は保存されません。これは逆に自分で保存するフィールドを指定して置いたほうがいいかもしんないですね。
flash
Controller::flash($message,
$url,
$pause = 1)
flashはなんて言えばいいんだろ?簡易クッションページを作成?今回の場合だとデータの書き込みを行った後に、「投稿しました。」と表示をして指定URIへのリンクを貼ります。
$message、$urlはいいと思いますが$pauseは core.phpの DEBUG設定が 0のときに有効になるようだ。その場合は $pauseにセットした秒数にて自動で指定した $urlに移動します。
redirect
Controller::redirect($url,
$status = null)
指定したURLにリダイレクトします。第一引数に$url。第二引数に$status(ステータスコード)を取ります。$statusは省略可能。ステータスコードは301とか404のあれですよね。
if ~ else ~
if (条件式) {
処理A
} else {
処理B
}
PHPの条件式です。条件式を判定して「真」なら処理Aを。「偽」なら処理Bを実行します。
コメント