【Laravel】【PJ:TEST7】4-1.郵便番号マスタアップロード機能 画面編

概要

郵便番号マスタの機能を作成する。

welcome画面のtitle部分修正

事前作業として、タイトル部分修正。
呼び出し先画面でタイトル設定できるようにする。

<title>@yield('title')</title>

郵便番号マスタ 一覧画面

まずは、一覧の画面を作成。色々と思うところはあるが、まずは一覧で作成してみる。

郵便番号マスタへのhrefを設定

<a class="collapse-item" href="/maintenance/m_zip">郵便番号マスタ</a>

web.phpを設定

// マスタメンテナンス
// * 社員マスタ
Route::resource('maintenance/m_zip', 'MZipController');

controllerを設定

    public function index()
    {
        $query = m_zip::query();
        $m_zips = $query
            ->selectRaw('*')
            ->paginate(config('app.pageNum'))
            ;

        return view('maintenance.m_zip.index')
            -> with('m_zips', $m_zips)
        ;
    }

viewを設定

長いので割愛。
m_zipsが渡されてくる。

ばちぼこにレイアウト崩れた。
f:id:tk49:20211030163052p:plain

welcomeのcss/scriptの読み込み箇所の頭にスラッシュいれる。
下記は一例。

<!-- <link href="vendor/fontawesome-free/css/all.min.css" rel="stylesheet" type="text/css"> -->
  <link href="/vendor/fontawesome-free/css/all.min.css" rel="stylesheet" type="text/css">
…

とりあえず画面は出た。
f:id:tk49:20211030163851p:plain

一覧でDataTableの設定を忘れていることに気が付く。
諸々修正して(【Laravel】【PJ:TEST7】3.カスタマイズ基盤設定 に追記)、表示確認。
f:id:tk49:20211030171937p:plain

郵便番号マスタ アップロード画面

まずは恒例の初期画面から。

一覧画面からの遷移設定

            <!-- アップロード -->
            <a href="/maintenance/m_zip/upload" class="d-none d-sm-inline-block btn btn-sm btn-primary shadow-sm">
                <i class="fas fa-upload fa-sm text-white-50"></i> CSVアップロード</a>

正直コントローラー経由する必要ないかもしれないけれど、
機械的に一律この方式にしておく。

web.php

// * 郵便番号マスタ
// index
Route::get('maintenance/m_zip', 'MZipController@index');
// upload
Route::get('maintenance/m_zip/upload', 'MZipController@upload');

いったん画面だけ取り付けて今回は終了にする。
f:id:tk49:20211030201617p:plain

@extends('welcome')
@section('title', '郵便番号アップロード')
@section('content')

<!---------------------------->
<!-----     content      ----->
<!---------------------------->
<!-- Begin Page Content -->
<div class="container-fluid">

    <!-- Content Row -->
    <div class="row">
        <!-- タイトル -->
        <div class="col-xl-6 col-md-6 mb-4">
            <h1 class="h2 mb-0 text-gray-800">郵便番号アップロード</h1>
        </div>
        <div class="col-xl-6 col-md-6 mb-4" align="right">
            <!-- 戻る -->
            <a href="/maintenance/m_zip" class="d-none d-sm-inline-block btn btn-sm btn-primary shadow-sm">
                <i class="fas fa-arrow-left fa-sm text-white-50"></i> 戻る</a>
        </div>
    </div>
</div>

<!-- Content Wrapper -->
<div class="container-fluid">
    <div class="upload">
    <p>DBに追加したいCSVデータを選択してください。</p>
    <form action="/datamigration/upload/doupload" method="post" enctype="multipart/form-data">
        @csrf
        <input type="file" name="csv_file" />
        <button type="submit" class="btn btn-default btn-primary">データ取込</button>
    </form>
    </div>
</div>

@endsection

【Laravel】【PJ:TEST7】3.カスタマイズ基盤設定

概要

前回まででテンプレートを導入した。
今回は次回以降のカスタマイズ用に各種初期設定を行っていく。

