CakePHPで高速Webアプリ開発

第7回 CakePHPで作るToDoアプリ(3)

この記事を読むのに必要な時間:およそ 4.5 分

修正内容の解説:コントローラ編

以上でタスクの完了,編集,削除,完了未完了の分離機能が実装できました。上記修正内容を読み解いていきます。

indexアクション:ステータスを指定してタスクを取得する

  function 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'));
  }

findAllBy[フィールド名]メソッドによってstatusフィールドの値を指定してレコードを取得しています。

doneアクション:タスクを完了する

タスクの完了は「完了」リンクをクリックしてdoneアクションにアクセスし,タスクを完了します。

  function done($id) { 

アクションの定義に引数を設定すると「http://example.com/~gihyo/todo/tasks/done/1」のようなURLからパラメータを受け取ることができます。

    if ($this->Task->findById($id)) {
      $this->Task->id = $id;
      $this->Task->save(array('status' => 'done'));
    }

このブロックでは,引数で渡されてきたidのタスクの存在を確認し,statusフィールドの値をdoneに変更しています。データを更新するときは$this->Task->idに更新したいデータのidを代入した後にsaveします。

    $this->redirect('/tasks');

タスクの完了画面は出さずに即座にタスク一覧に戻すため,redirectしています。

editアクション:編集画面の表示と編集内容の保存を行う

editアクションは少々複雑で,編集画面の表示と保存を兼ね備えています。

  function edit($id) {
    $task = $this->Task->findById($id);
    if (!$task) {
      $this->redirect('/tasks');
      return;
    }

引数で渡されてきたidでデータ取得を試みて,$taskに代入します。結果がfalseであればデータが存在しないので一覧表示へリダイレクトします。

    if (!empty($this->data)) {
      $task['Task']['content'] = $this->data['Task']['content'];
      $this->Task->save($task);
    }

データの存在チェックが通り,$this->dataのチェックでデータがPOSTされてきたときは,先ほど取得したデータのcontentフィールドを書き換えてsaveします。

    $this->set('task', $task);

最後にビューへTaskモデルのデータを渡して終了です。

delアクション:タスクを削除する

delアクションはタスクを削除し,一覧表示へリダイレクトします。

  function del($id) {
    $this->Task->del($id);
    $this->redirect('/tasks');
  }

データの削除はモデルのdelメソッドにidを渡すことで行います。

ちなみにここではあえてデータの存在チェックを行っていません。削除行為自体はデータがあってもなくても行えるため,とくにエラー表示をしないのであれば不要だからです。

著者プロフィール

秋田真宏(あきたまさひろ)

株式会社ロケットスタート エンジニア。個人ブログは「akiyan.com」。1981年生まれ。

URLhttp://www.akiyan.com/

著書