iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

1

管理商品

在商品新增完後,需要在商品管理清單檢視頁面管理所有的商品資料,在管理商品清單檢視的控制器邏輯會像這樣

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 merchandiseManageListPage()
    {
        //每頁資料量
        $row_per_page = 10;
        //撈取商品分頁資料
        $MerchandisePaginate = Merchandise::OrderBy('created_at', 'desc')->paginate($row_per_page);

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

        $binding = [
            'title' => '管理商品',
            'MerchandisePaginate' => $MerchandisePaginate,
        ];

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

透過Merchandise Eloquent Model,限制商品資料排序方式為最近新增的商品排在前面,使用paginate()方法建立商品分頁資料,並限制每頁資料量為10筆

//每頁資料量
$row_per_page = 10;
//撈取商品分頁資料
$MerchandisePaginate = Merchandise::OrderBy('created_at', 'desc')->paginate($row_per_page);

在正確取得商品分頁資料後,判斷每個商品中的商品照片(photo)資料是否有資料,如果有的話,則將圖片相對路徑轉換成網址位置(http://),讓模板資料能夠正確的呈現圖片資訊。

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

在撈取完商品後,將商品分頁資料設定在$binding變數中,使用merchandise.manageMerchandise模板當作資料的顯示,並將$binding變數的資料傳送到模板中做顯示。

在管理商品狀況時,我們需要知道商品狀態(status)、商品名稱(name)、商品照片(photo)、商品價格(price)及商品剩餘數量(remain_count)的資料,讓管理人員知道商品銷售狀況,在這樣的規劃下,商品管理清單頁的模板會長得像下面這樣。

resources/views/merchandise/manageMerchandise.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 table-condensed">
        <thead>
            <tr>
                <th>編號</th>
                <th>名稱</th>
                <th>圖片</th>
                <th>狀態</th>
                <th>價格</th>
                <th>剩餘數量</th>
                <th>編輯</th>
            </tr>
        </thead>
        <tbody>
        @foreach($MerchandisePaginate as $Merchandise)
        <tr>
            <td>{{ $Merchandise->id }}</td>
            <td>{{ $Merchandise->name }}</td>
            <td>
                <img class="img_show" src="{{ $Merchandise->photo = $Merchandise->photo ?? '/assets/images/default-merchandise.jpg' }}"/>
            </td>
            <td>
                @if($Merchandise->status == 'C')
                    建立中
                @else
                    可販售
                @endif
            </td>
            <td>{{ $Merchandise->price }}</td>
            <td>{{ $Merchandise->remain_count }}</td>
            <td>
                <a href="/merchandise/{{ $Merchandise->id }}/edit">
                    編輯
                </a>
            </td>
        </tr>
        @endforeach
        </tbody>
    </table>

    {{-- 分頁頁數按鈕 --}}
    {{ $MerchandisePaginate->links() }}
</div>
@endsection

在模板中使用@foreach及@endforeach將商品資料依序顯示出來,除了顯示商品的資訊外,在最後的表格欄位中,會設定商品的編號連結 /merchandise/{{ $Merchandise->id }}/edit,讓管理者可以很快地到商品編輯頁編輯商品資料。

在使用paginate()方法建立商品分頁資料時,Laravel很貼心的對分頁物件提供了 ->links()的方法,可以很快地建立分頁頁數按鈕HTML,當我們分頁變數為$MerchandisePaginate時,則使用 {{ $MerchandisePaginate->links() }} 就可以產生分頁頁數按鈕HTML,每個分頁按鈕連結後面都會自帶 page=頁數 的參數,而paginate()會自動處理請求中的page頁數的資料,撈取不同分頁頁數的資料。

加點CSS

public/css/style.css

.img_show{
    width: 40px;
    height: 30px;
}

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

商品管理與瀏覽的總結

在實作不同權限的頁面時,僅要在路由中加入中介層(Middleware)的設定,就可以很方便使用中介層(Middleware)去做到路由權限的控管,之後若再加入更多需要權限控管的路由,就只要加入中介層設定檔名稱就好。

而在開發專案上,常常會發現有很多不童專案都會需要的功能,像是圖片處理,這類的套件大多都可以在Packagist找到可以直接使用的套件,僅需要用Composer安裝後就可以立即使用了。

而在專案資料管理上,常常會需要使用分頁處理資料,Laravel也很貼心的提供paginate()方法讓我們可以很快地產生出分頁的資料以及分頁頁數按鈕HTML。

這些在專案上都必定會使用到的權限控管、套件管理及資料分頁,Laravel都會提供可以快速實作完成的方法,大大降低開發一個專案所需要的時間。現在我們商品管理資料已經建立完成了,接下來就可以開始實作商品購買的邏輯了。


上一篇
[Day 40] Laravel實作 - 商品管理與瀏覽(七)
下一篇
[Day 42] Laravel實作 - 商品購買與交易記錄(一)
系列文
Laravel從入門到放棄…………原生PHP (疑?47

尚未有邦友留言

立即登入留言