フラグ切り替え処理
ここまでの章でほとんど完成形に近いですが、ここからは細かい機能を実装していきます。
まずは、is_complete カラムに保存されているデータ(真偽値)で表示を管理するように実装していきます。
まずは TodoController の indexAction を次のように編集してください。
public function index(Request $request) { $cond_title = $request->cond_title; if ($cond_title != '') { // 検索されたら検索結果を取得する $todos = Todo::where('title', $cond_title)->get(); } else { // それ以外はすべて取得する $todos = Todo::where('is_complete', 0)->get(); } return view('todo.index', ['todos' => $todos, 'cond_title' => $cond_title]); }
一覧表示では、まだ未完了な物のみ表示をし、完了した物は別ページに表示していきます。
ここでは未完了な物を is_complete == 0
とします。
なので、indexAction では is_complete == 0
の物を取得します。
次に、0と1 つまり完了、未完了のフラグを変更するためのボタンを作成します。
index.blade.php に完了ボタンを追加してください。
<tbody> @foreach($todos as $todo) <tr> <td>{{ $todo->id }}</td> <td>{{ str_limit($todo->title, 100) }}</td> <td>{{ str_limit($todo->space, 100) }}</td> <td>{{ str_limit($todo->deadline, 100) }}</td> <td>{{ str_limit($todo->priority, 100) }}</td> <td> <div> <a href="{{ action('Admin\TodoController@edit', ['id' => $todo->id]) }}">編集</a> </div> <div> <a href="{{ action('Admin\TodoController@delete', ['id' => $todo->id]) }}">削除</a> </div> <div> <a class="mod-btn" href="{{ action('Admin\TodoController@complete', ['id' => $todo->id]) }}">完了</a> </div> </td> </tr> @endforeach </tbody>
これで完了ボタンを押したらcompleteAction に idが渡されるようになります。
completeAction でid を受け取り、 is_complete を 1に変更するという流れです。
completeAction を作成します!
以下、completeAction
public function complete(Request $request) { // 該当するTodo Modelを取得 $todo = Todo::find($request->id); $todo->is_complete = 1; $todo->save(); //dd($todo->is_complete); return redirect('todo/complete_list'); }
Request から受け取った id を持つものの is_complete を 1 に設定して保存しています。
return で返している complete_list.blade.php というページで完了した物は表示しますので、
まずTodoControllerにcomplete_listメソッドを追加します。
public function complete_list() { // 完了フラグがtrueのデータのみ取得 $posts = Todo::where('is_complete',1)->get(); return view('todo.complete_list', ['posts' => $posts]); }
次にview/todo 配下に complete_list.blade.phpという名前で新規作成し、以下の内容を記述してください。
@extends('layouts.layouts') @section('title', '登録済み予定の一覧') @section('content') <div class="container"> <h2>予定完了一覧</h2> <div class="select-menu"> <ul class="sort"> <li><a href="{{ action('TodoController@add') }}" role="button" class="">新規作成</a></li> </ul> </div> <table class="table"> <thead> <tr> <th>ID</th> <th>タイトル</th> <th colspan="2">本文</th> </tr> </thead> <tbody> @foreach($posts as $todo) @if($todo->priority == 5) <tr class="priority-todo"> @endif <td>{{ $todo->id }}</td> <td>{{ str_limit($todo->title, 100) }}</td> <td>{{ str_limit($todo->space, 250) }}</td> <td> <div><a class="mod-btn" href="{{ action('TodoController@incomplete', ['id' => $todo->id]) }}">未完了</a></div> </td> </tr> @endforeach </tbody> </table> </div> @endsection
ここも一覧表示の時と同じように 配列形式で受け取った $posts を foreach を使って順に表示しているだけですね。
次は完了していた物が本当はまだ完了していなかった場合に戻す処理が必要です。
と言っても、先ほどと真逆のことをすればいいだけですね。
TodoControllerに incompleteAction を作成してください。
以下、incompleteAction
public function incomplete(Request $request) { // 該当するTodo Modelを取得 $todo = Todo::find($request->id); $todo->is_complete = 0; $todo->save(); return redirect('todo/'); }
これで内部的な 完了、未完了の切り替え処理はできました。
あとは、Routing を設定します。
web.php に以下を追記してください。
Route::get('todo/complete', 'TodoController@complete'); Route::get('todo/complete_list', 'TodoController@complete_list'); Route::get('todo/incomplete', 'TodoController@incomplete');
ここまでできたらブラウザで確認してみましょう。
一覧ページに表示されているのは、is_complete == 0
のもので、
is_complete == 1
のものは complete_list.blade.php
に表示されているはずです。