第5回ではテストデータの表示までが完了しました。今回はタスクの追加機能を実装します。
実装においては、
入力フォームを作る
まずは入力フォームです。app/
<form action="<?php echo h($html->url('/tasks/add')) ?>" method="post" style="margin-bottom:1em">
<p><?php echo $html->input('Task/content') ?>
<?php echo $html->submit('タスクを追加') ?></p>
</form>
<table>
<tr>
<th>Id</th>
<th>タスク内容</th>
<th>状態</th>
<th>作成日</th>
</tr>
<?php foreach ($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 h($task['Task']['created']) ?></td>
</tr>
<?php } ?>
</table>
見慣れないコードが沢山出てきましたが、
form要素の開始タグと、formTagメソッドにまつわるあれこれ
<form action="<?php echo h($html->url('/tasks/add')) ?>" method="post" style="margin-bottom:1em">
$htmlはHTMLヘルパーのオブジェクトです。読み込むヘルパーをコントローラ内で指定していなければ、
HTMLヘルパーのurlメソッドは、
form要素のaction属性においても同じことが言えますので、
method属性はHTTPのPOSTメソッドで送信することを明示しています。style属性にはフォーム下の表との間隔をとって見栄えを良くするために1文字ぶんのマージン
ここではform要素のaction属性のみHTMLヘルパーで記述しましたが、
form要素の開始タグのみヘルパーで書かれているため、
それでもformTagメソッドを使った方がメリットが大きいと判断されることもあるのですが、
input要素
<p><?php echo $html->input('Task/content', array('size' => '40')) ?>
HTMLヘルパーのinputメソッドは、
ここで先ほどform要素ではWYSIWYGエディタに配慮してacton属性のみをHTMLヘルパーで記述したこととの矛盾を感じたかもしれません。その感覚は確かにその通りで、
しかし表示されないことに変わりはなく、
さらに注意点として、
このため、
無用な混乱を避けるため、
submitボタン
<?php echo $html->submit('タスクを追加') ?></p>
HTMLヘルパーのsubmitメソッドは、
完成した入力フォーム
図1のような画面が表示されたら、

tasksコントローラのaddアクションとして、
<?php
class TasksController extends AppController {
var $name = 'Tasks';
var $uses = array('Task');
function index() {
$this->set('tasks', $this->Task->findAll(null, null, 'Task.created ASC'));
}
function add() {
if (!empty($this->data)) {
if ($this->Task->save($this->data, true, array('content', 'created', 'modified'))) {
$this->flash('タスクが追加されました', '/tasks');
return;
}
}
$this->redirect('/tasks');
}
}
モデルへの値が渡されてきているかチェック
if (!empty($this->data)) {
$this->dataにはモデルへの値が連想配列で格納されています。HTMLヘルパーのinputメソッドで記述されたinput要素の値などがそれにあたります。URLを入力しただけでデータが追加されないように、
モデルへのデータの追加とフィールドのホワイトリスト
if ($this->Task->save($this->data, true, array('content', 'created', 'modified'))) {
モデルのsaveメソッドは、
第二引数はモデルのバリデーション機能を使用するかどうかのフラグです。必須ではなく、
第三引数は、
ここではToDoの内容を格納するcontentカラムと、
createdおよびmodifiedは常に指定しておくとよいでしょう。ちなみに$this->dataにcreatedとmodifiedが存在しても無視されるので、
簡易な完了メッセージ表示
$this->flash('タスクが追加されました', '/tasks');
return;
コントローラのflashメソッドを使うと、
$this->dataに値がないか、saveに失敗したときはリダイレクト
$this->redirect('/tasks');
予期しないリクエストや問題が起きた際はToDo一覧ページへリダイレクトしています。これを最後に書いておかないとaddアクションに対応するビューを表示しようとして、
タスクを追加してみよう
tasksコントローラの書き換えが完了したら、



次回予定はタスクの状態変更の開発です。