サイドバー(メニュー)部分の設定

  1. topページをindex.html ⇒ / へ。
  2. SB Admin2 ⇒ デモサイト
  3. Pro版広告削除
  4. 全体的にメニュー設定

f:id:tk49:20211030125314p:plain
f:id:tk49:20211030131633p:plain

コンテンツ部分の設定

とりあえず全削除。きれいになりました。

<!-- Begin Page Content -->
@yield('content')
<!-- /.container-fluid -->

f:id:tk49:20211030131857p:plain

DataTable使用用のscriptの記載も対応。

<!---------------------------->
<!-----     script       ----->
<!---------------------------->
<!-- Bootstrap core JavaScript-->
<script src="/vendor/jquery/jquery.min.js"></script>
<script src="/vendor/bootstrap/js/bootstrap.bundle.min.js"></script>

<!-- Core plugin JavaScript-->
<script src="/vendor/jquery-easing/jquery.easing.min.js"></script>

<!-- Custom scripts for all pages-->
<script src="/js/sb-admin-2.min.js"></script>

<!-- Page level plugins -->
<script src="/vendor/chart.js/Chart.min.js"></script>

<!-- Page level custom scripts -->
<script src="/js/demo/chart-area-demo.js"></script>
<script src="/js/demo/chart-pie-demo.js"></script>

<!-- Data Tables -->
<!-- https://cdn.datatables.net/ -->
<script type="text/javascript" src="https://cdn.datatables.net/1.11.2/css/dataTables.bootstrap5.min.css"></script>
<script type="text/javascript" src="https://cdn.datatables.net/1.11.2/js/jquery.dataTables.min.js"></script>
<script type="text/javascript" src="https://cdn.datatables.net/1.11.2/js/dataTables.bootstrap5.min.js"></script>

<!-- https://datatables.net/download/ -->
<link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/v/dt/jszip-2.5.0/dt-1.11.2/af-2.3.7/b-2.0.0/b-colvis-2.0.0/b-html5-2.0.0/b-print-2.0.0/cr-1.5.4/date-1.1.1/fc-3.3.3/fh-3.1.9/kt-2.6.4/r-2.2.9/rg-1.1.3/rr-1.2.8/sc-2.0.5/sb-1.2.1/sp-1.4.0/sl-1.3.3/datatables.min.css"/>
 
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.1.36/pdfmake.min.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.1.36/vfs_fonts.js"></script>
<script type="text/javascript" src="https://cdn.datatables.net/v/dt/jszip-2.5.0/dt-1.11.2/af-2.3.7/b-2.0.0/b-colvis-2.0.0/b-html5-2.0.0/b-print-2.0.0/cr-1.5.4/date-1.1.1/fc-3.3.3/fh-3.1.9/kt-2.6.4/r-2.2.9/rg-1.1.3/rr-1.2.8/sc-2.0.5/sb-1.2.1/sp-1.4.0/sl-1.3.3/datatables.min.js"></script>

<script>
$(document).ready(function() {
    $('#example').DataTable({
        // xss対応
        columns: [
            { data: "編集", },
            { data: "社員番号",  render: $.fn.dataTable.render.text() , bSortable: true,},
        ],
        columnDefs: [
            {
                targets: 'centeringColumn80',  // どの列か指定
                width: 80,
                className : 'dt-body-center dt-head-center',  // センタリングの指定
            },
        ],
        lengthChange: true,         // lengthChange(表示件数選択機能)
        searching: true,            // searching(検索機能)
        order: [ [ 1, "asc" ] ],    // order(ソート機能)
        ordering: true,             // ソート機能 無効
        info: true,                 // 情報表示 無効
        paging: true,               // ページング機能 無効
        language: {
            "decimal": ".",
            "emptyTable":     "表示するデータがありません。",
            "thousands": ",",
            "sProcessing": "処理中...",
            "sLengthMenu": "_MENU_ 件表示",
            "sZeroRecords": "データはありません。",
            "sInfo": " _TOTAL_ 件中 _START_ から _END_ まで表示",
            "sInfoEmpty": " 0 件中 0 から 0 まで表示",
            "sInfoFiltered": "(全 _MAX_ 件より抽出)",
            "sInfoPostFix": "",
            "sSearch": "検索:",
            "sUrl": "",
            "oPaginate": {
                "sFirst": "先頭",
                "sPrevious": "前",
                "sNext": "次",
                "sLast": "最終"
            }
        },
    });
});
</script>

