# 購物車實作遇到常用方法
# 命名auth及驗證套件
```php=
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Validator;
```
# 產出Controller
php artisan make:controller Controller名稱
# 假資料建立
php artisan make:seeder OrdersTableSeeder
{Model名稱複數型}TableSeeder.php
# Form表單POST Controller驗證方式
1. 為controllers/ShopController.php示範接收到的值
```php=
$validator=Validator::make($request->all(),[
'receive_name' => 'required|string|max:50',
'receive_phone' => 'required|string|max:50',
'receive_address' => 'required|string|max:250',
'pay_type_id' => 'required|integer',
'remark' => 'required|string|max:250'
]);
if($validator->fails()){
return redirect('/checkCart')->withErrors($validator)->withInput(); //錯誤處理
// withErrors ->將錯誤欄位帶入Session
//withInput ->返回頁面時會將原資料帶入
}
```
# 直接從Controller新增至資料庫方式
1. Order::為資料庫要先至Controller最上面先use App\Models\Order;
```php=
$order = Order::create([
'user_id' => $userID,
'receive_name' => $request->receive_name,
'receive_phone' => $request->receive_phone,
'receive_address' => $request->receive_address,
'pay_type_id' => $request->pay_type_id,
'total'=> $row->price * $row->quantity ,
'remark' => $request->remark,
])->id;
```
2. 第二種新增方式
```php=
order_info = new OrderInfo();
$order_info -> order_num = $this->generateOrderNum();
$order_info -> user_id = $request->session()->get('id');
foreach($request_order_only as $field){
if(isset($request->$field)){
$order_info -> $field = $request->$field;
}
}
if(isset($request->same_order_checkin)){
$order_info -> same_order_checkin = 1;
$order_info -> checkin_name = $request->order_name;
$order_info -> checkin_phone_number = $request->order_phone_number;
$order_info -> checkin_email = $request->order_email;
$order_info -> checkin_zip_code = $request->order_zip_code;
$order_info -> checkin_county = $request->order_county;
$order_info -> checkin_district = $request->order_district;
$order_info -> checkin_address = $request->order_address;
}else{
$order_info -> same_order_checkin = 0;
}
$order_info->save();
$id = $order_info->id;
```
4. 記得先將Order資料表先新增白名單
路徑為models/Order.php
```php=
protected $fillable = [
'user_id',
'pay_type_id',
'remark',
'receive_name',
'receive_phone',
'receive_address',
'total',
];
protected $hidden = [//隱藏欄位
'password',
'remember_token',
];
protected $casts = [ //日期專用
'email_verified_at' => 'datetime',
];
```
# Controller需要利用Model Common Function用法
1. models/Product.php
```php=
public function getQuantityStock($cartContent){
foreach ($cartContent as $row) {
$product = Product::find($row->id);
if($product->quantity - $row->quantity < 0){
flash($product->name."目前商品數量只剩".$product->quantity)->error();
return false;
}
}
return true;
}
```
2. ShopController.php
```php=
$userID = Auth::user()->id;
$cartContent = \Cart::session($userID)->getContent();
$product = new Product;
if($product->getQuantityStock($cartContent)!==true){
return redirect('/');
}
```
1. 也可再Controll用
controller.php
```php=
protected function orderInfoDataToChinese($datas){
foreach($datas as $key=>$array){
if($array["payment"]=="credit_card"){
$datas[$key]["payment_chinese"]="信用卡";
}else{
$datas[$key]["payment_chinese"]="匯款";
}
if($array["status"]=="ordered"){
$datas[$key]["status_chinese"]="尚未付款";
}elseif($array["status"]=="payment_failed"){
$datas[$key]["status_chinese"]="付款失敗";
}elseif($array["status"]=="payment_success"){
$datas[$key]["status_chinese"]="付款成功";
}elseif($array["status"]=="order_completed"){
$datas[$key]["status_chinese"]="訂單完成";
}
}
return $datas;
}
IndexController.php
$order_number=parent::orderInfoDataToChinese($order);
```
parent::
# 訊息套件
composer require laracasts/flash
# 購物車
## 購物車套件
composer require "darryldecode/cart"
修改購物車套件config/app.php(⾮必須)
加入以下到Service Provider Array
Darryldecode\Cart\CartServiceProvider::class
加入以下到Alias Array
'Cart' =>
Darryldecode\Cart\Facades\CartFacade::class
## 購物車套件將資料加入用法
1. id及name...等key值不能修改會出錯
2. id及name和price和quantity不可為空值也會出錯
```php=
\Cart::session($userID)->add(array(
'id' => $productId,
'name' => $item->name,
'price' => $item->price,
'quantity' => $request->quantity,
'attributes' => array(),
'associatedModel' => $item
));
```
## 購物車套件將資料移除
```php=
//$rowId=資料的id
\Cart::session($userID)->remove($rowId);
```
## 購物車套件抓取資料及數量用法
```php=
$cartContent = \Cart::session($userID)->getContent();//購物車儲存的資料
$cartQty= \Cart::session(Auth()->user()->id)->getTotalQuantity();//購物車的總數量
```
## 購物車在view可直接查看總金額
${{ \Cart::getTotal() }}
## 購物車放入全域變數
1. app/Providers/AppServiceProvider.php
2. 前面記得放use Illuminate\Support\Facades\Auth;
```php=
public function boot()
{
view()->composer('*',function($view) {
if(Auth::check()){
$cartContent = \Cart::session(Auth()->user()->id)->getContent();
$cartQty= \Cart::session(Auth()->user()->id)->getTotalQuantity();
$view->with('user', Auth::user());
$view->with('cartContent', $cartContent);
$view->with('cartQty', $cartQty);
}
});
}
```
# E-Mail寄信
1. 進入Gmail信箱按照下圖產生應用程式密碼,將產生的密碼為ENV的信箱密碼

