iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

3
Modern Web

Laravel從入門到放棄…………原生PHP (疑?系列 第 44

[Day 43] Laravel實作 - 商品購買與交易記錄(二)

今天繼續商品購買的部分

商品單品檢視頁控制器

商品單品檢視頁的控制器邏輯,與商品編輯頁的邏輯一樣,取得網址列傳入商品編號$merchandise_id去取得商品資訊,並將取得的商品資訊設定在$binding變數中,使用merchandise.showMerchandise模板當作資料的顯示,並將$binding變數的資料傳送到模板中做顯示

app/Http/Controllers/MerchandiseController.php

<?PHP
namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use App\Shop\Entity\Merchandise;
use Illuminate\Support\Facades\Log;
use Validator; //驗證器
use Image;

class MerchandiseController extends Controller
{
    //商品單品頁
    public function merchandiseItemPage($merchandise_id)
    {
        //撈取商品資料
        $Merchandise = Merchandise::findOrFail($merchandise_id);

        if(!is_null($Merchandise->photo))
        {
            //設定商品照片網址
            $Merchandise->photo = url($Merchandise->photo);
        }

        $binding = [
            'title' => '商品頁',
            'Merchandise' => $Merchandise,
        ];

        return view('merchandise.showMerchandise', $binding);
    }
}
?>

## 商品單品檢視頁模板

商品單品檢視頁中,我們會需要顯示商品的詳細介紹資訊,像是商品名稱(name)商品照片(photo)商品價格(price)商品剩餘數量(remain_count)的欄位資料,在這樣的規劃下,我們商品單品頁的模板會長的像下面這樣

resources/views/merchandise/showMerchandise.blade.php

<!-- 指定繼承 layout.master 母模板 -->
@extends('layout.master')

<!-- 傳送資料到母模板,並指定變數為title -->
@section('title', $title)

<!-- 傳送資料到母模板,並指定變數為content -->
@section('content')
<div class="container">
    <h1>{{ $title }}</h1>

    <!-- 錯誤訊息模板元件 -->
    @include('components.validationErrorMessage')

    <table class="table">
        <tr>
            <th>名稱</th>
            <td>{{ $Merchandise->name }}</td>
        <tr>
        <tr>
            <th>照片</th>
            <td>
                <img class="img_single" src="{{ $Merchandise->photo = $Merchandise->photo ?? '/assets/images/default-merchandise.jpg' }}"/>
            </td>
        <tr>
        <tr>
            <th>價格</th>
            <td>{{ $Merchandise->price }}</td>
        <tr>
        <tr>
            <th>剩餘數量</th>
            <td>{{ $Merchandise->remain_count }}</td>
        <tr>
        <tr>
            <th>介紹</th>
            <td>{{ $Merchandise->introduction }}</td>
        <tr>
        <tr>
            <td colspan="2">
                <form action="/merchandise/{{ $Merchandise->id }}/buy"
                    method="post">
                    購買數量
                    <select name="buy_count">\
                        @for($count=0;$count<=$Merchandise->remain_count;$count++)
                        <option value="{{ $count }}">{{ $count }}</option>
                        @endfor
                    </select>
                    <button type="submit">購買</button>
                    <!-- 自動產生 csrf_token 隱藏欄位-->
                    {!! csrf_field() !!}
                </form>
            </td>
        </tr>
    </table>

</div>
@endsection

除了顯示商品的詳細資訊外,在最後面會提供購買連結,只要選擇了購買數量,並點選了購買的按鈕,就可以對商品進行購買。而購買數量的部分使用模板的@for及@endfor去作呈現,購買數量的最多數量為商品可購買數量

結果畫面
http://localhost:6943/merchandise/1
https://ithelp.ithome.com.tw/upload/images/20191015/20105694Y6MQVSVCch.png

商品購買處理資料驗證

當使用者點選了購買的按鈕後,會直接將購買的請求送到購買商品的路由去做整理,在購買商品的請求中一樣要對傳入的資料做驗證再做處理,所以我們一樣使用Validator驗證商品資料,驗證器在控制器邏輯會像這樣

app/Http/Controllers/MerchandiseController.php

<?PHP
namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use App\Shop\Entity\Merchandise;
use Illuminate\Support\Facades\Log;
use Validator; //驗證器
use Image;

class MerchandiseController extends Controller
{
    //商品購買處理
    public function merchandiseItemBuyProcess($merchandise_id)
    {
        //接收輸入資料
        $input = request()->all();
        //驗證規則
        $rules = [
            //商品購買數量
            'buy_count' => [
                'required',
                'integer',
                'min:1',
            ],
        ];

        //驗證規則
        $validator = Validator::make($input, $rules);

        if($validator->fails())
        {
            //資料驗證錯誤
            return redirect('/merchandise/'.$merchandise_id)
                ->withErrors($validator)
                ->withInput();
        }

        var_dump($input);
    }
}
?>

驗證商品購買資料

在驗證商品購買數量時,我們限制傳入的資料必須要為整數,且數字至少要大於等於1,一定要選擇購買數量,根據這樣的條件規則,我們可以將規則設定成這樣

//驗證規則
$rules = [
    //商品購買數量
    'buy_count' => [
         'required',
         'integer',
         'min:1',
    ],
];

結果畫面
http://localhost:6943/merchandise/1
https://ithelp.ithome.com.tw/upload/images/20191015/20105694vqpwVWQVOo.png


上一篇
[Day 42] Laravel實作 - 商品購買與交易記錄(一)
下一篇
[Day 44] Laravel實作 - 商品購買與交易記錄(三)
系列文
Laravel從入門到放棄…………原生PHP (疑?48

尚未有邦友留言

立即登入留言