DB設定

  • aオプションで一気に作成。

■次回見直し
・modelはスネーク不可。(factoryでこける)
・-r オプションを入れる。-r, --resource Indicates if the generated controller should be a resource controller

php artisan make:model t_ics_data -a
php artisan make:model t_order -a
php artisan make:model t_order_detail -a
php artisan make:model t_order_charge -a
php artisan make:model t_event -a
php artisan make:model m_user -a
php artisan make:model m_content -a
php artisan make:model m_auth -a
php artisan make:model m_employee -a
php artisan make:model m_company -a
php artisan make:model m_customer -a
php artisan make:model m_supplier -a
php artisan make:model m_cod -a
php artisan make:model m_vehicle -a
php artisan make:model m_zip -a
php artisan make:model m_prefecture -a
php artisan make:model m_ward -a
php artisan make:model w_err_log -a
php artisan make:model t_charge_achievement -a -r
php artisan make:export ChargeAchievementExport --model=t_charge_achievement

各モデルにsoftdeleteの設定追加
例:m_auth.php

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes; //追加

class m_auth extends Model
{
    use HasFactory;
    use SoftDeletes; //追加
}

migrations直下の各テーブルの設定を行う。

migration実行

php artisan migrate:refresh --seed
//migrateのみ php artisan migrate:refresh
//seedのみ php artisan db:seed
php artisan ide-helper:model --nowrite

昔のデータが残っていたので、Migration not found:が出た。
f:id:tk49:20211030155513p:plain

migrationsというテーブルでmigration対象を決定しているので、こちらを修正。
再実行でエラーが出なくなったことを確認。
f:id:tk49:20211030155648p:plain

【Laravel】【PJ:TEST7】2.テンプレート適用

概要

Laravelにてwebサイトを作成する際、テンプレートとなるものを使用し
見た目的にオシャレな、最近の感じのものを作成する手順

こちらを参考にさせてもらいました。
biz.addisteria.com

でとりあえず、画面が出る状態に。SB Admin 2 を入れてみました。
f:id:tk49:20211030121539p:plain

ちなみにアコーディオン等のjsは動かない模様。

修正①

layouts -> new-master.blade.php になっているので、welcome.bladeに移動。
その際、参考サイトの、「⑥cssJavascriptリンクにasset関数をいれる」は不要になった。(なぜだ…?)

表示されていなかった画像とかが表示されるようになった。
f:id:tk49:20211030122242p:plain

jsの動作もOK。
f:id:tk49:20211030123258p:plain

web.php も元に戻して終了。

【Laravel】【PJ:TEST7】1.プロジェクトの開始

今まで作成していたが、DBの構造等根本を修正したくなってきたので、
プロジェクト作成から、改めて手順化する。

【環境】
PHP 8.0.0
Laravel Framework 8.36.2
windows 10
node v14.16.0

インストール方法は割愛。

概要

全体フローとしては以下手順

  1. プロジェクト作成
  2. ツール系インストール
  3. 動作確認①
  4. gitへpush
  5. 初期設定
  6. 動作確認②

プロジェクト作成

まずはプロジェクトを作成する。

  1. repos直下に作成
  2. DB名:laravel、パスワード:laravel
  3. TEST7というプロジェクト
cd C:\Users\ADMIN\source\repos
composer create-project laravel/laravel --prefer-dist TEST7

