副業におすすめなサイトを見る→

Docker×Laravel8もくもく会のアプリ作成6(一覧画面の作成③)

アプリリリースのお知らせ

予定を探すアプリyoteipickerをリリースしました。

アプリの利用用途:暇だから何か予定入れたいけど今週の土日は何しようかな〜?ってときに使えるアプリです。

Dockerk×Laravel8でもくもく会アプリ作成の一覧画面編パート3です。

前回の記事の続きになるため、以下の記事が前提となります。

>>ココナラと似てるおすすめの副業サイトを確認する

>>リモートワークもあるおすすめの転職サイトを確認する

休日で空いた時間の暇つぶしを探せるアプリを公開しています。

Contents

Bootstrapを導入する

一覧画面のレイアウトをBootstrapを使って整えていきます。

// composerを使って必要部品をインストール
/var/www/html# composer require laravel/ui
> @php artisan vendor:publish --tag=laravel-assets --ansi
No publishable resources for tag [laravel-assets].
Publishing complete.

// artisanコマンドでbootstrapを実行
/var/www/html# php artisan ui bootstrap
Bootstrap scaffolding installed successfully.
Please run "npm install && npm run dev" to compile your fresh scaffolding.

// 指示通りに実行
/var/www/html# npm install && npm run dev

何らかのエラーが出てしまったら、ゴリゴリエラー解決をしてください。

共通のビューファイルを用意して継承する

CSRFトークンやFont Awesome,Stylesなどを共通ファイルに書き出し、一覧画面ではそれを継承するように修正します。

まずは、共通ファイルとなるapp.blade.phpをviews > layouts の配下に作ります。

<!doctype html>
<html lang="ja">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <!-- CSRF Token -->
    <meta name="csrf-token" content="{{ csrf_token() }}">

    <title>{{ config('app.name', 'Laravel') }}</title>

    <!-- Scripts -->
    <script src="{{ asset('js/app.js') }}" defer></script>

    <!-- Fonts -->
    <link rel="dns-prefetch" href="//fonts.gstatic.com">
    <link href="https://fonts.googleapis.com/css?family=Nunito" rel="stylesheet">

    <!-- Font Awesome -->
    <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.6.3/css/all.css">

    <!-- Styles -->
    <link href="{{ asset('css/app.css') }}" rel="stylesheet">
</head>
<body>
    <div id="app">
        <main class="py-4">
            @yield('content')
        </main>
    </div>
</body>
</html>

上記のファイルをそれぞれのファイルで継承します。

@extends(‘親ファイル’)
@section(”)
— 記述 —
@endsection
と書くことで、親ファイルの内容も継承できます。
詳しくは、Laravel8 bladeテンプレートをご確認ください。

ついでにbootstrapが機能しているか、ボタンを追加しました。

@extends('layouts.app')

@section('content')
    <h1>もくもく会一覧画面</h1>

    @foreach ($events as $event)
        <p>{{ $event->event_id }}</p>
        <p>{{ $event->category_id }}</p>
        <p>{{ $event->title }}</p>
        <p>{{ $event->date }}</p>
        <p>{{ $event->start_time }}</p>
        <p>{{ $event->end_time }}</p>
        <p>{{ $event->content }}</p>
        <p>{{ $event->entry_fee }}</p>
    @endforeach

    <button class="btn btn-primary">検索</button>
@endsection

localhost:90に接続すると、bootstrapも機能していることが確認できました。(ボタン部分)

カテゴリーの一覧画面もapp.blade.phpを継承します。

@extends('layouts.app')

@section('content')
  <h1>カテゴリー一覧画面</h1>

  @foreach ($categories as $category)
      <p>{{ $category->category_id }}</p>
      <p>{{ $category->category_name }}</p>
  @endforeach
@endsection

カテゴリーの一覧画面を作成する

まずはカテゴリー一覧画面のレイアウトを整えます。

全体像

@extends('layouts.app')

@section('content')
<nav class="navbar navbar-expand-lg navbar-light bg-light container">
  <div class="container-fluid">
    <a class="navbar-brand" href="{{ route('category.index') }}">カテゴリー</a>
    <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#category" aria-controls="category" aria-expanded="false" aria-label="Toggle navigation">
      <span class="navbar-toggler-icon"></span>
    </button>
    <div class="collapse navbar-collapse" id="category">
      <ul class="navbar-nav me-auto mb-2 mb-lg-0">
        <li class="nav-item">
          <a class="nav-link active" aria-current="page" href="{{ route('category.index') }}">一覧画面</a>
        </li>
      </ul>
    </div>
  </div>
</nav>

<div class="container">
  <table class="table table-striped">
    <thead>
      <tr>
        <th scope="col">カテゴリーID</th>
        <th scope="col">カテゴリー名</th>
      </tr>
    </thead>
    <tbody>
      @foreach ($categories as $category)
      <tr>
          <td>{{ $category->category_id }}</td>
          <td>{{ $category->category_name }}</td>
      </tr>
      @endforeach
    </tbody>
  </table>
</div>
@endsection

ほぼbootstrapの説明になってしまうので割愛しますが、ナビゲーションの素材はこちらから、テーブルの素材はこちらから取得しています。

hrefにルーティングの記述がありますが、routes >web.phpでルーティングを以下のように名前をつけていきました。

