この章で完成になります。
もう少し頑張りましょう!
今回は 新規作成した時に設定していた期限で、期限切れを物を判定していきます。
作成時に設定した期限と、現在時刻を比べ、期限がすぎたら違うページに飛ばすというやり方で実装していきます。
まずは、現在時刻を取得しないといけないわけですが、そこで使うのがCarbonとDatatimeになります。
Datatimeについては知っている人が多いと思います。
Carbon というのは日付計算ライブラリで、かなり簡単に日付の計算ができます。
まず、Carbon を使いますと宣言をしなければなりません。
TodoController の冒頭に追記してください。
namespace App\Http\Controllers\Admin; use Illuminate\Http\Request; use App\Http\Controllers\Controller; use App\Todo; use Carbon\Carbon; use DateTime;
dead_listAction を新規作成し、このように実装します。
public function dead_list(Request $request) { // 該当するTodo Modelを取得 $posts = Todo::where([ ['deadline', '<', date("Y-m-d")], ])->get(); return view('todo.dead_list', ['posts' => $posts]); }
次に、search_dead_listAction を新規作成して、以下のように実装しましょう。
public function search_dead_list(Request $request) { $cond_title = $request->cond_title; $posts = Todo::where([ ['deadline', '<', date("Y-m-d")], ['title', 'like' , '%' . $cond_title . '%'] ])->get(); return view('todo.dead_list', ['posts' => $posts]); }
これは期限切れから検索する機能を実装したAction です。
全て検索条件に入れてしまうと、期限切れ出ない物まで検索してしまうので、このように書いています。
$posts = Todo::where([ ['deadline', '<', date("Y-m-d")], ])->get();
ここで期限切れの物をモデルからwhere文を用いて取得しています。
次にview を作成します。
dead_list.blade.php を新規作成し、以下のように実装しましょう。
@extends('layouts.layouts') @section('title', '登録済み予定の一覧') @section('content') <div class="container"> <h2>期限切れ予定一覧</h2> <div> <div> <form action="{{ action('TodoController@search_dead_list') }}" method="post"> <div> <div class="search-box"> <div class="search"> <span>タイトル</span> <input type="text" name="cond_title"> {{ csrf_field() }} <input type="submit" class="search-btn" value="検索"> </div> <ul class="sort"> <li><a href="{{ action('TodoController@add') }}" role="button" class="">新規作成</a></li> </ul> </div> </div> </form> </div> </div> <table class="table"> <thead> <tr> <th>ID</th> <th>タイトル</th> <th colspan="2">本文</th> </tr> </thead> <tbody> @foreach($posts as $todo) <tr> <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> <div> <a href="{{ action('TodoController@delete', ['id' => $todo->id]) }}">削除</a> </div> </td> </tr> @endforeach </tbody> </table> </div> @endsection
これで期限切れの物をdead_list.blade.php で表示するようにしました。
そして一覧表示をしている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) ->orderBy('priority', 'desc') ->get();; } $today = Carbon::today(); return view('todo.index', ['todos' => $todos, 'cond_title' => $cond_title, 'today' => $today]); }
$today = Carbon::today();
ここですね。
ここで本日の日付を入手しています。
これをindex.blade.php に送ります。
index.blade.phpでこの$today と dead_line を比較していきます。
次にindex.blade.php をこのように編集しましょう。
@extends('layouts.layouts') @section('title', 'todos一覧') @section('content') <div class="container"> <div class="row"> <h2>Todos一覧</h2> </div> <div class="row"> <div class="col-md-4"> <a href="{{ action('TodoController@add') }}" role="button" class="btn btn-primary">新規作成</a> </div> <div class="col-md-8"> <form action="{{ action('TodoController@index') }}" method="get"> <div class="form-group row"> <label class="col-md-2">タイトル</label> <div class="col-md-8"> <input type="text" class="form-control" name="cond_title" value="{{ $cond_title }}"> </div> <div class="col-md-2"> {{ csrf_field() }} <input type="submit" class="btn btn-primary" value="検索"> </div> <ul class="sort"> <li><a href="{{ action('TodoController@add') }}" role="button">新規作成</a></li> <li><a href="{{ action('TodoController@sort') }}" role="button">重要度昇順↑</a></li> <li><a href="{{ action('TodoController@index') }}" role="button">重要度降順↓</a></li> </ul> </div> </form> </div> </div> <div class="row"> <div class="list-news col-md-12 mx-auto"> <div class="row"> <table class="table table-dark"> <thead> <tr> <th>ID</th> <th>タイトル</th> <th>場所</th> <th>期限</th> <th colspan="2">重要度</th> </tr> </thead> <tbody> @foreach($todos as $todo) @if (new DateTime($todo->deadline) >= $today) @else <tr class="deadline-todo" > @endif <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('TodoController@edit', ['id' => $todo->id]) }}">編集</a> </div> <div> <a href="{{ action('TodoController@delete', ['id' => $todo->id]) }}">削除</a> </div> <div> <a class="mod-btn" href="{{ action('TodoController@complete', ['id' => $todo->id]) }}">完了</a> </div> </td> </tr> @endforeach </tbody> </table> </div> </div> </div> </div> @endsection
@if (new DateTime($todo->deadline) >= $today) @else <tr class="deadline-todo" > @endif
ここです。
ここで、if文を使ってdead_line と $today を比べていますね。
期限切れの物は色を変えています。
ここまでできたらRouting の設定していきましょう。
web.php を以下のように実装してください。
Route::group(['middleware' => 'auth'], function() { Route::get('todo/create', 'TodoController@add'); Route::post('todo/create', 'TodoController@create'); //追記 Route::get('todo', 'TodoController@index'); // 追記 Route::get('todo/edit', 'TodoController@edit'); // 追記 Route::post('todo/edit', 'TodoController@update'); // 追記 Route::get('todo/delete', 'TodoController@delete'); Route::get('todo/complete', 'TodoController@complete'); Route::get('todo/complete_list', 'TodoController@complete_list'); Route::get('todo/incomplete', 'TodoController@incomplete'); Route::get('todo/sort', 'TodoController@sort'); Route::get('todo/dead_list', 'TodoController@dead_list'); Route::post('todo/dead_list', 'TodoController@search_dead_list'); });
期限切れの物がdead_list.blade.php に表示され、index.blade.php で色が変わっているか確認してみましょう。
ここまでで簡単なアプリケーションを作る昨日の実装はあらかた網羅しました。
日付のところに関してはいろんなやり方があり、もっとスマートなコードでかける!
と思ったらこの書き方以外にも実装してみてください。
laravel はとても多様性のあるフレームワークなので、使えるようになっておきましょう!