DeveloperGuide/step-0-sample-apps/sample-php-app/app/Http/Controllers/CartController.php (138 lines of code) (raw):
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Schema;
use App\Helpers\AppHelper;
use App\Models\Cart;
use App\Models\CartItem;
use App\Models\Order;
use App\Models\Item;
class CartController extends Controller
{
// pages:
public function checkout()
{
$user = session('user');
$cart = session('cart');
$item_list = [];
if ($cart) $item_list = array_keys($cart);
if (AppHelper::instance()->checkDB() && Schema::hasTable('items') && Schema::hasTable('carts')) {
$items = Item::whereIn('id',$item_list)->orderBy('name')->get();
} else {
// if there's no database connection, use a helper and JSON data
$items = AppHelper::instance()->itemJson('items',$item_list);
// set a flag so we can display a warning if JSON data is used
$json_warning = 1;
}
$cart_total = 0;
$cart_data = [];
foreach($items as $item) {
$qty = $cart[$item->id];
$item->qty = $qty;
// set price to 0 in the event there is bad data
$price = is_numeric($item->price) ? $item->price : 0;
// set item subtotal
$item->sub = $qty * number_format($price, 2);
// increment cart total
$cart_total += $item->sub;
// add item to cart array
$cart_data[$item->id] = $item;
}
if (AppHelper::instance()->checkDB() && Schema::hasTable('carts')) {
$full_cart = Cart::updateOrCreate(
['user_id' => $user->id, 'status' => 'open'],
);
$full_cart->save();
foreach($cart_data as $id => $item) {
$cart_insert = CartItem::updateOrCreate(
['cart_id' => $full_cart->id, 'item_id' => $id],
['qty' => $item->qty]
);
$full_cart->cart_items()->save($cart_insert);
}
session(['cart_id' => $full_cart->id]);
} else {
// if there's no database connection, fake it with sessions
session(['cart_id' => 'session']);
$json_warning = 1;
}
return view('checkout', ['header'=>1, 'user'=>$user, 'cart_data'=>$cart_data, 'cart_total'=>$cart_total, 'json_warning'=>($json_warning ?? 0)]);
}
public function processOrder(Request $request)
{
$user = session('user');
$cart = session('cart');
$cart_id = session('cart_id');
if (!$user || !$cart || !$cart_id) {
// something is missing, bounce back to the checkout page
return redirect()->route('checkout');
}
if ($cart) {
$item_list = array_keys($cart);
if (AppHelper::instance()->checkDB() && Schema::hasTable('items') && Schema::hasTable('carts')) {
$item = Item::whereIn('id',$item_list)->orderBy('name')->get();
} else {
// if there's no database connection, use a helper and JSON data
$item = AppHelper::instance()->itemJson('items',$item_list,'cooktime');
}
// show a semi-random delivery time to make it more fun
$cooktime = 0;
// start with a random prep/drive time
$time = rand(5,20);
foreach($item as $i) {
// get the longest cooktime of all items in the cart
if ($cooktime < $i->cooktime) {
$cooktime = $i->cooktime;
}
}
// add the cooktime to the random prep/drive time
$time+=$cooktime;
// turn it into minutes from *right now*
$delivery = strtotime(now())+($time*60);
$name = $request->name ?? $user->name;
$address = $request->address ?? $user->address;
if (AppHelper::instance()->checkDB() && Schema::hasTable('carts') && $cart_id!='session') {
// update cart to 'closed'
Cart::where('id', $cart_id)->update(['status' => 'closed']);
// save to order table
$order = new Order([
'user_id' => $user->id,
'cart_id' => $cart_id,
'name' => $name,
'address' => $address,
'special_instructions' => $request->special_instructions,
'cooktime' => $time
]);
$order->save();
}
// clear all the sessions
session()->forget('cart');
session()->forget('cart_id');
session()->forget('receipt');
session([ 'receipt' => ['created_at'=>strtotime(now()), 'delivery'=>$delivery] ]);
}
// redirect to the receipt page
return redirect()->route('receipt');
}
public function receipt()
{
$time_left = 0;
// use the receipt session or display a generic message
$receipt = session('receipt');
if ($receipt) {
// figure out how many minutes are left before food arrives
$time_left = floor( ($receipt['delivery'] - strtotime(now()) )/60 );
}
return view('receipt', ['header'=>1, 'receipt'=>$receipt, 'time_left'=>$time_left]);
}
// ajax:
public function addToCart(Request $request)
{
$id = $request->item;
if (!session('cart')) {
session([ 'cart' => [] ]);
}
$cart = session('cart');
if (isset($cart[$id])) {
$cart[$id]++;
} else {
$cart[$id] = 1;
}
session(['cart' => $cart]);
// update the floating cart
$global_cart = AppHelper::instance()->globalCart();
return $global_cart;
}
public function updateCart(Request $request)
{
$item = $request->cart_items;
$cart = session('cart');
foreach ($item as $id => $qty) {
if (isset($cart[$id]) && $qty<1) {
unset($cart[$id]);
} else {
$cart[$id] = $qty;
}
}
session(['cart' => $cart]);
// update the floating cart
$global_cart = AppHelper::instance()->globalCart('show');
return $global_cart;
}
}