便利ツールをcomposerにてインストール

  1. ディレクトリ移動
  2. データベースからLaravelのSeederを逆生成する。
  3. CSVからDBにインサートを簡単にする。
  4. bootstrap用ui
  5. bootstrap
  6. goodbye csv
  7. laravel excel
cd C:\Users\ADMIN\source\repos\TEST7
composer require --dev "orangehill/iseed"
composer require rap2hpoutre/fast-excel
composer require laravel/ui
php artisan ui bootstrap --auth
composer require goodby/csv
composer require maatwebsite/excel

動作確認①

設定変更前に一度動作確認。

cd C:\Users\ADMIN\source\repos\TEST7
php -S localhost:8000 -t public

初期画面が表示されることを確認。
f:id:tk49:20211030101241p:plain

gitへpush

Visual Stadioからファイル -> ソース管理に追加 -> 作成とプッシュ

初期設定

app/Providers/RouteServiceProvider.phpを修正

コントローラーのroute namespaceを定義する。

//protected $namespace = 'App\\Http\\Controllers';
↓
protected $namespace = 'App\\Http\\Controllers';

config/app.phpを修正

    /* ORIGINAL
    |--------------------------------------------------------------------------
    | Pagination Num
    |--------------------------------------------------------------------------
    | ページングの件数。コントローラにて参照。
    |
    */
    'pageNum' => 10000,
    'providers' => [
        …
        /*
         * Customise Service Providers...
         */
         Orangehill\Iseed\IseedServiceProvider::class,
         Maatwebsite\Excel\ExcelServiceProvider::class,
    ],
    'aliases' => [
        /*
         * Customise aliases...
         */
        'Excel' => Maatwebsite\Excel\Facades\Excel::class,
    ],
    //'timezone' => 'UTC',
    'timezone' => 'Asia/Tokyo',

    //'locale' => 'en',
    'locale' => 'ja',
    
    //'fallback_locale' => 'en',
    'fallback_locale' => 'ja',

    // 'faker_locale' => 'en_US',
    'faker_locale' => 'ja_JP',

動作確認②

サーバー再起動してみて問題ないか確認。

【Laravel】プロジェクト:TEST6 ファイルアップロード2

ファイルアップロード

データ移行用にファイルをアップロードできるようにする。

画面は前回のそのまま。
f:id:tk49:20211026024752p:plain

CSVを取り込めるようになったので、下記あたりを参考に1行ずつごにょごにょできるようにした。
kitajimatakahiro.com
https://www.php.net/manual/ja/class.splfileobject.php#splfileobject.constants.read-csv

ちょっと詰まったのが1行ずつ処理する際に、対象データを検知するため比較していたのだが、
fgetsすると改行コードが入るようで、うまく比較できなかった。
96butler.blog14.fc2.com

ついでにログも出してみるように。
下記の「Controllerにメソッド追加」を参照。
qiita.com

ログ自体は\storage\logsに存在していた。UTF-8で開くこと。

【Laravel】プロジェクト:TEST6 ファイルアップロード

ファイルアップロード

データ移行用にファイルをアップロードできるようにする。

初期画面はまっさら。
f:id:tk49:20211025230334p:plain

下記を参考に。
kitajimatakahiro.com

画面イメージ。
f:id:tk49:20211026024752p:plain

で、csvを取り込めるようにはなった…。でも違うんだ…。
やりたいのは、ファイル読み込んで、自分でループしてごにょごにょしたいんだ…。
これだとcsv取込&マッピングは簡単にできるってやつだった…。

まあどこかで使うと思うので、これはこれでとっておきましょう。

【Laravel】プロジェクト:TEST6 マスタデータの編集

マスタデータの編集

マスタデータとして画面表示まではできたので、編集できるようにする。

色々と修正してしまいました…
日程が少し空いてしまったので、一度現在の状況をアップします。

メンテナンスの一覧画面。
f:id:tk49:20210929000121p:plain

ここから、各データをクリックした際に、編集ページへ遷移するようにする。
f:id:tk49:20210929000310p:plain