ここでは投稿の編集画面を作ってみましょう。もう 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>