A.12. Posts の編集

ここでは投稿の編集画面を作ってみましょう。もう Cake にはずいぶん慣れたのではないでしょうか。パターンをもう見つけたでしょう。アクションを作り、それからビューです。Posts Controller の編集アクションは次のようになります:

例 A.12. /app/controllers/posts_controller.php (edit アクションのみ)

function edit($id = null)
{
    if (empty($this->data))
    {
        $this->Post->id = $id;
        $this->data = $this->Post->read();
    }
    else
    {
        if ($this->Post->save($this->data['Post']))
        {
            $this->flash('投稿を更新しました。','/posts');
        }
    }
}

これは送信されたデータをチェックします。何も送信されていない場合には、投稿を見つけて、それをビューに渡します。もしデータが送信されている場合には、Post model に保存しようとします。(または、バリデーションエラーがある場合には戻らせます。)

edit ビューはこのようになります:

例 A.13. /app/views/posts/edit.thtml

<h1>投稿の編集</h1>
<form method="post" action="<?php echo $html->url('/posts/edit')?>">
    <?php echo $html->hidden('Post/id'); ?>
    <p>
        タイトル:
        <?php echo $html->input('Post/title', array('size' => '40'))?>
        <?php echo $html->tagErrorMsg('Post/title', 'タイトルは必ず入力してください。') ?>
    </p>
    <p>
        本文:
        <?php echo $html->textarea('Post/body', array('rows'=>'10')) ?>
        <?php echo $html->tagErrorMsg('Post/body', '本文は必ず入力してください。') ?>
    </p>
    <p>
        <?php echo $html->submit('保存') ?>
    </p>
</form>

このビューは編集フォームを出力します。(入っていた値も表示されます。)また、必要なエラーメッセージも(もしあれば)表示します。ひとつ注意する点があります: Cake は、もし 'id' フィールドがあって、現在保存されているデータがあれば、それを編集するのだと考えます。もし、'id' が指定されていないなら(add ビューを見返してください。)、save() が呼ばれたとき、Cake は新しいモデルデータを挿入するのだと仮定します。

今度は、 index ビューを更新して、投稿を編集するための編集リンクを追加してみましょう:

Example A.14. /app/views/posts/index.thtml (edit リンクの追加)

<h1>ブログの投稿</h1>
<p><a href="/posts/add">投稿の追加</a></p>
<table>
    <tr>
        <th>Id</th>
        <th>タイトル</th>
        <th>作成日</th>
    </tr>

   <!-- ここで、 $posts 配列のループをまわして、投稿情報を printing out します。 -->

    <?php foreach ($posts as $post): ?>
    <tr>
        <td><?php echo $post['Post']['id']; ?></td>
        <td>
            <?php echo $html->link($post['Post']['title'], '/posts/view/'.$post['Post']['id']);?>
            <?php echo $html->link(
                '削除',
                "/posts/delete/{$post['Post']['id']}",
                null,
                '本当に削除しますか'
            )?>
            <?php echo $html->link('編集', '/posts/edit/'.$post['Post']['id']);?>
        </td>
        </td>
        <td><?php echo $post['Post']['created']; ?></td>
    </tr>
    <?php endforeach; ?>

</table>