[学習 cakePHP #07] 投稿記事編集のeditアクションを作る。
久しぶりにパズルゲームの数独にはまってしまいcakePHPはご無沙汰になってしまいました。パズルゲームは1度やり始めると止め時が分からなくなっちゃう・・・。
さてPHPとcakePHPを勉強しながらのGuest Book作成。前回はpostアクションまで作成したので、今回は投稿した記事を編集するeditアクションの作成をします。
コントローラーにeditアクションを追加。
editアクションの大まか処理は、1つが記事のeditリンクをクリックしてフォームと共に記事を表示する。もう1つがフォームから編集されたデータを受け取るです。それらを踏まえた上でざっと流れを考えてみると、
- editリンクからのクリックである。
- DBから該当記事番号の記事を読み込んでフォームと一緒に表示。
- フォームからの編集postである。
- 編集する該当記事をDBから読み込み。
- 読み込んだ記事のパスワードと編集フォームのパスワードの照合チェック。
- パスチェックがOKなら編集したものを保存。NGならエラー表示へ。
こんな感じでコードを考えてみた。結構悩んだ挙句にできあがったコードは次のようになった。
function edit($id = null) {
if (empty($this->data)) {
$this->Board->id = $id;
$this->data = $this->Board->read(array("id", "title", "name", "body"));
return;
} else {
$this->Board->id = $this->data["Board"]["id"];
$tmp_data = $this->Board->read("pwd");
if ($this->data["Board"]["pwd"] == $tmp_data["Board"]["pwd"]) {
$this->Board->save($this->data);
$this->flash("編集しました。", "/boards/index", 1);
exit;
} else {
$this->Board->invalidate("pwd");
$this->render();
exit;
}
}
$this->redirect("/boards");
}
DBからの読み込み関数に find、read、findBy○○などがありますが普通にread関数を使用。
ちょっとつまずいた箇所は、パスワードエラーのビューを表示するときに最初はrenderのあとでexitを書いてませんでした。そうしたら Warning: Cannot modify header information - headers alreadyというエラーがでて悩んだんだけど、header何たらとあったのでひょっとしてheaderを2度書きでもしてる?と試しにexit入れてみたら解決しました。
もう1つは編集フォームを読み込むときに、元の名前、タイトル、本文は表示しても良いんだけど、パスワード表示しちゃうと誰でも編集できちゃう。読み込むフィールドの指定すればいいと気がつくのが遅かった・・・。
この悩んだのは2箇所くらいかな。
対応するビュー(edit.thtml)は。
<div id="form">
<p id="fheader">メッセージフォーム</p>
<form method="post" action="<?php echo $html->url("/boards/edit") ?>">
<dl>
<dt>タイトル : </dt>
<dd><?php echo $html->input("Board/title", array("size" => "35")) ?></dd>
<dt>名前 : </dt>
<dd><?php echo $html->input("Board/name", array("size" => "35")) ?></dd>
<dt>本文 : </dt>
<dd><?php echo $html->textarea("Board/body", array("rows" => "5", "cols" => "50")) ?></dd>
<dt>パスワード : </dt>
<dd><?php echo $html->input("Board/pwd", array("size" => "8", "type" => "password")) ?>
<?php echo $html->tagErrorMsg("Board/pwd", "パスワードが違います。") ?></dd>
</dl>
<p><?php echo $html->hidden("Board/id") ?>
<?php echo $html->submit("post", array("class" => "sb")) ?></p>
</form>
</div>
<p><?php echo $html->link("back to index", "/boards") ?></p>
今回はこんな感じです。
今回覚えた関数とか。
cakePHP → read、find、findBy○○、invalidate
PHP → 特になし。
read
Model::read($fields = null,
$id = null)
IDを指定してDBからデータを読み込みます。2番目の引数にIDをセットするか、事前に $this->Board->idのようにセットすれば良いようだ。取得したいフィールドを指定する場合は1つ指定の場合は read("name")のように、2つ以上の場合は read(array("name","title"))のようにarrayで指定する。IDで指定するので返ってくるデータは1個のみ。
find
Model::find($conditions = null,
$fields = array(),
$order = null,
$recursive = null)
$conditionsで指定した条件に基づいてデータを読み込む。複数のデータがマッチした場合は最初にマッチしたデータが返ってくる。$fieldsを指定する場合は1つのみならarrayじゃなくてもOK。
findBy○○
Model::findlBy○○($value);
○○でフィールド名を指定。$valueで条件を指定。こちらも複数データマッチの場合は最初のデータが返ってくる。チュートリアルには引数は$valueしかなかったんだけど、findByname("tanaka", array("id", "name")); とやってみたところ取得fieldsの指定はできました。
invalidate
Model::invalidate($field,
$value = true)
$filedにValidateチェックNGのフラグを立てます。
コメント