My Course — Membangun Website Food Store Dengan Laravel Filament, Livewire dan Payment Gateway

Membuat Component Increment Qty


Jika teman-teman perhatikan, pada halaman cart index kita sudah menampilkan jumlah qty. Sekarang, kita akan membuat sebuah komponen bernama Increment Qty, yang berfungsi untuk menambahkan jumlah qty pada cart.

Langkah 1 - Membuat Component Btn Increment Qty

Silahkan teman-teman jalankan perintah berikut ini di dalam terminal/CMD dan pastikan berada di dalam project Laravel-nya.

go
php artisan make:livewire Web/Cart/BtnIncrement

Jika perintah di atas berhasil dijalankan, maka kita akan mendapatkan 2 file baru, yaitu:

  1. Class Component: app/Livewire/Web/Cart/BtnIncrement.php
  2. View Component: resources/views/livewire/web/cart/btn-increment.blade.php

Langkah 2 - Membuat Fungsi Increment Qty di Class Component

Sekarang kita lanjutkan belajar membuat fungsi increment qty pada data cart. Silahkan teman-teman buka file app/Livewire/Web/Cart/BtnIncrement.php, kemudian ubah semua kode-nya menjadi seperti berikut ini.

php
<?php namespace App\Livewire\Web\Cart; use App\Models\Cart; use Livewire\Component; class BtnIncrement extends Component { public $cart_id; public $product_id; /** * mount * * @param mixed $cart_id * @param mixed $product_id * @return void */ public function mount($cart_id, $product_id) { $this->cart_id = $cart_id; $this->product_id = $product_id; } /** * increment * * @return void */ public function increment() { $cart = Cart::find($this->cart_id); $cart->increment('qty'); //session flash session()->flash('success', 'Qty Keranjang Berhasil Ditambahkan'); //redirect return $this->redirect('/cart', navigate: true); } public function render() { return view('livewire.web.cart.btn-increment'); } }

Dari perubahan kode di atas, pertama kita import Model Cart.

perl
use App\Models\Cart;

Kemudian kita membuat 2 public properti.

php
public $cart_id; public $product_id;

Setelah itu, kita membuat method mount yang di dalamnya kita melakukan set 2 public properti di atas.

php
public function mount($cart_id, $product_id) { $this->cart_id = $cart_id; $this->product_id = $product_id; }

Selanjutnya, kita membuat method baru dengan nama increment.

csharp
public function increment() { //... }

Di dalamnya, kita mencari data cart berdasarkan ID yang dikirimkan, kemudian jika data ditemukan maka kita akan melakukan increment data qty.

php
$cart = Cart::find($this->cart_id); $cart->increment('qty');

Selanjutnya, kita buat session flash dengan status success dan kita redirect ke halaman cart index.

kotlin
//session flash session()->flash('success', 'Qty Keranjang Berhasil Ditambahkan'); //redirect return $this->redirect('/cart', navigate: true);

Langkah 3 - Membuat Button Increment

Sekarang kita akan membuat sebuah button yang nanti akan mentrigger method increment yang sudah kita buah sebelumnya di atas.

Silahkan teman-teman buka file resources/views/livewire/web/cart/btn-increment.blade.php, kemudian ubah kode-nya menjadi seperti berikut ini.

bash
<input type="button" value="+" wire:click="increment({{ $cart_id, $product_id }})" class="button-minus border-0 rounded-circle icon-shape icon-sm mx-1" data-field="quantity">

Di atas, kita memanggil method increment menggunakan event wire:click dan di dalamnya kita kirimkan data cart id dan product id.

Langkah 4 - Memanggil Component Increment di Halaman Cart

Sekarang kita lanjutkan untuk memanggil component increment pada halaman cart index. Silahkan teman-teman buka file resources/views/livewire/cart/index.blade.php, kemudian ubah semua kode-nya menjadi seperti berikut ini.

xml
@section('title') Carts - Eat Your Favorite Foods @stop @section('keywords') Food Store, Eat Your Favorite Foods @stop @section('description') Food Store - Eat Your Favorite Foods @stop @section('image') {{ asset('images/logo.png') }} @stop <div> <div class="container"> <div class="row justify-content-center mt-0" style="margin-bottom: 270px;"> <div class="col-md-6"> <div class="bg-white rounded-bottom-custom shadow-sm p-3 sticky-top mb-5"> <div class="d-flex justify-content-start"> <div> <x-buttons.back /> </div> </div> </div> <div class="row"> @forelse ($carts as $cart) <div class="col-12 col-md-12 mb-4"> <div class="card rounded border-0 shadow-sm"> <div class="row g-0"> <div class="col-5 col-md-4"> <img src="{{ asset('/storage/' . $cart->product->image) }}" class="img-fluid w-100 h-100 object-fit-cover rounded-start"> </div> <div class="col-7 col-md-8"> <div class="card-body"> <div class="d-flex justify-content-between mt-4"> <div class="text-start"> <h6 class="card-title">{{ $cart->product->title }}</h6> </div> <div class="text-end"> <!-- btn delete --> </div> </div> <div class="d-flex justify-content-between mt-4"> <div class="text-start"> <span class="text-success fw-bold">Rp. {{ number_format($cart->product->price) }}</span> </div> <div class="text-end"> <div class="input-group justify-content-center align-items-center group-btn-qty"> <!-- qty cart --> <input type="number" step="1" max="10" value="{{ $cart->qty }}" name="quantity" class="quantity-field border-0 text-center w-25" style="background: transparent;"> <!-- increment qty --> <livewire:web.cart.btn-increment :cart_id="$cart->id" :product_id="$cart->product_id" /> </div> </div> </div> </div> </div> </div> </div> </div> @empty <div class="col-12 col-md-12 mb-4"> <div class="card rounded border mb-3"> <div class="card-body"> <div class="d-flex justify-content-center"> <div class="mt-2"> <span class="fw-bold">You don't have any items in the cart.</span> </div> </div> </div> </div> </div> @endforelse </div> </div> </div> </div> @if(count($carts) > 0) <div class="container fixed-total"> <div class="row justify-content-center"> <div class="col-12 col-md-6"> <div class="card rounded shadow-sm border-0 mb-5 "> <div class="card-body"> <div class="d-flex justify-content-between"> <div> <h6 class="fw-bold mb-0">Total</h6> </div> <div class="ms-auto"> <h6 class="fw-bold mb-0">Rp. {{ number_format($totalPrice) }}</h6> </div> </div> <hr style="border: dotted 1px #e92715;"> <a href="/checkout" wire:navigate class="btn btn-orange-2 rounded border-0 shadow-sm w-100">Process to Checkout</a> </div> </div> </div> </div> </div> @endif </div>

Dari perubahan kode di atas, kita memanggil component increment qty dan di dalamnya kita memberikan 2 data props, yaitu :cart_id dan :product_id.

bash
<livewire:web.cart.btn-increment :cart_id="$cart->id" :product_id="$cart->product_id" />

Langkah 5 - Uji Coba Increment Cart

Silahkan teman-teman reload halaman cart index, jika berhasil maka kurang lebih hasilnya seperti berikut ini, yaitu akan terdapat btn qty untuk menambah jumlah qty pada cart.

Silahkan klik +, jika berhasil maka jumlah qty akan bertambah dan akan muncul alert yang berisi informasi data qty berhasil ditambahkan.