閲覧総計:2810 (本日:1 昨日:0)
CakePHPの入門者トレーニングとして、gihyo.jpサイトの「CakePHPで高速Webアプリ開発」
がすばらしい。しかし、このサンプル例題はCakePHP1.1で解説されている為、CakePHP1.2
では少し異なるコード表現になりそうな所がある。
サンプル例題「ToDoアプリ」をCakePHP1.2でトレースしてみた。 09/01/02
【目次】(項目をクリックすると、そこに飛べます)
(原典)http://gihyo.jp/dev/serial/01/cakephp/0006?page=1
tasks_controller.phpのindexアクションの修正とdone, edit, delアクションの追加。
/cakephp/app/controllers/tasks_controller.php
<?php // app/controllers/tasks_controller.php class TasksController extends AppController { //AppControllerを継承 var $name = 'Tasks'; //controller名を定義(頭が大文字を覚える) var $uses = array('Task'); //使用するmodel名を定義 function index() { //indexアクションの定義 $this->set('yet_tasks', $this->Task->findAllByStatus('yet', null, 'Task.created ASC')); $this->set('done_tasks', $this->Task->findAllByStatus('done', null, 'Task.modified DESC')); } function add() { if (!empty($this->data)) { //モデルへの値が渡されてきているかチェック if ($this->Task->save($this->data, true, array('content', 'created', 'modified'))) { //DBへのレコード追加、saveの第3引数でホワイトリスト設定をした $this->flash('タスクが追加されました', '/tasks'); //flashで簡易な完了メッセージ表示 return; } } $this->redirect('/tasks'); //$this->dataに値がないか,saveに失敗したときはtasksへリダイレクト } function done($id) { if ($this->Task->findById($id)) { $this->Task->id = $id; $this->Task->save(array('status' => 'done')); } $this->redirect('/tasks'); } function edit($id) { $task = $this->Task->findById($id); if (!$task) { $this->redirect('/tasks'); return; } if (!empty($this->data)) { $task['Task']['content'] = $this->data['Task']['content']; $this->Task->save($task); $this->redirect('/tasks'); //saveが完了したらtasksへリダイレクト } $this->set('task', $task); } function del($id) { $this->Task->del($id); $this->redirect('/tasks'); } }
index.ctpを修正します。
/cakephp/app/views/tasks/index.ctp
<form action="<?php echo h($html->url('/tasks/add')) ?>" method="post" style="margin-bottom:1em"> <p><?php echo $form->input('Task.content', array('type'=>"text", 'label'=>"")) ?> <?php echo $form->submit('タスクを追加') ?></p> </form> <h2>未完了タスク</h2> <table> <tr> <th>Id</th> <th>タスク内容</th> <th>状態</th> <th>操作</th> <th>作成日</th> </tr> <?php foreach ($yet_tasks as $task) { ?> <tr> <td><?php echo h($task['Task']['id']) ?></td> <td><?php echo h($task['Task']['content']) ?></td> <td><?php echo h($task['Task']['status']) ?></td> <td> <?php echo $html->link('完了', '/tasks/done/' . $task['Task']['id'], null, '完了してもよろしいで すか?') ?> <?php echo $html->link('編集', '/tasks/edit/' . $task['Task']['id']) ?> <?php echo $html->link('削除', '/tasks/del/' . $task['Task']['id'], null, '削除してもよろしい ですか?') ?> </td> <td><?php echo h($task['Task']['created']) ?></td> </tr> <?php } ?> </table> <h2>完了タスク</h2> <table> <tr> <th>Id</th> <th>タスク内容</th> <th>状態</th> <th>操作</th> <th>作成日</th> </tr> <?php foreach ($done_tasks as $task) { ?> <tr> <td><?php echo h($task['Task']['id']) ?></td> <td><?php echo h($task['Task']['content']) ?></td> <td><?php echo h($task['Task']['status']) ?></td> <td><?php echo $html->link('削除', '/tasks/del/' . $task['Task']['id'], null, '削除してもよろしい ですか?') ?></td> <td><?php echo h($task['Task']['created']) ?></td> </tr> <?php } ?> </table>
edit.ctpを作成します。
/cakephp/app/views/tasks/edit.ctp
<h1>タスクの編集</h1> <p><a href="<?php echo h($html->url('/tasks')); ?>">タスク一覧へ戻る</a></p> <form action="<?php echo h($html->url('/tasks/edit/' . $task['Task']['id'])) ?>" method="post"> <?php echo $form->hidden('Task.id', array('value' => $task['Task']['id'])) ?> <h2>内容</h2> <p><?php echo $form->textarea('Task.content', array('cols' => '60', 'rows' => '3', 'value' => $task['Task']['content'])) ?></p> <p><input type="submit" value="保存"></p> </form>
●CakePHP1.2では、<form>タグ周りのメソッドがHtmlヘルパーから、新設のFormヘルパー
に移動となり、書式も少し変更になっています。
<1.1書式>
<form action="<?php echo h($html->url('/tasks/edit/' . $task['Task']['id'])) ?>" method="post"> <?php echo $html->hidden('Task/id', $task['Task']['id']) ?> <h2>内容</h2> <p><?php echo $html->textarea('Task/content', array('cols' => '60', 'rows' => '3', 'value' => $task['Task']['content'])) ?></p> <p><input type="submit" value="保存"></p> </form>
<1.2書式>
<form action="<?php echo h($html->url('/tasks/edit/' . $task['Task']['id'])) ?>" method="post"> <?php echo $form->hidden('Task.id', array('value' => $task['Task']['id'])) ?> <h2>内容</h2> <p><?php echo $form->textarea('Task.content', array('cols' => '60', 'rows' => '3', 'value' => $task['Task']['content'])) ?></p> <p><input type="submit" value="保存"></p> </form>
(原典)http://gihyo.jp/dev/serial/01/cakephp/0006?page=3