zerosp.blog > PHP > 2008/05/29 22:27 >

[学習 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のフラグを立てます。

投稿日 2008-05-29 22:27

当サイトのコメントとトラックバックの扱いについて。

スパム対策のため認証制となっています。受け取ったコメント、トラックバックは一旦保留扱いとなり管理人が許可したものだけ表示されます。

トラックバック

  • [学習 cakePHP #07] 投稿記事編集のeditアクションを作る。のトラックバックURL

コメント

コメントフォーム