feat: display tours dynamically on index page

This commit is contained in:
2026-08-16 16:58:45 +03:30
parent 374c96bb79
commit 95cc970b07
9 changed files with 114 additions and 233 deletions
+9 -1
View File
@@ -2,6 +2,8 @@
namespace App\Http\Controllers; namespace App\Http\Controllers;
use App\Models\Flight;
use App\Models\Tour;
use Illuminate\Http\Request; use Illuminate\Http\Request;
class IndexController extends Controller class IndexController extends Controller
@@ -9,6 +11,12 @@ class IndexController extends Controller
// //
public function index() public function index()
{ {
return view('index'); $tours = Tour::query()
->with(['file', 'tour_details','originAirport' , 'destinationAirport'])
->orderByDesc('created_at')
->limit(4)
->get();
return view('index' , compact('tours'));
} }
} }
+21
View File
@@ -0,0 +1,21 @@
<?php
namespace App\Http\Controllers;
use App\Models\Tour;
use Illuminate\Http\Request;
class TourController extends Controller
{
public function show(Tour $tour)
{
$tour->load([
'tour_details',
'originAirport',
'destinationAirport',
'file',
]);
return view('tours.show', compact('tour'));
}
}
+11
View File
@@ -21,6 +21,7 @@ use Illuminate\Database\Eloquent\Model;
* @property Carbon $updated_at * @property Carbon $updated_at
* *
* @property Collection|Flight[] $flights * @property Collection|Flight[] $flights
* @property Collection|Tour[] $tours
* *
* @package App\Models * @package App\Models
*/ */
@@ -38,4 +39,14 @@ class Airport extends Model
{ {
return $this->hasMany(Flight::class, 'origin_airports_id'); return $this->hasMany(Flight::class, 'origin_airports_id');
} }
public function originTours()
{
return $this->hasMany(Tour::class, 'origin_airports_id');
}
public function destinationTours()
{
return $this->hasMany(Tour::class, 'destination_airports_id');
}
} }
+22 -4
View File
@@ -15,14 +15,18 @@ use Illuminate\Database\Eloquent\Model;
* *
* @property int $id * @property int $id
* @property string $title * @property string $title
* @property int $file_id * @property int|null $file_id
* @property string $tour_type * @property string $tour_type
* @property string $summary * @property string $summary
* @property string $description * @property string $description
* @property Carbon $created_at * @property Carbon $created_at
* @property Carbon $updated_at * @property Carbon $updated_at
* @property int $origin_airports_id
* @property int $destination_airports_id
* *
* @property File $file * @property Airport $originAirport
* @property Airport $destinationAirport
* @property File|null $file
* @property Collection|TourDetail[] $tour_details * @property Collection|TourDetail[] $tour_details
* *
* @package App\Models * @package App\Models
@@ -32,7 +36,9 @@ class Tour extends Model
protected $table = 'tours'; protected $table = 'tours';
protected $casts = [ protected $casts = [
'file_id' => 'int' 'file_id' => 'int',
'origin_airports_id' => 'int',
'destination_airports_id' => 'int'
]; ];
protected $fillable = [ protected $fillable = [
@@ -40,9 +46,21 @@ class Tour extends Model
'file_id', 'file_id',
'tour_type', 'tour_type',
'summary', 'summary',
'description' 'description',
'origin_airports_id',
'destination_airports_id'
]; ];
public function originAirport()
{
return $this->belongsTo(Airport::class, 'origin_airports_id');
}
public function destinationAirport()
{
return $this->belongsTo(Airport::class, 'destination_airports_id');
}
public function file() public function file()
{ {
return $this->belongsTo(File::class); return $this->belongsTo(File::class);
@@ -0,0 +1,33 @@
<div class="col-md-6 col-lg-3">
<div class="activity-item wow fadeInUp" data-wow-duration="1s" data-wow-delay=".25s">
<div class="activity-img">
<img src="assets/img/activity/01.jpg" alt>
<a href="{{route('tour.show' , $card->id)}}" class="add-wishlist"><i class="far fa-heart"></i></a>
</div>
<div class="activity-content">
<h4 class="activity-title"><a href="{{route('tour.show' , $card->id)}}">{{$card->title}}</a></h4><span
class="activity-rate-type">{{$card->tour_type}}</span>
<div class="activity-rate " style="">
<span class="badge"><i class="fal form-group-icon"></i> {{$card->tour_details->first()?->capacity}}</span>
<span class="activity-rate-review">{{ $card->originAirport->city }} -> {{ $card->destinationAirport->city }}</span>
</div>
<div class="activity-bottom">
<div class="activity-price">
<span class="activity-price-amount">
{{ number_format($card->tour_details->first()?->price) }} تومان
</span>
</div>
<div class="activity-text-btn">
<a href="{{route('tour.show' , $card->id)}}">نمایش جزئیات <i class="fas fa-arrow-left"></i></a>
</div>
</div>
</div>
</div>
</div>
+7 -205
View File
@@ -222,215 +222,17 @@
<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">
<span class="site-title-tagline">فعالیت</span> <span class="site-title-tagline">تور ها</span>
<h2 class="site-title">محبوب ترین فعالیت های ما</h2> <h2 class="site-title">اخرین تور های ما</h2>
</div> </div>
</div> </div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-md-6 col-lg-3"> @foreach($tours as $card)
<div class="activity-item wow fadeInUp" data-wow-duration="1s" data-wow-delay=".25s"> @include('components.flightcard')
<div class="activity-img"> @endforeach
<img src="assets/img/activity/01.jpg" alt>
<a href="#" class="add-wishlist"><i class="far fa-heart"></i></a>
</div>
<div class="activity-content">
<h4 class="activity-title"><a href="#">کوهنوردی برفی</a></h4>
<p><i class="far fa-location-dot"></i> 25/B جاده میلف خیابان انقلاب</p>
<div class="activity-rate">
<span class="badge"><i class="fal fa-star"></i> 5.0</span>
<span class="activity-rate-type">عالی</span>
<span class="activity-rate-review">(2.5k بررسی)</span>
</div>
<div class="activity-bottom">
<div class="activity-price">
<span class="activity-price-amount">30 تومان</span>
</div>
<div class="activity-text-btn">
<a href="#">نمایش جزئیات <i class="fas fa-arrow-left"></i></a>
</div>
</div>
</div>
</div>
</div>
<div class="col-md-6 col-lg-3">
<div class="activity-item wow fadeInUp" data-wow-duration="1s" data-wow-delay=".50s">
<div class="activity-img">
<img src="assets/img/activity/02.jpg" alt>
<a href="#" class="add-wishlist"><i class="far fa-heart"></i></a>
</div>
<div class="activity-content">
<h4 class="activity-title"><a href="#">کوهنوردی برفی</a></h4>
<p><i class="far fa-location-dot"></i> 25/B جاده میلف خیابان انقلاب</p>
<div class="activity-rate">
<span class="badge"><i class="fal fa-star"></i> 5.0</span>
<span class="activity-rate-type">عالی</span>
<span class="activity-rate-review">(2.5k بررسی)</span>
</div>
<div class="activity-bottom">
<div class="activity-price">
<span class="activity-price-amount">30 تومان</span>
</div>
<div class="activity-text-btn">
<a href="#">نمایش جزئیات <i class="fas fa-arrow-left"></i></a>
</div>
</div>
</div>
</div>
</div>
<div class="col-md-6 col-lg-3">
<div class="activity-item wow fadeInUp" data-wow-duration="1s" data-wow-delay=".75s">
<div class="activity-img">
<span class="badge">ویژه</span>
<img src="assets/img/activity/03.jpg" alt>
<a href="#" class="add-wishlist"><i class="far fa-heart"></i></a>
</div>
<div class="activity-content">
<h4 class="activity-title"><a href="#">کوهنوردی برفی</a></h4>
<p><i class="far fa-location-dot"></i> 25/B جاده میلف خیابان انقلاب</p>
<div class="activity-rate">
<span class="badge"><i class="fal fa-star"></i> 5.0</span>
<span class="activity-rate-type">عالی</span>
<span class="activity-rate-review">(2.5k بررسی)</span>
</div>
<div class="activity-bottom">
<div class="activity-price">
<span class="activity-price-amount">30 تومان</span>
</div>
<div class="activity-text-btn">
<a href="#">نمایش جزئیات <i class="fas fa-arrow-left"></i></a>
</div>
</div>
</div>
</div>
</div>
<div class="col-md-6 col-lg-3">
<div class="activity-item wow fadeInUp" data-wow-duration="1s" data-wow-delay="1s">
<div class="activity-img">
<img src="assets/img/activity/04.jpg" alt>
<a href="#" class="add-wishlist"><i class="far fa-heart"></i></a>
</div>
<div class="activity-content">
<h4 class="activity-title"><a href="#">کوهنوردی برفی</a></h4>
<p><i class="far fa-location-dot"></i> 25/B جاده میلف خیابان انقلاب</p>
<div class="activity-rate">
<span class="badge"><i class="fal fa-star"></i> 5.0</span>
<span class="activity-rate-type">عالی</span>
<span class="activity-rate-review">(2.5k بررسی)</span>
</div>
<div class="activity-bottom">
<div class="activity-price">
<span class="activity-price-amount">30 تومان</span>
</div>
<div class="activity-text-btn">
<a href="#">نمایش جزئیات <i class="fas fa-arrow-left"></i></a>
</div>
</div>
</div>
</div>
</div>
<div class="col-md-6 col-lg-3">
<div class="activity-item wow fadeInUp" data-wow-duration="1s" data-wow-delay=".25s">
<div class="activity-img">
<img src="assets/img/activity/05.jpg" alt>
<a href="#" class="add-wishlist"><i class="far fa-heart"></i></a>
</div>
<div class="activity-content">
<h4 class="activity-title"><a href="#">کوهنوردی برفی</a></h4>
<p><i class="far fa-location-dot"></i> 25/B جاده میلف خیابان انقلاب</p>
<div class="activity-rate">
<span class="badge"><i class="fal fa-star"></i> 5.0</span>
<span class="activity-rate-type">عالی</span>
<span class="activity-rate-review">(2.5k بررسی)</span>
</div>
<div class="activity-bottom">
<div class="activity-price">
<span class="activity-price-amount">30 تومان</span>
</div>
<div class="activity-text-btn">
<a href="#">نمایش جزئیات <i class="fas fa-arrow-left"></i></a>
</div>
</div>
</div>
</div>
</div>
<div class="col-md-6 col-lg-3">
<div class="activity-item wow fadeInUp" data-wow-duration="1s" data-wow-delay=".50s">
<div class="activity-img">
<span class="badge">ویژه</span>
<img src="assets/img/activity/06.jpg" alt>
<a href="#" class="add-wishlist"><i class="far fa-heart"></i></a>
</div>
<div class="activity-content">
<h4 class="activity-title"><a href="#">کوهنوردی برفی</a></h4>
<p><i class="far fa-location-dot"></i> 25/B جاده میلف خیابان انقلاب</p>
<div class="activity-rate">
<span class="badge"><i class="fal fa-star"></i> 5.0</span>
<span class="activity-rate-type">عالی</span>
<span class="activity-rate-review">(2.5k بررسی)</span>
</div>
<div class="activity-bottom">
<div class="activity-price">
<span class="activity-price-amount">30 تومان</span>
</div>
<div class="activity-text-btn">
<a href="#">نمایش جزئیات <i class="fas fa-arrow-left"></i></a>
</div>
</div>
</div>
</div>
</div>
<div class="col-md-6 col-lg-3">
<div class="activity-item wow fadeInUp" data-wow-duration="1s" data-wow-delay=".75s">
<div class="activity-img">
<span class="badge badge-discount">ذخیره 25%</span>
<img src="assets/img/activity/07.jpg" alt>
<a href="#" class="add-wishlist"><i class="far fa-heart"></i></a>
</div>
<div class="activity-content">
<h4 class="activity-title"><a href="#">کوهنوردی برفی</a></h4>
<p><i class="far fa-location-dot"></i> 25/B جاده میلف خیابان انقلاب</p>
<div class="activity-rate">
<span class="badge"><i class="fal fa-star"></i> 5.0</span>
<span class="activity-rate-type">عالی</span>
<span class="activity-rate-review">(2.5k بررسی)</span>
</div>
<div class="activity-bottom">
<div class="activity-price">
<span class="activity-price-amount">30 تومان</span>
</div>
<div class="activity-text-btn">
<a href="#">نمایش جزئیات <i class="fas fa-arrow-left"></i></a>
</div>
</div>
</div>
</div>
</div>
<div class="col-md-6 col-lg-3">
<div class="activity-item wow fadeInUp" data-wow-duration="1s" data-wow-delay="1s">
<div class="activity-img">
<img src="assets/img/activity/08.jpg" alt>
<a href="#" class="add-wishlist"><i class="far fa-heart"></i></a>
</div>
<div class="activity-content">
<h4 class="activity-title"><a href="#">کوهنوردی برفی</a></h4>
<p><i class="far fa-location-dot"></i> 25/B جاده میلف خیابان انقلاب</p>
<div class="activity-rate">
<span class="badge"><i class="fal fa-star"></i> 5.0</span>
<span class="activity-rate-type">عالی</span>
<span class="activity-rate-review">(2.5k بررسی)</span>
</div>
<div class="activity-bottom">
<div class="activity-price">
<span class="activity-price-amount">30 تومان</span>
</div>
<div class="activity-text-btn">
<a href="#">نمایش جزئیات <i class="fas fa-arrow-left"></i></a>
</div>
</div>
</div>
</div>
</div>
</div> </div>
</div> </div>
</div> </div>
+2 -16
View File
@@ -25,24 +25,10 @@
<div class="col-md-5"> <div class="col-md-5">
<div class="header-top-right"> <div class="header-top-right">
<div class="lang"> <div class="lang">
<select name="lang" class="select">
<option value="1">انگلیس</option>
<option value="2">روس</option>
<option value="3">روم</option>
<option value="4">فرانس</option>
<option value="5">اسپین</option>
<option value="6">پرتقال</option>
</select>
</div> </div>
<div class="currency"> <div class="currency">
<select name="currency" class="select">
<option value="1">دلار</option>
<option value="2">یورو</option>
<option value="3">ریال</option>
<option value="4">ین</option>
<option value="5">پوند</option>
<option value="6">فرانک</option>
</select>
</div> </div>
<div class="account"> <div class="account">
@if(auth()->check()) @if(auth()->check())
+1 -3
View File
@@ -72,9 +72,7 @@
<li class="nav-item dropdown"> <li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" data-bs-toggle="dropdown">پرواز</a> <a class="nav-link dropdown-toggle" href="#" data-bs-toggle="dropdown">پرواز</a>
<ul class="dropdown-menu fade-down"> <ul class="dropdown-menu fade-down">
<li><a class="dropdown-item" href="flight-grid.html">شبکه پرواز</a></li> <li><a class="dropdown-item" href="flight-full-width.html">یست پرواز</a>
<li><a class="dropdown-item" href="flight-list.html">لیست پرواز</a></li>
<li><a class="dropdown-item" href="flight-full-width.html">پرواز با عرض کامل</a>
</li> </li>
<li><a class="dropdown-item" href="flight-single.html">اطلاعات پرواز</a></li> <li><a class="dropdown-item" href="flight-single.html">اطلاعات پرواز</a></li>
<li><a class="dropdown-item" href="flight-booking.html">رزرو پرواز</a></li> <li><a class="dropdown-item" href="flight-booking.html">رزرو پرواز</a></li>
+4
View File
@@ -1,8 +1,12 @@
<?php <?php
use App\Http\Controllers\IndexController; use App\Http\Controllers\IndexController;
use App\Http\Controllers\TourController;
use Illuminate\Support\Facades\Route; use Illuminate\Support\Facades\Route;
Route::get('/' , [IndexController::class , 'index'])->name('index'); Route::get('/' , [IndexController::class , 'index'])->name('index');
Route::prefix('tour')->controller(TourController::class)->name('tour.')->group(function (){
Route::get('show/{tour}' , 'show')->name('show');
});