Setelah data products populer berhasil ditampilkan, maka sekarang kita akan lanjutkan belajar menampilkan data product yang terbaru.
Langkah 1 - Get Data Products terbaru di Class Component
Silahkan teman-teman buka file app/Livewire/Web/Home/Index.php, kemudian ubah kode-nya menjadi seperti berikut ini.
php
<?php
namespace App\Livewire\Web\Home;
use App\Models\Slider;
use App\Models\Product;
use Livewire\Component;
use App\Models\Category;
class Index extends Component
{
/**
* getPopularProducts
*
* @return void
*/
protected function getPopularProducts()
{
return Product::with('category', 'ratings.customer')
->withAvg('ratings', 'rating') // Menghitung rata-rata rating
->having('ratings_avg_rating', '>=', 4)
->limit(5) // Batas jumlah produk
->get();
}
/**
* getLatestProducts
*
* @return void
*/
protected function getLatestProducts()
{
//get products
return Product::query()
->with('category', 'ratings.customer')
->withAvg('ratings', 'rating')
->limit(5)
->orderBy('created_at', 'desc')
->get();
}
public function render()
{
return view('livewire.web.home.index', [
//get sliders
'sliders' => Slider::latest()->get(),
//get categories
'categories' => Category::latest()->get(),
//get popular products
'popularProducts' => $this->getPopularProducts(),
//get latest products
'latestProducts' => $this->getLatestProducts(),
]);
}
}
Dari perubahan kode di atas, kita menambahkan method baru dengan nama getLatestProducts.
csharp
protected function getLatestProducts()
{
//...
}
Di dalamnya, kita melakukan get data products terbaru dengan cara mengurutkan berdasarkan tanggal pembuatannya.
php
//get products
return Product::query()
->with('category', 'ratings.customer')
->withAvg('ratings', 'rating')
->limit(5)
->orderBy('created_at', 'desc')
->get();
Kemudian di dalam method render kita akan mengirimkan data di atas ke dalam view component.
ini
'latestProducts' => $this->getLatestProducts(),
Langkah 2 - Membuat Component Card Product
Component ini berbeda dengan component card product populer sebelumnya, karena untuk design UI-nya dibedakan.
Silahkan teman-teman jalankan perintah berikut ini di dalam terminal/CMD dan pastikan berada di dalam project Laravel-nya.
go
php artisan make:component cards.product --view
Jika perintah di atas berhasil dijalankan, maka akan mendapatkan 1 file baru yang ada di dalam folder resources/views/components/cards/product.blade.php.
Silahkan buka file tersebut, kemudian ubah semua kode-nya menjadi seperti berikut ini.
javascript
<div class="card rounded border-0 shadow-sm mb-3">
<div class="row g-0">
<div class="col-5 col-md-4">
<a href="/products/{{ $product->slug }}" class="text-decoration-none" wire:navigate>
<img src="{{ asset('/storage/' . $product->image) }}" class="img-fluid w-100 h-100 object-fit-cover rounded-start" alt="...">
</a>
</div>
<div class="col-7 col-md-8">
<div class="card-body">
<a href="/products/{{ $product->slug }}" class="text-decoration-none text-dark" wire:navigate>
<h6 class="card-title">{{ $product->title }}</h6>
</a>
<p class="fw-bold text-success mt-3">Rp. {{ number_format($product->price) }}</p>
<div class="d-flex justify-content-between mt-5">
<div class="mt-3">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-star-fill text-orange mb-1 me-2" viewBox="0 0 16 16">
<path d="M3.612 15.443c-.386.198-.824-.149-.746-.592l.83-4.73L.173 6.765c-.329-.314-.158-.888.283-.95l4.898-.696L7.538.792c.197-.39.73-.39.927 0l2.184 4.327 4.898.696c.441.062.612.636.282.95l-3.522 3.356.83 4.73c.078.443-.36.79-.746.592L8 13.187l-4.389 2.256z" />
</svg>
<span class="fw-bold">{{ number_format($product->ratings_avg_rating, 1) }}</span>
</div>
<div>
<!-- button add to cart -->
</div>
</div>
</div>
</div>
</div>
</div>
Untuk data yang ditampilkan hampir sama saja dengan yang ada di dalam component card product populer.
Langkah 3 - Menampilkan Data Products Terbaru
Sekarang kita akan menampilkan data products terbaru pada halaman home menggunakan perulangan, yaitu tepatnya menggunakan directive @foreach.
Silahkan teman-teman buka file resources/views/livewire/web/home/index.blade.php, kemudian ubah kode-nya menjadi seperti berikut ini.
typescript
@section('title')
Food Store - 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" style="margin-bottom: 120px">
<!-- Search Bar -->
<x-utils.search-bar />
<!-- Sliders -->
<div class="row justify-content-center mt-4">
<div class="col-md-6">
<div id="carouselExample" class="carousel slide w-100">
<div class="carousel-inner">
@foreach ($sliders as $key => $slider)
<div class="carousel-item @if($key == 0) active @endif">
<img src="{{ asset('/storage/' . $slider->image) }}" class="d-block w-100 rounded">
</div>
@endforeach
</div>
<button class="carousel-control-prev" type="button" data-bs-target="#carouselExample" data-bs-slide="prev">
<span class="carousel-control-prev-icon" aria-hidden="true"></span>
<span class="visually-hidden">Previous</span>
</button>
<button class="carousel-control-next" type="button" data-bs-target="#carouselExample" data-bs-slide="next">
<span class="carousel-control-next-icon" aria-hidden="true"></span>
<span class="visually-hidden">Next</span>
</button>
</div>
</div>
</div>
<!-- Categories -->
<div class="row justify-content-center mt-4 mb-5">
<div class="col-md-6">
<span class="fs-6 fw-bold">
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="currentColor" class="bi bi-box mb-1" viewBox="0 0 16 16">
<path d="M8.186 1.113a.5.5 0 0 0-.372 0L1.846 3.5 8 5.961 14.154 3.5zM15 4.239l-6.5 2.6v7.922l6.5-2.6V4.24zM7.5 14.762V6.838L1 4.239v7.923zM7.443.184a1.5 1.5 0 0 1 1.114 0l7.129 2.852A.5.5 0 0 1 16 3.5v8.662a1 1 0 0 1-.629.928l-7.185 2.874a.5.5 0 0 1-.372 0L.63 13.09a1 1 0 0 1-.63-.928V3.5a.5.5 0 0 1 .314-.464z" />
</svg>
CATEGORIES
</span>
<hr />
<div class="row flex-nowrap overflow-auto scroll-custom">
@foreach ($categories as $category)
<x-cards.category :category="$category" />
@endforeach
</div>
</div>
</div>
<!-- Products Popular -->
<div class="row justify-content-center mt-5">
<div class="col-md-6">
<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 class="text-orange">POPULER</span>
</span>
</div>
<div>
<a href="/products" wire:navigate class="text-decoration-none text-orange fw-bold">
Lihat Lainnya
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-arrow-right" viewBox="0 0 16 16">
<path fill-rule="evenodd" d="M1 8a.5.5 0 0 1 .5-.5h11.793l-3.147-3.146a.5.5 0 0 1 .708-.708l4 4a.5.5 0 0 1 0 .708l-4 4a.5.5 0 0 1-.708-.708L13.293 8.5H1.5A.5.5 0 0 1 1 8" />
</svg>
</a>
</div>
</div>
<hr />
<div class="row flex-nowrap overflow-auto scroll-custom">
@foreach ($popularProducts as $product)
<x-cards.product-popular :product="$product" />
@endforeach
</div>
</div>
</div>
<!-- Products Latest -->
<div class="row justify-content-center mt-5">
<div class="col-md-6">
<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 class="text-orange">TERBARU</span>
</span>
</div>
<div>
<a href="/products" wire:navigate class="text-decoration-none text-orange fw-bold">
Lihat Lainnya
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-arrow-right" viewBox="0 0 16 16">
<path fill-rule="evenodd" d="M1 8a.5.5 0 0 1 .5-.5h11.793l-3.147-3.146a.5.5 0 0 1 .708-.708l4 4a.5.5 0 0 1 0 .708l-4 4a.5.5 0 0 1-.708-.708L13.293 8.5H1.5A.5.5 0 0 1 1 8" />
</svg>
</a>
</div>
</div>
<hr />
<div class="row">
<div class="col-12 col-md-12 mb-2">
@foreach ($latestProducts as $product)
<x-cards.product :product="$product" />
@endforeach
</div>
</div>
</div>
</div>
</div>
</div>
Dari perubahan kode di atas, kita melakukan perulangan data products terbaru menggunakan directive @foreach.
less
@foreach ($latestProducts as $product)
//...
@endforeach
Di dalam perulangan di atas, kita memanggil component card product yang sudah kita buat sebelumnya dan di dalamnya kita tambahkan props :product yang berisi object data product dari hasil perulangan.
bash
<x-cards.product :product="$product" />
Langkah 4 - Uji Coba Menampilkan Data Products Terbaru
Sekarang silahkan reload project-nya, kemudian lihat pada halaman home, jika berhasil maka akan menampilkan hasil seperti berikut ini.