Route::get('/category/index', [CategoryController::class, 'index'])
    ->name('category.index');

なので、カテゴリー一覧画面への遷移は、

href="{{ route('category.index') }}"

とすればOKです。

登録画面のルーティングを設定していないので、今は空でOK。

画面幅を変えたときにレスポンシブ対応されているので、右上の3本線クリックでナビゲーションが開きます。

カテゴリー一覧画面ができました。続いてもくもく会の一覧画面を作成します。

もくもく会一覧画面を作成する

カテゴリー一覧画面が作成できたので、続いてもくもく会一覧画面を作成していきましょう。

まずはナビゲーション部分を作っていきます。もくもく会の一覧リストはこのあと作ります。

@extends('layouts.app')

@section('content')
{{-- ナビゲーション --}}
<nav class="navbar navbar-expand-lg navbar-light bg-light container">
    <div class="container-fluid">
        <a class="navbar-brand" href="{{ route('event.index') }}">もくもく会</a>
        <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#mokumoku" aria-controls="mokumoku" aria-expanded="false" aria-label="Toggle navigation">
            <span class="navbar-toggler-icon"></span>
        </button>
        <div class="collapse navbar-collapse" id="mokumoku">
        <ul class="navbar-nav me-auto mb-2 mb-lg-0">
            <li class="nav-item">
                <a class="nav-link active" aria-current="page" href="{{ route('event.index') }}">一覧</a>
            </li>
            <li class="nav-item">
                <a class="nav-link" href="">開催する</a>
            </li>
        </ul>
        </div>
    </div>
</nav>

{{-- もくもく会開催一覧リスト --}}
    @foreach ($events as $event)
        <p>{{ $event->event_id }}</p>
        <p>{{ $event->category_id }}</p>
        <p>{{ $event->title }}</p>
        <p>{{ $event->date }}</p>
        <p>{{ $event->start_time }}</p>
        <p>{{ $event->end_time }}</p>
        <p>{{ $event->content }}</p>
        <p>{{ $event->entry_fee }}</p>
    @endforeach
@endsection

カテゴリー一覧画面の時とほぼ同じなので、説明は割愛します。(route(”)の部分が変わった、文言変わったぐらい。)

画面幅を変えたときには以下のような状態になります。(右上の3本線クリックで一覧・開催するが開く)

もくもく会の一覧リストを作成します。

@extends('layouts.app')

@section('content')
<style>
    #mokumoku-lists {
        filter:drop-shadow(2px 4px 6px #000);
    }
    .content-filed {
        width: 60%;
    }
</style>

{{-- ナビゲーション --}}
<nav class="navbar navbar-expand-lg navbar-light bg-light container">
    <div class="container-fluid">
        <a class="navbar-brand" href="{{ route('event.index') }}">もくもく会</a>
        <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#mokumoku" aria-controls="mokumoku" aria-expanded="false" aria-label="Toggle navigation">
        <span class="navbar-toggler-icon"></span>
        </button>
        <div class="collapse navbar-collapse" id="mokumoku">
        <ul class="navbar-nav me-auto mb-2 mb-lg-0">
            <li class="nav-item">
                <a class="nav-link active" aria-current="page" href="{{ route('event.index') }}">一覧</a>
            </li>
            <li class="nav-item">
                <a class="nav-link" href="">開催する</a>
            </li>
        </ul>
        </div>
    </div>
</nav>

{{-- もくもく会開催一覧リスト --}}
<div class="card container text-center mb-5" id="mokumoku-lists">
    <div class="card-header font-weight-bold bg-white">
      <a href="">{{ 'タイトル' }}</a>
    </div>
    <div class="card-body">
        <div class="category text-left">
            <label for="category-label"><span class="badge badge-primary p-2">{{ 'Laravel' }}</span></label>
        </div>
        <div class="entry-fee-wrapper d-flex">
            <label for="entry-fee"><span class="badge badge-success p-2">{{ '参加費' }}</span></label>
            <p class="text-danger font-weight-bold p-1 h5">{{ '500'.'円' }}</p>
        </div>
        <div class="content-wrapper d-flex">
            <div class="content-filed">
                <p class="card-text text-left">
                    {{ 'テキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストストテキストストテキストストテキストストテキストストテキスト' }}
                </p>
            </div>
            <div class="btn-filed ml-auto">
                <button class="btn btn-primary mr-3">{{ '詳細' }}</button>
                <button class="btn btn-info mr-3">{{ '編集' }}</button>
                <button class="btn btn-danger mr-3">{{ '削除' }}</button>
            </div>
        </div>
    </div>
    <div class="card-footer text-left font-weight-bold bg-white">
      {{ '開催日時: 11/20(木) 15:00 - 18:00' }}
    </div>
</div>
@endsection

もくもく会一覧画面はほぼbootstrapの知識になるので、説明を割愛します。一旦、値は仮置きにしました。

完成図

データベースの値を実際に表示させていきますが、PHPの日付関数や文字列制御、文字列で特定の要素を削除したりと少々長くなるので、次回の記事で解説します。

>>ココナラと似てるおすすめの副業サイトを確認する

>>リモートワークもあるおすすめの転職サイトを確認する

休日で空いた時間の暇つぶしを探せるアプリを公開しています。

スキルを売り買いするならココナラ

コメント

コメントする

CAPTCHA


Contents
閉じる