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

Membuat Component Decrement Qty


Setelah berhasil membuat component increment, maka kita akan lanjutkan membuat component untuk proses decrement atau mengurangi jumlah qty.

Langkah 1 - Membuat Component Btn Decrement 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/BtnDecrement

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

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

Langkah 2 - Membuat Fungsi Decrement Qty di Class Component

Sekarang kita lanjutkan belajar membuat fungsi increment qty pada data cart. Silahkan teman-teman buka file app/Livewire/Web/Cart/BtnDecrement.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 BtnDecrement extends Component { public $cart_id; public $product_id; public $disabled; /** * 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; } /** * decrement * * @return void */ public function decrement() { $cart = Cart::find($this->cart_id); $cart->decrement('qty'); //session flash session()->flash('success', 'Qty Keranjang Berhasil Dikurangi'); //redirect return $this->redirect('/cart', navigate: true); } public function render() { return view('livewire.web.cart.btn-decrement'); } }

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

perl
use App\Models\Cart;

Kemudian kita membuat 3 public properti.

php
public $cart_id; public $product_id; public $disabled;

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 decrement.

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

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

php
$cart = Cart::find($this->cart_id); $cart->decrement('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 Dikurangi'); //redirect return $this->redirect('/cart', navigate: true);

Langkah 3 - Membuat Button Decrement

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

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

perl
<input type="button" value="-" wire:click="decrement({{ $cart_id, $product_id }})" @if($disabled <= 1) disabled @endif class="button-minus border-0 rounded-circle icon-shape icon-sm mx-1" data-field="quantity">

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

Di atas, kita juga membuat kondisi dimana jika variable $disabled kurang dari atau sama dengan 1, maka buttonnya akan kita disable.

less
@if($disabled <= 1) disabled @endif

Langkah 4 - Memanggil Component Decrement di Halaman Cart

Sekarang kita lanjutkan untuk memanggil component decrement 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"> <!-- decrement qty --> <livewire:web.cart.btn-decrement :cart_id="$cart->id" :product_id="$cart->product_id" :disabled="$cart->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 decrement qty dan di dalamnya kita memberikan 3 data props, yaitu :cart_id, :product_id dan :disabled.

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

Langkah 5 - Uji Coba Decrement Cart

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

Silahkan klik -, jika berhasil maka jumlah qty akan dikurangi dan akan muncul alert yang berisi informasi data qty berhasil dikurangi.