Hledám brigádu
Kdyby někdo potřeboval výpomoc formou brigády, nejraději ve fw Laravel. Tak se mi ozvěte.
Kdyby někdo potřeboval výpomoc formou brigády, nejraději ve fw Laravel. Tak se mi ozvěte.
Dneska jen takové miniaturní vylepšení po přidání zboží do košíku si zobrazíme modla okno. Upravovat budeme pouze view home.blade.php a to konkrétně že si upravíme kod pro přidání zboží do košíku, kde si předáme název a cenu zboží. …
Tak jsem se rozhodla , že e-shop si vylepším o přidání do košíku ajaxem. Aby bylo možné použít ajax POST s Laravelem je nejpreve nutné ,aby byl předán s ajaxovým požadavek i csrf_token. Více najdeme jako vždy v dokumentaci X-CSRF_TOKEN
Nejprve si upravíme master.blade.php do hlavičky přidáme
1 |
<meta name="csrf-token" content="{{ csrf_token() }}"> |
a také si zajistíme možnost přidat na konkrétní stránce javascritový kód. Takže na konec si přidáme
1 2 3 |
<script> @yield('scripts') </script> |
Nyní upravíme home.blade.php. Pro přidání zboží do košíku budeme používat
1 |
<a href="#" id="add" class="btn btn-primary" data-id="{{ $product->id }}">Koupit</a> |
a na konec souboru si přidáme kód
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 |
@section('scripts') $(document).ready(function() { $.ajaxSetup({ headers: { 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') } }); $('a#add').click( function() { var product_id = $(this).data('id'); var url = "/ajaxadd"; $.ajax({ type: "POST", url: url, data: { product_id: product_id }, success: function (msg) { var obj = JSON.parse(JSON.stringify(msg)); $('.badge').html(obj.msg); }, error: function (data) { console.log('Error:', data); } }); }); }); @stop |
aby nám vše fungovalo přidáme routu do web.php
1 |
Route::post('/ajaxadd', 'CartController@ajaxAdd'); |
a ještě do CartControlleru
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
public function ajaxAdd(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); $cart_qty = Session::get('cart') ? array_sum(array_column(Session::get('cart'), 'qty')) : 0; //return redirect()->back()->with('message', 'Product Added Successfully!'); return response()->json(['msg' => $cart_qty], 200); } |
No a nyní by nám mělo fungovat přidání zboží do košíku pomocí Ajaxu a také si prosím všimněte, že v navigaci se nám aktualizuje počet položek v košíku. Uf vypadá to jednoduše, ale vzhledem k tomu ža Ajax jsem v Laravelu použila poprvé, dalo mi to trochu zabrat
Takže dnes bych chtěla tento jednoduchý e-shop dokončit a to administrací produktů. …
Nyní by bylo vhdoné, abychom si v administraci zobrazili podrobnosti ke každé objednávce. Šablona v administraci má u čísla objednávky odkaz na detail dané objednávky, takže nezbývá než to doprogramovat. …
Dnešní část kodu mi dala asi nejvíce zabrat, protože se zde používají tzv. relationships. Takže po přihlášení do administrace budu chtít asi zobrazit přehled všech objednávek s informací o objednateli, stavu a cene objednávky. …
Takže teď začneme tvořit administraci pro náš jednoduchý e-shop. Využijeme vestavěnou adminstraci v Laravelu 5.3. Před započetím je potřeba si zazálohovat stávající e-shop. protože dojde k přepsání některých souborů a my si pak jejich obsah obnovíme ze zálohy. …
Dnes si jenom trochu rozšíříme funkcionalitu pro odeslání objednávky. Bylo by dobré, kdyby provozovatel e-shopu byl o provedené objednávce informován i mailem. Takže uložení objednávky rozšíříme o odeslání mailu. Využijeme k tomu zcela novou funkcionalitu, kterou má Laravel od verze 5.3 a to tzv. mailables viz dokumentace. …
V dnešní části dokončíme objednávku zboží, které jsme si vložili do košíku. Zobrazíme si obsah košíku a nyní je potřeba přidat kód pro tlačítko objednat. …
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