それでは、続きを実装していきます。
まずはモデル(DB)から未完了のタスクを取得します。
未完了のタスクとは、tasksテーブルのstatusが0のレコードをさします。
それではコントローラーから追記します。
なお、すでに記述済みの場所もありますので、しっかりコードを確認してください。
(同じコードを2回書かないように)
// app/Controller/TasksController.php public function index() { $options = array( 'conditions' => array( 'Task.status' => 0 ) ); // 検索 $tasks_data = $this->Task->find('all', $options); // 変数をビューへ渡す $this->set('tasks_data', $tasks_data); // app/View/Tasks/index.ctpを表示 $this->render('index'); }
まずは下記の$optionsですが、これは検索条件を指定しています。
Taskモデル(tasksテーブル)のstatusが0のもの、という条件です。
// データをモデルから取得してビューに渡す $options = array( 'conditions' => array( 'Task.status' => 0 ) );
最終的には、DBから値を取得するメソッドを使い、下記のSQLを実行しようとしています。
SELECT * FROM `tasks` WHERE `status` = 0;
このSQLを実行するために、PDOでは面倒な定義付けを行う必要があります。
しかし、CakePHPでは以下のコマンドでOKです。
$tasks_data = $this->Task->find('all', $options);
このfindメソッドがキモです。
よく分からない->記号がありますが、これはよく使います。
なんとなくこんな感じで覚えてください。
$this: このコントローラー
Task: Taskモデル(tasksテーブル)
find: 見つけてこい
つまり、
$this->Task->find();
// このコントローラーからTaskモデルに指定のレコードを見つけてくるよう指示をだしました
このような感覚で良いと思います。
findの引数allは全て、$optionsで追加の条件を指定しています。
findはかなり用途が広いので、使うとき使うときに下記のドキュメントなどを参考にしてみてください。
CakePHP公式ドキュメント -find-
これで$tasks_dataに値が入りました。
ビューに一覧を表示
新しくビューを作ったので、一覧を表示するコードを記載していく必要があります。
<!-- app/View/Tasks/index.ctp --> <?php // Htmlヘルパーを使い、<a>タグ(リンク)を生成する ?> <?php echo $this->Html->link('新規タスク', '/Tasks/create'); ?> <?php // コントローラーから渡された$tasks_dataを表示する ?> <h3><?php echo count($tasks_data); ?>件のタスクが未完了です</h3> <table> <tr> <th>ID</th> <th>名前</th> <th>期限日</th> <th>作成日</th> <th>操作</th> </tr> <?php foreach($tasks_data as $row): ?> <tr> <td><?php echo $this->Html->link($row['Task']['id'], '/Tasks/view/' . $row['Task']['id']); ?></td> <td><?php echo h($row['Task']['name']); ?></td> <td><?php echo h($row['Task']['due_date']); ?></td> <td><?php echo h($row['Task']['created']); ?></td> <td><?php echo $this->Html->link('このタスクを完了する', '/Tasks/done/' . $row['Task']['id']); ?></td> </tr> <?php endforeach; ?> </table>
foreachはPHPの研修で学習したと思うので、割愛します。 $rowは連想配列になっているので、キーを['Task'](Taskモデルから)、['id'](対象のカラムの値)と指定してあげる必要があります。 この$tasks_dataに何が入っているか確認したい場合は、viewの適当な場所に、以下のコードを打ち込むと入っている内容を見ることができます。
<?php var_dump($tasks_data); ?>
はじめは何がなんだか分からないと思いますが、慣れてくるとこのコマンドでエラーを解消する活路を見出すことができます。
完了したタスクを非表示にする
現状だと、「タスクを完了する」リンクを押しても何も起きないと思います。
そのため、タスクが完了したら、ボタンを押し、一覧に表示させないようにしましょう。
findメソッドで引っ張ってくるときに、完了したタスクを外す。
つまり、tasksテーブルのstatusを1にupdateしてしまいます。
これをdoneアクションに追記します。
public function done() { // URLの末尾からタスクのIDを取得してメッセージを作成 $id = $this->request->pass[0]; $this->Task->id = $id; $this->Task->saveField('status', 1); $msg = sprintf( 'タスク %s を完了しました。', $id ); // indexへリダイレクト $this->redirect(['controller'=>'tasks','action'=>'index']); return; }
まずは、対象のタスクのidを取得します。
// このコントローラーはGETで渡されたIDを取得する $id = $this->request->pass[0]; // Taskモデルのidを取得した$idに指定 $this->Task->id = $id; // saveFieldメソッドでTaskモデルの対象カラムのレコードを修正する $this->Task->saveField('status', 1);
これでtasksテーブルのstatusが変更されます。
実際にボタンを押して見ると、完了したタスクが消えているのが分かります。
上記メソッドについて詳しく知りたい方は下記の資料をご参考ください。
CakePHP公式ドキュメント -request-
CakePHP公式ドキュメント -saveField-
Flashを有効にする
タスクが完了したら、「タスクが完了しました」と表示するようにしましょう。
「Flash」という Component を使用します。
Componentとは、ある機能を一まとめにしたものです。
まずはFlashComponentとFlashHelperを使えるようにしましょう。
Flashを使用出来るようにするためには、2つとも必要になります。
<?php // app/Controller/TasksController.php class TasksController extends AppController { public $components = array('Flash'); public $helpers = array('Flash'); // 以下、省略
タスクを完了した際に表示させたいメッセージをセットします。
public function done() { // URLの末尾からタスクのIDを取得してメッセージを作成 $id = $this->request->pass[0]; $this->Task->id = $id; $this->Task->saveField('status', 1); $msg = sprintf('タスク %s を完了しました。', $id); // Flashをセット $this->Flash->set($msg); // indexへリダイレクト $this->redirect(['controller'=>'tasks','action'=>'index']); }
Views/Layouts/default.ctpの中で、表示させるロジックが既に組まれているので、表示させる方は特にいじる必要はありません。