Laravelで業務システム

Laravel関連の記事掲載してます

顧客マスタのメイン画面を作ってみる

顧客マスタの新規入力画面ができたので、メイン画面の一覧をつくっていきます。

Bladeファイルの編集


メイン画面は、顧客IDと顧客名の検索ボックスを配置し、検索するとその下に顧客マスタデータ一覧が出るようにします。また一覧は5行ずつのページネーションを付けます。

メイン画面の"mst_customer_list.blade.php"はまだ、Cardのヘッダーに新規とホームへ戻るボタンしか配置してませんので、上の機能が実現できるようにCardのボディーを以下のように記述します。

<div class="card-body">

    <form class="row" method="POST" action="/mst_customer_search">
        @csrf
        <div class="form-group col-6">
            <label for="search_customer_id">顧客ID</label>
            <input name="search_customer_id" type="number" class="form-control" id="search_customer_id" value="{{ isset($search_customer_id)?$search_customer_id:"" }}">
        </div>
        <div class="form-group col-6">
            <label for="search_customer_nm">顧客名</label>
            <input name="search_customer_nm" type="text" class="form-control" id="search_customer_nm" value="{{ isset($search_customer_nm)?$search_customer_nm:"" }}">
        </div>

        <div class="form-group col-12">
        <button type="submit" class="btn btn-primary btn-sm">検索</button>
        <button type="reset" class="btn btn-primary btn-sm">クリア</button>
        </div>
    </form>
    
    <br/>
    
    <table class="table table-sm table-bordered table-striped">
        <thead>
            <tr>
            <th class="bg-light">顧客ID</th>
            <th class="bg-light">顧客名</th>
            <th class="bg-light">住所</th>
            <th class="bg-light">TEL</th>
            <th class="bg-light">FAX</th>
            </tr>
        </thead>
        <tbody>
        @if(isset($customers))
            @foreach ($customers as $customer)
                <tr>
                <td class="col-1">{{ $customer->customer_id }}</td>
                <td class="col-2"><div class="text-truncate" style="max-width: 150px;">{{ $customer->customer_nm }}</div></td>
                <td class="col-4"><div class="text-truncate" style="max-width: 200px;">{{ $customer->customer_addr }}</div></td>
                <td class="col-2">{{ $customer->customer_tel }}</td>
                <td class="col-2">{{ $customer->customer_fax }}</td>
                </tr>
            @endforeach
        @endif
        </tbody>
    </table>
    @if(isset($customers))
        {{ $customers->withPath('mst_customer_search')->appends(['search_customer_id'=>"$search_customer_id",'search_customer_nm'=>"$search_customer_nm"])->links() }}
    @endif
</div>

検索部分についてはPostリクエストするため、"@csrf"をつけないとLaravelではセキュリティー対策からエラーがでます。

ところどころisset関数つかってますが、これは、最初画面を開いた際、変数が存在していないため、そのエラー対策です。

一覧表示については、"@foreach"ディレクティブ使ってループし表示させる想定です。この辺りは複雑になりがちかつ、よく利用するので、別途ファサードコンポーネント化しておくのもひとつかもしれません。

最後にページネーションつけてます。Laravelを利用するとかなり簡単に実装できます。

尚、Laravel8だと標準ではBootstrapのページネーションが適用されないようです。ページネーションはカスタマイズを今後したいと思っているので、今は初期のままにしときます。

ルート設定


次に、検索ボタンを押したときと、ページネーションのリンクをクリックした時のルートを以下のようにweb.phpに記述します。

Route::post('/mst_customer_search', [App\Http\Controllers\MstCustomerController::class, 'search'])->name('mst_customer_search');
Route::get('/mst_customer_search', [App\Http\Controllers\MstCustomerController::class, 'page'])->name('mst_customer_page');

コントローラの設定


"MstCustomerController.php"に以下ファンクションを記述します。

public function search(Request $request)
{

    $search_customer_id = $request->input('search_customer_id');
    $search_customer_nm = $request->input('search_customer_nm');

    $customer = new Customer();
    $customers = $customer->mst_customer_list($search_customer_id,$search_customer_nm);

    return view('mst_customer_list',compact('search_customer_id','search_customer_nm','customers'));
}

public function page(Request $request)
{
    $search_customer_id = $request->input('search_customer_id');
    $search_customer_nm = $request->input('search_customer_nm');
    $page = $request->input('page');

    $customer = new Customer();
    $customers = $customer->mst_customer_list($search_customer_id,$search_customer_nm);

    return view('mst_customer_list',compact('search_customer_id','search_customer_nm','customers','page'));
}

尚、上の、二つの関数は共通したDBへのアクセスロジックがあるため、"Customer.php"モデルファイルに共通ロジックを切り出ししました。‘

public function mst_customer_list($search_customer_id,$search_customer_nm)
{
    $query = Customer::query();
    $query->where('status', 1);
    if(!empty($search_customer_id)) {
        $query->where('customer_id','like',"$search_customer_id%");
    }
    if(!empty($search_customer_nm)) {
        $query->where('customer_nm','like',"%$search_customer_nm%");
    }
    $query->orderBy('id', 'asc');
    return $query->paginate(5);
}

以上で、メイン画面の完了です。だいぶ開発に慣れてきた?かなという感じですが、今後、この画面に、削除ボタンや編集ボタンを付けたりしていく予定です。