setelah berhasil menampilkan data product pada halaman home, maka sekarang kita akan lanjutkan belajar membuat component untuk product index.
Langkah 1 - Membuat Component Products Index
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/Products/Index
Jika perintah di atas berhasil dijalankan, maka kita akan mendapatkan 2 file baru, yaitu:
- Class Component:
app/Livewire/Web/Product/Index.php - View Component:
resources/views/livewire/web/products/index.blade.php
Langkah 2 - Membuat Route Products Index
Silahkan buka file routes/web.php, kemudian ubah semua kode-nya menjadi seperti berikut ini.
php
<?php
namespace App\Livewire;
use Illuminate\Support\Facades\Route;
//route register
Route::get('/register', Auth\Register::class)->name('register');
//route login
Route::get('/login', Auth\Login::class)->name('login');
//route group account
Route::middleware('auth:customer')->group(function () {
Route::group(['prefix' => 'account'], function () {
//route my order
Route::get('/my-orders', Account\MyOrders\Index::class)->name('account.my-orders.index');
//route my order show
Route::get('/my-orders/{snap_token}', Account\MyOrders\Show::class)->name('account.my-orders.show');
//route my profile
Route::get('/my-profile', Account\MyProfile\Index::class)->name('account.my-profile');
//route password
Route::get('/password', Account\Password\Index::class)->name('account.password');
});
});
//route home
Route::get('/', Web\Home\Index::class)->name('home');
//route products index
Route::get('/products', Web\Products\Index::class)->name('web.product.index');
Dari perubahan kode di atas, kita menambahkan route baru untuk halaman products index dengan memberikan path URL /products.
Langkah 3 - Get Data Product di Class Component
Sekarang kita akan melakukan get data products pada class component, kemudian nanti akan kita kirimkan ke view component untuk ditampilkan.
Silahkan teman-teman buke file app/Livewire/Web/Products/Index.php, kemudian ubah semua kode-nya menjadi seperti berikut ini.
php
<?php
namespace App\Livewire\Web\Products;
use App\Models\Product;
use Livewire\Component;
class Index extends Component
{
public function render()
{
//get products
$products = Product::query()
->with('category', 'ratings.customer')
->withAvg('ratings', 'rating')
->when(request()->has('search'), function ($query) {
$query->where('title', 'like', '%' . request()->search . '%');
})
->simplePaginate(5);
return view('livewire.web.products.index', compact('products'));
}
}
Dari perubahan kode di atas, pertama kita import Model Product.
perl
use App\Models\Product;
Kemudian di dalam method render kita melakukan get data products ke dalam database menggunakan Model.
Dimana di dalamnya kita juga membuat kondisi untuk proses pencarian data menggunakan method when. Jadi ketika ada request dengan nama search, maka kita akan mencari data product berdasarkan title dengan isi dari request search yang dikirimkan.
php
//get products
$products = Product::query()
->with('category', 'ratings.customer')
->withAvg('ratings', 'rating')
->when(request()->has('search'), function ($query) {
$query->where('title', 'like', '%' . request()->search . '%');
})
->simplePaginate(5);
Langkah 4 - Menampilkan Data Products
Sekarang kita akan belajar menampilkan data-nya menggunakan perulangan @foreach. Silahkan teman-teman buka file resources/views/livewire/web/products/index.blade.php, kemudian ubah semua kode-nya menjadi seperti berikut ini.
typescript
@section('title')
Products - 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 class="container" style="margin-bottom: 150px">
<div class="row justify-content-center">
<div class="col-md-6">
<div class="bg-white rounded-bottom-custom shadow-sm p-3 sticky-top mb-4">
<div class="d-flex justify-content-start">
<x-buttons.back />
</div>
</div>
<div class="d-flex justify-content-between">
<div>
<span class="fs-6 fw-bold">
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="currentColor" class="bi bi-bag mb-1" viewBox="0 0 16 16">
<path d="M8 1a2.5 2.5 0 0 1 2.5 2.5V4h-5v-.5A2.5 2.5 0 0 1 8 1m3.5 3v-.5a3.5 3.5 0 1 0-7 0V4H1v10a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V4zM2 5h12v9a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1z" />
</svg>
PRODUCTS
</span>
</div>
</div>
<hr />
<div class="row">
<div class="col-12 col-md-12 mb-2">
@foreach ($products as $product)
<x-cards.product :product="$product" />
@endforeach
</div>
</div>
<!-- Navigasi Pagination -->
{{ $products->links('vendor.pagination.simple-default') }}
</div>
</div>
</div>
Dari penambahan kode di atas, kita menampilkan data-nya dengan cara me-looping (perulangan) menggunakan directive @foreach.
less
@foreach ($products as $product)
//...
@endoreach
Kemudian isinya kita panggil component card product dan kita tambahkan props :product yang mana berisi object data product hasil perulangan.
bash
<x-cards.product :product="$product" />
Dan untuk pagination, kita tampilkan seperti berikut ini.
php
{{ $products->links('vendor.pagination.simple-default') }}
Langkah 5 - Uji Coba Menampilkan Products Index
Silahkan teman-teman buka link berikut ini http://localhost:8000/products, jika berhasil maka kurang lebih hasilnya seperti berikut ini.