2. 修改.env 他是根據config/mail.php的預設
MAIL_MAILER=smtp
MAIL_HOST=smtp.googlemail.com
MAIL_PORT=465
MAIL_USERNAME=信箱
MAIL_PASSWORD=信箱密碼
MAIL_ENCRYPTION=ssl
3. php artisan make:mail Contact
產出來在app/Mail底下
修改Contact.php
```php=
protected $params;
/**
* Create a new message instance.
*
* @return void
*/
public function __construct($params)
{
$this->params = $params;
}
/**
* Get the message content definition.
*
* @return \Illuminate\Mail\Mailables\Content
*/
public function content()
{
return new Content(
view: 'mail.email_contact',
with:['params' => $this->params],
);
<!-- return $this->view('mail.system_message')
->with(['params'=>$this->params
]); -->
}
```
4. 接下來至web.php增加Route
Route::post('/contact', [MailController::class, 'contactSendMail'])->name('contactSendMail');;
5. 請至Controller修改程式內容
* 必須至Controller最上面加入兩段
```php=
use Mail;
use App\Mail\Contact;
```
* 依照上路徑為controller/MailController 的contactSendMail Function修改
```php=
public function contactSendMail(Request $request)
{
$to = collect([['name' => '客服信箱','email'=>'peter777200067@gmail.com']]);
$params = ['name' => $request->name,
'phone'=>$request->phone,
'email'=>$request->email,
'message'=>$request->message,
];
Mail::to($to)->send(new Contact($params));
}
```
6. 請新增好view視圖
依照上面為範例view為views/mail/emai_contact.blade.php
```php=
<div class="mb-4">
<h1 class="h3 mb-3 fw-normal">聯絡我們</h1>
</div>
<div class="form-floating form-outline mb-4">
<label for="floatingInput">姓名:{{ $params['name'] }}</label>
</div>
<div class="form-floating form-outline mb-4">
<label for="floatingInput">電話:{{ $params['phone'] }}</label>
</div>
<!-- Password input -->
<div class="form-floating form-outline mb-4">
<label for="floatingEmail">郵件:{{ $params['email'] }}</label>
</div>
<div class="form-floating form-outline mb-4">
<label for="floatingTextarea">訊息內容:{{ $params['message'] }}</label>
</div>
```
## 本地化Localized
### 本地化Localized用法
1. 修改config/app.php
應⽤的預設語⾔被存在 config/app.php 設定檔內。可修改這個值以適合應⽤的需求
'locale' => ‘zh_TW',//修改預設為繁體中文
'fallback_locale' => 'en',//為替代語系一樣在config/app.php內
2. 兩種方式新增資料夾至lang/底下
1. 短key方式php,如中文resources/lang/zh_TW/message.php
php可隨意命名
Blade檔使用時為{{ __('message.name') }}
前面為php檔案後面為陣列key值
```php=
<?php
return
['name'=>'姓名',
....];
?>
```
2. 長key方式Json,新增檔案至resources/lang/zh_TW.json
新增檔案zh_TW.json
需大小寫相符
Blade檔使用時為{{ __('name') }}
```json=
{
"name" : "姓名",
}
```
### Localized函式
1. 取得當前語系
```php=
$locale = App::getLocale();
```
2. 是否為英文語系
```php=
if (App::isLocale('en')) {
//預設語系確實為en
}
```
3. 後端引用本地化文字
檔名.陣列key
```php=
<?php
trans('auth.failed');
```
trans('auth.failed')跟 __('auth.failed');一樣
4. 切換語系
```php=
<?php
App::setLocale('en');
```
### Localized在說明文字裡面加入資料
純說明文字用翻譯當然很簡單,不過如果說明文字還需要加上一些資料,比方說 嘗試登入次數太多次
```php=
<?php
'throttle' => '嘗試登入太多次,請 :seconds 秒後再嘗試',
```
裡面的 :seconds
這個部分,我們可以在 trans() 轉換時,透過陣列的方式傳入。
```php=
<?php
Route::get('/test', function(){
return trans('auth.throttle', ['seconds' => 5]);
});
```