Jednoduchý e-shop Laravel 5.1 část 7
UPDATE: Začala jsem novy seriál Jednoduchý e-shop Laravel 5.3
Po delší pauze dnes dokončím náš minieshop. Zbývá nám jenom uložení objednávky.
Vytvoříme si nejprve controller pro obsluhu objednávek
1 |
php artisan make:controller CheckoutController --plain |
a přidáme si zobrazení
1 2 3 4 |
public function index() { return view('checkout'); } |
dále vytvoříme view. Na začátku view si nejprve zobrazíme případné validační chyby po odeslání formuláře, které laravel automaticky ukládá do seession.
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 56 57 58 59 60 61 62 63 64 65 66 67 |
@extends('layouts.master') @section('content') @if (count($errors) > 0) <div class="alert alert-danger"> <ul> @foreach ($errors->all() as $error) <li>{{ $error }}</li> @endforeach </ul> </div> @endif <div class="col-md-6"> <form class="form-horizontal" method="post" action="{{ URL::to('checkout') }}"> {{ csrf_field() }} <div class="form-group"> <label for="firstname" class="control-label col-xs-2">Jméno</label> <div class="col-xs-10"> <input type="text" name="firstname" class="form-control" id="firstname" placeholder="Jméno"> </div> </div> <div class="form-group"> <label for="lastname" class="control-label col-xs-2">Příjmení</label> <div class="col-xs-10"> <input type="text" name="lastname" class="form-control" id="inputPassword" placeholder="Příjmení"> </div> </div> <div class="form-group"> <label for="street" class="control-label col-xs-2">Ulice, č.p</label> <div class="col-xs-10"> <input type="text" class="form-control" name="street" id="inputPassword" placeholder="Ulice, č.p"> </div> </div> <div class="form-group"> <label for="town" class="control-label col-xs-2">Město</label> <div class="col-xs-10"> <input type="text" class="form-control" name="city" id="inputPassword" placeholder="Město"> </div> </div> <div class="form-group"> <label for="town" class="control-label col-xs-2">PSČ</label> <div class="col-xs-10"> <input type="text" name="psc" class="form-control" name="strerrt" id="inputPassword" placeholder="PSČ"> </div> </div> <div class="form-group"> <label for="town" class="control-label col-xs-2">email</label> <div class="col-xs-10"> <input type="email" class="form-control" name="email" id="inputPassword" placeholder="email"> </div> </div> <div class="form-group"> <label for="town" class="control-label col-xs-2">Telefon</label> <div class="col-xs-10"> <input type="text" class="form-control" name="phone" id="inputPassword" placeholder="Telefon"> </div> </div> <div class="form-group"> <div class="col-xs-offset-2 col-xs-10"> <button type="submit" class="btn btn-primary">Odeslat</button> </div> </div> </form> </div> @endsection |
a do routes.php přidáme
1 |
Route::get('/checkout','CheckoutController@index'); |
Nyní , když v košíku kilkneme na tlačítko objedntat zobrazí se nám formulář pro odeslání objednávky.
Nyní bychom měli odeslaný a vyplněný formulář zpracovat, takže do routes přidáme
1 |
Route::post('/checkout', 'CheckoutController@add'); |
a do CheckoutControlleru přidáme
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 |
public function add(Request $request) { $this->validate($request, [ 'firstname' => 'required', 'lastname' => 'required', 'street' => 'required', 'city' => 'required', 'psc' => 'required', 'email' => 'required|email', 'phone' => 'required' ]); $customer = new Customer($request->all()); $customer->save(); $customer_id= $customer->id; $order = new Order(['user_id' => $customer_id, 'status' => 0]); $order->save(); $order_id = $order->id; $cartData = $request->session()->get('cart'); $email_data = array(); $id = 1; foreach ($cartData as $key => $value) { $product = Product::where('id','=',$key)->get()->toArray(); $price = $value['qty']*$product['0']['price']; $order_item = new Order_item([ 'order_id' => $order_id, 'product_id' => $key, 'quantity' => $value['qty'], 'price' => $price ]); $order_item->save(); $email_data[$id]['product'] = $product['0']['name']; $email_data[$id]['qty'] = $value['qty']; $email_data[$id]['total'] = $price; $id++; } session()->forget('cart'); session()->forget('total'); Mail::send(['text'=>'emails.order'], ['customer' => $customer, 'data' => $email_data], function ($m) use ($customer) { $m->from('admin@eshop.cz')->to($customer->email, $customer->lastname)->subject('Objednávka e-shop'); }); return redirect('/')->with('message', 'Vaše objednávka byla odeslána'); } |
Na začátku jsou validační pravidla. Pokud validační pravidla nejsou splněna zobrazí se formulář znovu a nad ním jsou uvedeny validační chyby. Pokud validace prošla nejprve uložíme do databáze informace o zákazníkovi a pak uložíme samotnou objednávku do tabulek orders a order_item. Nakonec vytvoříme a odešleme zákazníkovi mail s informací o přijetí objednávky a přesměrujeme jej na úvodní stránku e-shopu. Aby nám to , ale fungovalo musíme si nejprve vytvořit modely pro zákazníka a objednávky.
1 2 3 4 5 6 7 8 9 10 |
<?php namespace App; use Illuminate\Database\Eloquent\Model; class Customer extends Model { protected $fillable = ['firstname', 'lastname', 'street', 'city','psc','email','phone']; } |
1 2 3 4 5 6 7 8 9 10 |
<?php namespace App; use Illuminate\Database\Eloquent\Model; class Order extends Model { protected $fillable = ['user_id', 'status']; } |
1 2 3 4 5 6 7 8 9 10 |
<?php namespace App; use Illuminate\Database\Eloquent\Model; class Order_item extends Model { protected $fillable = ['order_id', 'product_id', 'quantity', 'price']; } |
Ještě přidáme view pro odesílaný mail do
1 2 3 4 5 6 7 8 9 10 |
Dobrý den, uživatel {{ $customer['firstname'] }} {{ $customer['lastname'] }} provedl v našem e-shopu objednávku. Objednávka obsahuje @foreach($data as $row) {{ $row['product'] }} množství {{ $row['qty'] }} cena {{ $row['total'] }}. {{ PHP_EOL }} @endforeach Děkujeme za objednávku |
A tímto máme náš primitivní e-shop dokončen. Klidně můžete vyzkoušet shop.cohledam.cz.
Doplněno: Zvažuji ještě přidat jednoduchou administraci, ale nechce se mi to psát jen tak do větru. Má o to někdo zájem?
3 thoughts on “Jednoduchý e-shop Laravel 5.1 část 7”
Ahoj,
velmi vynikajuci prehlad tvorby e-shopu. Nie zbytocne vela omacok a pritom velmi napomocne … Dakujeme
Taktiez ja osobne by som velmi uvital aj doplnenie jednoduchej administracie .. 😉
V návazném seriálu je základ administrace popsán https://www.cohledam.cz/php/laravel/jednoduchy-e-shop-laravel-5-3-cast-6-zaklad-administracni-casti/
Super,
uz som ho nasiel … paradicka …
Este raz vdaka