iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

0

今天開始要開始建立商品資料.

商品管理與瀏覽

當我們有使用者的身分資料後,就可以開始用使用者帳號,對商品進行商品管理,且僅讓管理者可以管理商品,一般會員僅能做商品的檢視及購買,那麼就開始針對我們設計的路由,開始一步一步實作商品管理及瀏覽吧!

商品路由

在商品管理流程中,我們有規劃商品資料新增、商品管理清單檢視、商品單品編輯頁面檢視頁面及商品單品資料修改四個路由規劃,這些路由必須限制僅有管理者才能夠存取。

商品清單檢視及商品單品檢視這兩個路由,我們不會限制身分,所有會員及非會員都可以看到這些頁面,就像註冊及登入頁一樣。

購買商品這個路由,我們將會限制需要登入的會員才能夠存取,進行商品購買,會員有登入才能知道消費記錄要記錄在哪個會員上。

說明 網址規範 方法
商品資料新增 /merchandise/create GET
商品管理清單檢視 /merchandise/manage GET
商品單品編輯頁面檢視 /merchandise/{merchandise_id}/edit GET
商品單品資料修改 /merchandise/{merchandise_id} PUT
商品清單檢視 /merchandise GET
商品單品檢視 /merchandise/{merchandise_id} GET
購買商品 /merchandise/{merchandise_id}/buy POST

routes/web.php

<?php
//商品
Route::group(['prefix' => 'merchandise'], function(){
    //商品清單檢視
    Route::get('/', 'MerchandiseController@merchandiseListPage');
    //商品資料新增
    Route::get('/create', 'MerchandiseController@merchandiseCreateProcess');
    //商品管理清單檢視
    Route::get('/manage', 'MerchandiseController@merchandiseManageListPage');
    //指定商品
    Route::group(['prefix' => '{merchandise_id}'], function(){
        //商品單品檢視
        Route::get('/', 'MerchandiseController@merchandiseItemPage');
        //商品單品編輯頁面檢視
        Route::get('/edit', 'MerchandiseController@merchandiseItemEditPage');
        //商品單品資料修改
        Route::put('/', 'MerchandiseController@merchandiseItemUpdateProcess');
        //購買商品
        Route::post('/buy', 'MerchandiseController@merchandiseItemBuyProcess');
    });
});
?>

建立商品頁控制器

若為了操作體驗,要使用Ajax上傳商品圖片,則必須要有商品編號,才能知道圖片資料要更新到哪個商品中。為了這個情境,可以在新增商品時,直接新增一筆商品資料,並設定商品資料的預設值,且商品的狀態為建立中狀態,讓商品不會在資料還沒有設定完成時,立即被上架。

app/Http/Controllers/MerchandiseController.php

<?PHP
namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use App\Shop\Entity\Merchandise;
use Validator; //驗證器

class MerchandiseController extends Controller
{
    //新增商品
    public function merchandiseCreateProcess()
    {
        //建立商品基本資訊
        $merchandise_data = [
            'status' => 'C', //建立中
            'name' => '', //商品名稱
            'name_en' => '', //商品英文名稱
            'introduction' => '', //商品介紹
            'introduction_en' => '', //商品英文介紹
            'photo' => null, //商品照片
            'price' => 0, //價格
            'remain_count' => 0, //商品剩餘數量
        ];
        $Merchandise = Merchandise::create($merchandise_data);

        //重新導向製商品編輯頁
        return redirect('/merchandise/'.$Merchandise->id.'/edit');
    }
}
?>

複習一下 app\Shop\Entity\Merchandise.php

<?PHP
namespace App\Shop\Entity;

use Illuminate\Database\Eloquent\Model;

class Merchandise extends Model {
    //資料表名稱
    protected $table = 'merchandise';

    //主鍵名稱
    protected $promaryKey = 'id';

    //可以大量指定異動的欄位(Mass Assignment)
    protected $fillable = [
        'status',
        'name',
        'name_en',
        'introduction',
        'introduction_en',
        'photo',
        'price',
        'remain_count',
    ];
}
?>

在控制器上方加入 use App\Shop\Entity\Merchandise; 使用之前新增的商品(Merchandise) Eloquent Model,當設定完商品的預設值後,接著就可以直接在控制器使用Merchandise::create()新增資料到商品資料表了,所有傳入的資料,一樣會依照鍵值名稱,新增到資料表的對應欄位中。

當新增完商品後,就可以將使用者重新導向到商品編輯頁,讓使用者作後續的商品編輯動作了。

商品編輯頁控制器

而商品編輯頁中,會從網址列的參數,接收到商品的編號名稱 /merchandise/{merchandise_id}/edit,商品編號則透過函數的第一個變數值$merchandise_id去接收public functoin merchandiseItemEditPage($merchandise_id),就可以拿到從網址列傳入的參數了。

app/Http/Controllers/MerchandiseController.php

<?PHP
namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use App\Shop\Entity\Merchandise;
use Validator; //驗證器

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

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

        $binding = [
            'title' => '編輯商品',
            'Merchandise' => $Merchandise,
        ];
        return view('merchandise.editMerchandise', $binding);
    }
}
?>

在接收到網址列傳入的商品編號資料後,會使用Merchandise Eloquent Model直接撈取商品資料,當沒有找到商品資料時,則會丟出例外錯誤。(頁面會拋出404)

//撈取商品資料
$Merchandise = Merchandise::findOrFail($merchandise_id);

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


上一篇
[Day 33] Laravel實作 - 會員登入及登出(三)
下一篇
[Day 35] Laravel實作 - 商品管理與瀏覽(二)
系列文
Laravel從入門到放棄…………原生PHP (疑?48

尚未有邦友留言

立即登入留言