feat(tours): add tour listing with pagination and routers
This commit is contained in:
@@ -3,10 +3,27 @@
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Models\Tour;
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class TourController extends Controller
|
||||
{
|
||||
|
||||
|
||||
public function index()
|
||||
{
|
||||
$tours = Tour::with('tour_details')->latest()->paginate(6);
|
||||
|
||||
$tours->each(function ($tour) {
|
||||
$detail = $tour->tour_details->first();
|
||||
|
||||
$tour->nights = $detail
|
||||
? Carbon::parse($detail->start_date)->diffInDays(Carbon::parse($detail->end_date))
|
||||
: null;
|
||||
});
|
||||
|
||||
return view('tours.index', compact('tours'));
|
||||
}
|
||||
public function show(Tour $tour)
|
||||
{
|
||||
$tour->load([
|
||||
|
||||
@@ -33,6 +33,10 @@ use Illuminate\Database\Eloquent\Model;
|
||||
*/
|
||||
class Tour extends Model
|
||||
{
|
||||
/**
|
||||
* @var float|mixed|null
|
||||
*/
|
||||
public mixed $nights;
|
||||
protected $table = 'tours';
|
||||
|
||||
protected $casts = [
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
namespace App\Providers;
|
||||
|
||||
use Illuminate\Support\ServiceProvider;
|
||||
use Illuminate\Pagination\Paginator;
|
||||
|
||||
class AppServiceProvider extends ServiceProvider
|
||||
{
|
||||
@@ -19,6 +20,7 @@ class AppServiceProvider extends ServiceProvider
|
||||
*/
|
||||
public function boot(): void
|
||||
{
|
||||
//
|
||||
Paginator::useBootstrapFive();
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -222,7 +222,10 @@
|
||||
<div class="row">
|
||||
<div class="col-lg-6 mx-auto wow fadeInDown" data-wow-duration="1s" data-wow-delay=".25s">
|
||||
<div class="site-heading text-center">
|
||||
<a href="{{route('tour.index')}}">
|
||||
<span class="site-title-tagline">تور ها</span>
|
||||
|
||||
</a>
|
||||
<h2 class="site-title">اخرین تور های ما</h2>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -0,0 +1,89 @@
|
||||
@extends('layouts.app')
|
||||
|
||||
@section('content')
|
||||
<main class="main">
|
||||
|
||||
<div class="site-breadcrumb" style="background: url({{asset('assets/img/breadcrumb/02.jpg')}})">
|
||||
<div class="container">
|
||||
<h2 class="breadcrumb-title">تور با عرض کامل</h2>
|
||||
<ul class="breadcrumb-menu">
|
||||
<li><a href="{{route('index')}}">صفحه اصلی</a></li>
|
||||
<li class="active">تور با عرض کامل</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
<div class="tour-grid py-120">
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
|
||||
<div class="col-lg-12 col-xl-12">
|
||||
<div class="col-md-12">
|
||||
<div class="booking-sort">
|
||||
<h5>{{ $tours->total() }} نتیجه پیدا شد</h5>
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
@forelse($tours as $tour)
|
||||
<div class="col-md-6 col-lg-4">
|
||||
<div class="tour-item">
|
||||
<div class="tour-img">
|
||||
<img src="{{ $tour->file ? asset('storage/'.$tour->file->path) : asset('assets/img/tour/01.jpg') }}" alt="{{ $tour->title }}">
|
||||
<a href="#" class="add-wishlist"><i class="far fa-heart"></i></a>
|
||||
</div>
|
||||
<div class="tour-content">
|
||||
<div class="tour-top">
|
||||
<a href="#" class="tour-category"><i class="far fa-tag"></i> {{ $tour->tour_type }}</a>
|
||||
<span class="tour-place"><i class="far fa-earth-americas"></i> {{ $tour->destinationAirport->city ?? '' }}</span>
|
||||
</div>
|
||||
<h4 class="tour-title"><a href="{{ route('tour.show', $tour->id) }}">{{ $tour->title }}</a></h4>
|
||||
<p><i class="far fa-location-dot"></i> {{ $tour->summary }}</p>
|
||||
<div class="tour-duration">
|
||||
<i class="far fa-clock"></i>
|
||||
@if($tour->nights)
|
||||
سفر {{ $tour->nights + 1 }} روز و {{ $tour->nights }} شب
|
||||
@endif
|
||||
</div>
|
||||
<div class="tour-bottom">
|
||||
<div class="tour-price">
|
||||
@if($tour->price)
|
||||
از <span>{{ number_format($tour->price) }} تومان</span>
|
||||
@endif
|
||||
</div>
|
||||
<div class="tour-text-btn">
|
||||
<a href="{{ route('tour.show', $tour->id) }}">بیشتر ببین <i class="fas fa-arrow-left"></i></a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@empty
|
||||
<div class="col-12">
|
||||
<p>هیچ توری یافت نشد.</p>
|
||||
</div>
|
||||
@endforelse
|
||||
|
||||
<div class="pagination-area">
|
||||
<div aria-label="Page navigation example">
|
||||
{{ $tours->links() }}
|
||||
</div>
|
||||
<div class="pagination-showing">
|
||||
<p>نمایش {{ $tours->firstItem() }} - {{ $tours->lastItem() }} از {{ $tours->total() }} تور</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</main>
|
||||
|
||||
@endsection
|
||||
@@ -8,5 +8,6 @@ Route::get('/' , [IndexController::class , 'index'])->name('index');
|
||||
|
||||
|
||||
Route::prefix('tour')->controller(TourController::class)->name('tour.')->group(function (){
|
||||
Route::get('index' , 'index')->name('index');
|
||||
Route::get('show/{tour}' , 'show')->name('show');
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user