Jednoduchý e-shop Laravel 5.3 část 3 – košík a přidání zboží do něj
Pokračujeme tedy dál no homepage máme zobrazení košíku a teď bychom chtěli zboží přidat do košíku a po té zobrazit zboží v košíku. Obsah košíku uložíme do session .
Takže do routes/web.php si přidáme dvě routy a to pro přidání zboží do košíku a také pro zobrazení košíku.
1 2 |
Route::post('/addcart', 'CartController@postAdd'); Route::get('/cart','CartController@index'); |
a vytvoříme si CartController
1 |
php artisan make:controller CartController |
a upravíme takto
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Product; class CartController extends Controller { public function index(Request $request) { $cartData = $request->session()->get('cart'); $cart = []; $sum = 0; if ($request->session()->has('cart')) { foreach ($cartData as $key => $value) { $product = Product::where('id', '=', $key)->get()->toArray(); $cart_item['item'] = $product['0']; $cart_item['total_price'] = $value['qty'] * $product['0']['price']; $cart_item['qty'] = $value['qty']; $sum = $sum + $cart_item['total_price']; array_push($cart, $cart_item); } } return view('cart')->with('cart',$cart)->with('sum',$sum); } public function postAdd(Request $request) { $id = $request->input('product_id'); $session = $request->session(); $cartData = ($session->get('cart')) ? $session->get('cart') : array(); if (array_key_exists($id, $cartData)) { $cartData[$id]['qty']++; } else { $cartData[$id] = array( 'qty' => 1 ); } $request->session()->put('cart', $cartData); return redirect()->back()->with('message', 'Prodcut Added Successfully!'); } } |
funkce postAdd nám slouží pro přidání zboží z homepage do košíku a a index nám zobrazí aktuální obsah košíku. Ještě musíme připravit view pro zobrazení košíku. V resources/views založíme cart.blade.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
@extends('layouts.master') @section('title','HomePage'); @section('content') <table id="cart" class="table table-hover table-condensed"> <thead> <tr> <th style="width:50%">Product</th> <th style="width:10%">Cena</th> <th style="width:8%">Množství</th> <th style="width:22%" class="text-center">Součet</th> <th style="width:10%"></th> </tr> </thead> <tbody> @foreach ($cart as $cart_item) <tr> <td data-th="Product"> <div class="row"> <div class="col-sm-2 hidden-xs"><img src="http://placehold.it/100x100" alt="..." class="img-responsive"/></div> <div class="col-sm-10"> <h4 class="nomargin">{{ $cart_item['item']['name'] }}</h4> <p>{{ $cart_item['item']['description'] }}</p> </div> </div> </td> <td data-th="Price">{{ number_format($cart_item['item']['price'], 2, ',', ' ').' Kč' }}</td> <td data-th="Quantity" class="text-center"> {{--<input type="number" class="form-control text-center" value="{{ $cart_item['qty'] }}">--}} {{ $cart_item['qty'] }} </td> <td data-th="Subtotal" class="text-center">{{ number_format($cart_item['total_price'], 2, ',', ' ').' Kč' }}</td> <td class="actions" data-th=""> {{--<button class="btn btn-info btn-sm"><i class="fa fa-refresh"></i></button>--}} <a href="{{ URL::to('/cartdelete/'.$cart_item['item']['id'] ) }} " class="btn btn-danger btn-sm"><i class="fa fa-trash-o"></i></a> </td> </tr> @endforeach </tbody> <tfoot> <tr class="visible-xs"> <td class="text-center"><strong>{{ $sum }}</strong></td> </tr> <tr> <td><a href="{{ URL::to('/') }}" class="btn btn-warning"><i class="fa fa-angle-left"></i> Pokračovat v nákupu</a></td> <td colspan="2" class="hidden-xs"></td> <td class="hidden-xs text-center"><strong>{{ number_format($sum, 2, ',', ' ').' Kč' }}</strong></td> <td><a href="{{ URL::to('checkout') }}" class="btn btn-success btn-block">Objednat <i class="fa fa-angle-right"></i></a></td> </tr> </tfoot> </table> @stop |
Ještě drobná úprava css stylu pro správné zobrazení v public/css/styles.css
1 2 3 |
body { padding-top:70px; } |
No ještě by to chtělo vedle ikonky košíku na homepage zobrazit aktuální množství položek v košíku.
Takže upravíme resources/view/layouts/master.blade.php
1 |
<li><a href="{{ URL::to('cart') }}"><i class="glyphicon glyphicon-shopping-cart"></i> Košík <span class="badge">{{ $cart_qty }}</span></a></li> |
nyní nám ovšem e-shop přestane fungovat jelikož proměnnou $cart_qty je potřeba naplnit a k tomu využijeme tzv. view composer a to konkrétně v app/providers/AppServiceProvider.php upravíme funcki
1 2 3 4 5 6 7 |
public function boot() { View::composer('layouts.master', function($view) { $cart_qty = Session::get('cart') ? array_sum(array_column(Session::get('cart'), 'qty')) : 0; $view->with('cart_qty',$cart_qty); }); } |
No a nyní by nám již všechno mělo fungovat