feat: display tours dynamically on index page
This commit is contained in:
@@ -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'));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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'));
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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
@@ -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>
|
||||||
@@ -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>
|
||||||
|
|||||||
@@ -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())
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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');
|
||||||
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user