Hola Geek, en esta ocasión aprenderemos a realizar un carrito de compras haciendo uso del paquete "darryldecode/laravelshoppingcart" que ofrece gran facilidad a la hora de construir nuestro carrito de compras, el paquete maneja carrito para usuarios autenticados con sessiones especificas o bien un carrito cuando no requieres estar autenticado. Este paquete es de código abierto y con una licencia MIT.
Manos a la obra
Instalando paquetes
Lo primero que haremos es instalar el paquete darryldecode/laravelshoppingcart. Desde la consola, por medio de composer:
composer require "darryldecode/cart"
Abrimos config/app.php
y agregamos la siguiente línea en el array de "Providers".
Darryldecode\Cart\CartServiceProvider::class,
Agregamos la siguiente línea en "Aliases"
'Cart' => Darryldecode\Cart\Facades\CartFacade::class,
Opcional: Puedes editar el archivos de configuration (Si deseas tener todo el control de configuración) escribiendo:
php artisan vendor:publish --provider="Darryldecode\Cart\CartServiceProvider" --tag="config"
Este comando generará un archivo de configuración en config/shopping_cart.php
para este pequeño ejemplo, no será necesario editar este archivo. Pero te recomiendo leer la documentación de este paquete.
Creando formulario para agregar items al carrito
Crearemos una nueva vista (home.blade.php
) , en la cual agregaremos productos/items a nuestro carrito mediante un formulario. La vista quedará así:
home.blade.php
<form> <div class="form-group"> <label for="id">ID</label> <input type="text" name="id" class="form-control" id="id"> </div> <div class="form-group"> <label for="name">NOMBRE</label> <input type="text" name="name" class="form-control" id="name"> </div> <div class="form-group"> <label for="price">PRECIO</label> <input type="text" name="price" class="form-control" id="price"> </div> <div class="form-group"> <label for="quantity">CANTIDAD</label> <input type="text" name="quantity" class="form-control" id="quantity"> </div> <div class="form-group"> <label for="color">COLOR</label> <select class="form-control" name="color" id="color"> <option value="blanco">blanco</option> <option value="azul"> azul</option> </select> <small class="form-text text-muted">Atributo</small> </div> <div class="form-group"> <label for="tamano">TAMAÑO</label> <select name="tamano" class="form-control" id="tamano"> <option value="chico">Chico</option> <option value="grande">Grande</option> </select> <small class="form-text text-muted">Atributo</small> </div> <button type="submit" class="btn btn-primary">Agregar al carrito</button> </form>
Agregando items al carrito
Crearemos un controlador de tipo recurso con:
php artisan make:controller CartController -r
Agregaremos la ruta para nuestro controlador en routes/web.php
Route::resource('/cart', 'CartController');
Nuestra función index()
en CartController.php
apuntará a nuestro blade con el formulario previamente creado.
public function index() { return view('home'); }
En nuestra vista home.blade.php
agregaremos el metodo (post), la ruta del controlador para almacenar el carrito (cart.store) y el csrf token:
<form method="POST" action="{{route('cart.store')}}"> @csrf
Nuestra función store() en CartController.php queda:
No olvidemos agregar el alias al controlador:
use Cart;
public function store(Request $request) { Cart::add(array( 'id' => $request->id?$request->id:'1', // inique row ID 'name' => $request->name?$request->name:'example', 'price' =>$request->price?$request->price:20.20, 'quantity' => $request->quantity?$request->quantity:1, 'attributes' => array( 'color' => $request->color?$request->color:'green', 'size' => $request->size?$request->size:'Big', ) )); return back(); }
Mostrando carrito
En nuestra blade home.blade.php
agregaremos una tabla donde visualizaremos nuestro carrito y agregaremos una columna para eliminar el item del carrito.
@if (!Cart::isEmpty()) <table class="table"> <thead> <tr> <th sc ope="col">Accion</th> <th sc ope="col">#ID</th> <th scope="col">Nombre</th> <th scope="col">Precio</th> <th scope="col">Cantidad</th> <th scope="col">Atributos</th> </tr> </thead> <tbody> @foreach (Cart::getContent() as $item) <tr> <th scope="row"> <button>Eliminar</button> </th> <th scope="row">{{$item->id}}</th> <td>{{$item->name}}</td> <td>{{$item->price}}</td> <td>{{$item->quantity}}</td> <td> @foreach ($item->attributes as $key => $attribute) {{$key}}: {{$attribute}}. @endforeach </td> </tr> @endforeach </tbody> </table> @endif
Eliminando items del carrito
En nuestra blade home.blade.php
en la tabla donde visualizamos nuestro carrito agregaremos una form para eliminar el item del carrito.
<th scope="row"> <form method="POST" action="{{route('cart.destroy',$item->id)}}"> @method('DELETE') @csrf <button type="submit">Eliminar</button> </form> </th>
En nuestra función destroy()
en el controlador CartController.php
:
public function destroy($cart) { Cart::remove($cart); return back(); }
Mostrando cantidad de items, total, sub total
Agregaremos una nueva tabla a nuestra blade:
<table class="table"> <thead> <tr> <th sc ope="col">Items</th> <th sc ope="col">Sub total</th> <th scope="col">Total</th> </tr> </thead> <tbody> <tr> <th scope="row">{{Cart::getTotalQuantity()}}</th> <th scope="row">{{Cart::getSubTotal()}}</th> <th scope="row">{{Cart::getTotal()}}</th> </tr> </tbody> </table>
Eliminando carrito
Para eliminar el carrito, solo debes llamar al metodo clear:
Cart::clear();
Actualizando carrito
Para actualizar tu carrito de compras, debes llamar al metodo update:
// si debes actualizar solo la cantidad de producto Cart::update(456, array( 'quantity' => 2, // si la cantidad actual del producto es 1, se sumarán 2 items dando como resultado 3 )); // Tambien puedes reducir la cantidad de un item especifico: Cart::update(456, array( 'quantity' => -1, // a la cantidad actual, se le restará uno ));
O bien, solo puedes llamar al metodo Add y si el itemId ya existe, los datos se reemplazarán y se sumará la cantidad actual, con la nueva cantidad dada.
Codigo fuente
https://github.com/IglesiasJavier/LaravelCart
Gracias por leer este pequeño ejemplo. Si tienes alguna pregunta o sugerencia, no dudes en dejarla en los comentarios, me gustaría saber tu opinión.