各種機能追加3

この章で完成になります。

もう少し頑張りましょう!

今回は 新規作成した時に設定していた期限で、期限切れを物を判定していきます。

作成時に設定した期限と、現在時刻を比べ、期限がすぎたら違うページに飛ばすというやり方で実装していきます。

まずは、現在時刻を取得しないといけないわけですが、そこで使うのが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 はとても多様性のあるフレームワークなので、使えるようになっておきましょう!

カテゴリー

アーカイブ

Close Bitnami banner
Bitnami