feat(tours): add tour listing with pagination and routers

This commit is contained in:
2026-08-17 13:04:11 +03:30
parent 71b11b70e4
commit 1508654176
6 changed files with 118 additions and 2 deletions
+17
View File
@@ -3,10 +3,27 @@
namespace App\Http\Controllers; namespace App\Http\Controllers;
use App\Models\Tour; use App\Models\Tour;
use Carbon\Carbon;
use Illuminate\Http\Request; use Illuminate\Http\Request;
class TourController extends Controller 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) public function show(Tour $tour)
{ {
$tour->load([ $tour->load([
+4
View File
@@ -33,6 +33,10 @@ use Illuminate\Database\Eloquent\Model;
*/ */
class Tour extends Model class Tour extends Model
{ {
/**
* @var float|mixed|null
*/
public mixed $nights;
protected $table = 'tours'; protected $table = 'tours';
protected $casts = [ protected $casts = [
+3 -1
View File
@@ -3,6 +3,7 @@
namespace App\Providers; namespace App\Providers;
use Illuminate\Support\ServiceProvider; use Illuminate\Support\ServiceProvider;
use Illuminate\Pagination\Paginator;
class AppServiceProvider extends ServiceProvider class AppServiceProvider extends ServiceProvider
{ {
@@ -19,6 +20,7 @@ class AppServiceProvider extends ServiceProvider
*/ */
public function boot(): void public function boot(): void
{ {
// Paginator::useBootstrapFive();
} }
} }
+3
View File
@@ -222,7 +222,10 @@
<div class="row"> <div class="row">
<div class="col-lg-6 mx-auto wow fadeInDown" data-wow-duration="1s" data-wow-delay=".25s"> <div class="col-lg-6 mx-auto wow fadeInDown" data-wow-duration="1s" data-wow-delay=".25s">
<div class="site-heading text-center"> <div class="site-heading text-center">
<a href="{{route('tour.index')}}">
<span class="site-title-tagline">تور ها</span> <span class="site-title-tagline">تور ها</span>
</a>
<h2 class="site-title">اخرین تور های ما</h2> <h2 class="site-title">اخرین تور های ما</h2>
</div> </div>
</div> </div>
+89
View File
@@ -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
+1
View File
@@ -8,5 +8,6 @@ Route::get('/' , [IndexController::class , 'index'])->name('index');
Route::prefix('tour')->controller(TourController::class)->name('tour.')->group(function (){ Route::prefix('tour')->controller(TourController::class)->name('tour.')->group(function (){
Route::get('index' , 'index')->name('index');
Route::get('show/{tour}' , 'show')->name('show'); Route::get('show/{tour}' , 'show')->name('show');
}); });