fix: update tour management
This commit is contained in:
@@ -8,92 +8,139 @@ use Illuminate\Http\Request;
|
||||
|
||||
class TourController extends Controller
|
||||
{
|
||||
//لیست/آرشیو تورها با قابلیت فیلتر
|
||||
/**
|
||||
* لیست / آرشیو تورها با قابلیت فیلتر
|
||||
*/
|
||||
public function index(Request $request)
|
||||
{
|
||||
$query = Tour::query()
|
||||
->where('status', 1) // فقط تورهای فعال
|
||||
->with(['travelType', 'flights']); // بارگذاری زودهنگام برای جلوگیری از N+1
|
||||
->where('status', 1)
|
||||
->with(['travelType', 'flights']);
|
||||
|
||||
// فیلتر بر اساس نوع سفر (travel_type_id)
|
||||
// فیلتر بر اساس نوع سفر
|
||||
if ($request->filled('travel_type')) {
|
||||
$query->where('travel_type_id', $request->input('travel_type'));
|
||||
$query->where(
|
||||
'travel_type_id',
|
||||
$request->input('travel_type')
|
||||
);
|
||||
}
|
||||
|
||||
// فیلتر جستجوی متنی (عنوان)
|
||||
// جستجو بر اساس عنوان
|
||||
if ($request->filled('q')) {
|
||||
$query->where('title', 'like', '%' . $request->input('q') . '%');
|
||||
$query->where(
|
||||
'title',
|
||||
'like',
|
||||
'%' . $request->input('q') . '%'
|
||||
);
|
||||
}
|
||||
|
||||
// فیلتر بازه قیمتی
|
||||
// حداقل قیمت
|
||||
if ($request->filled('price_min')) {
|
||||
$query->where('price', '>=', $request->input('price_min'));
|
||||
$query->where(
|
||||
'price',
|
||||
'>=',
|
||||
$request->input('price_min')
|
||||
);
|
||||
}
|
||||
|
||||
// حداکثر قیمت
|
||||
if ($request->filled('price_max')) {
|
||||
$query->where('price', '<=', $request->input('price_max'));
|
||||
$query->where(
|
||||
'price',
|
||||
'<=',
|
||||
$request->input('price_max')
|
||||
);
|
||||
}
|
||||
|
||||
// مرتبسازی بر اساس قیمت (اگر خواستی)
|
||||
// مرتبسازی
|
||||
if ($request->filled('sort')) {
|
||||
$query->orderBy('price', $request->input('sort') === 'desc' ? 'desc' : 'asc');
|
||||
$query->orderBy(
|
||||
'price',
|
||||
$request->input('sort') === 'desc'
|
||||
? 'desc'
|
||||
: 'asc'
|
||||
);
|
||||
} else {
|
||||
$query->latest(); // جدیدترینها اول
|
||||
$query->latest();
|
||||
}
|
||||
|
||||
$tours = $query->paginate(12);
|
||||
$travelTypes = TravelType::where('status', 1)->get(); // برای منوی فیلتر
|
||||
// صفحهبندی
|
||||
$tours = $query->paginate(12)->withQueryString();
|
||||
|
||||
return view('tours.index', compact('tours', 'travelTypes'));
|
||||
// انواع سفر
|
||||
$travelTypes = TravelType::where('status', 1)->get();
|
||||
|
||||
return view(
|
||||
'tours.index',
|
||||
compact('tours', 'travelTypes')
|
||||
);
|
||||
}
|
||||
|
||||
//حذف فیلترها و بازگشت به آرشیو کامل
|
||||
|
||||
/**
|
||||
* حذف فیلترها
|
||||
*/
|
||||
public function removeFilters()
|
||||
{
|
||||
// ساده: فقط برگشت به آرشیو بدون هیچ پارامتری.
|
||||
// (اگر از کوکی/سشن استفاده میکنی، اینجا آنها را هم پاک کن)
|
||||
return redirect()->route('tours.index');
|
||||
}
|
||||
|
||||
//صفحهی جزئیات یک تور
|
||||
|
||||
/**
|
||||
* نمایش جزئیات یک تور
|
||||
*/
|
||||
public function show(Tour $tour)
|
||||
{
|
||||
// فقط اگر تور غیرفعال بود از دسترسی جلوگیری کن (مثلاً ریدایرکت)
|
||||
if ($tour->status == 0) {
|
||||
// فقط تورهای فعال قابل مشاهده باشند
|
||||
if ($tour->status != 1) {
|
||||
abort(404);
|
||||
}
|
||||
|
||||
// بارگذاری پروازها + نوع سفر + نظرات تاییدشده
|
||||
// افزایش تعداد بازدید
|
||||
$tour->increment('views_count');
|
||||
|
||||
// بارگذاری اطلاعات مورد نیاز
|
||||
$tour->load([
|
||||
'flights',
|
||||
'travelType',
|
||||
// توجه: این رابطه را باید در مدل Tour تعریف کنی (morphMany)
|
||||
'comments' => function ($q) {
|
||||
$q->where('status', 1)->latest();
|
||||
}
|
||||
]);
|
||||
|
||||
// تورهای پیشنهادی مرتبط (همدسته) برای نمایش کنار صفحه
|
||||
// تورهای مرتبط
|
||||
$relatedTours = Tour::where('status', 1)
|
||||
->where('travel_type_id', $tour->travel_type_id)
|
||||
->where('id', '!=', $tour->id)
|
||||
->latest()
|
||||
->limit(4)
|
||||
->get();
|
||||
|
||||
return view('tours.show', compact('tour', 'relatedTours'));
|
||||
return view(
|
||||
'tours.show',
|
||||
compact('tour', 'relatedTours')
|
||||
);
|
||||
}
|
||||
|
||||
//جستجوی پیشنهادی (Typeahead / AJAX) — خروجی JSON
|
||||
|
||||
/**
|
||||
* جستجوی پیشنهادی
|
||||
*/
|
||||
public function searchSuggestion(Request $request)
|
||||
{
|
||||
$q = $request->input('q', '');
|
||||
|
||||
$tours = Tour::where('status', 1)
|
||||
->where('title', 'like', '%' . $q . '%')
|
||||
->where(
|
||||
'title',
|
||||
'like',
|
||||
'%' . $q . '%'
|
||||
)
|
||||
->limit(8)
|
||||
->get(['id', 'title', 'slug', 'price']);
|
||||
->get([
|
||||
'id',
|
||||
'title',
|
||||
'slug',
|
||||
'price'
|
||||
]);
|
||||
|
||||
return response()->json($tours);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -23,60 +23,60 @@ class TourStoreRequest extends FormRequest
|
||||
public function rules(): array
|
||||
{
|
||||
return [
|
||||
'travel_type_id' =>
|
||||
[
|
||||
'required',
|
||||
'exists:travel_types,id'
|
||||
],
|
||||
// 'travel_type_id' =>
|
||||
// [
|
||||
// 'nullable',
|
||||
// 'exists:travel_types,id'
|
||||
// ],
|
||||
'title' =>
|
||||
[
|
||||
'required',
|
||||
'string',
|
||||
'max:200'
|
||||
],
|
||||
'slug' =>
|
||||
['required', 'string',
|
||||
'max:200',
|
||||
'regex:/^[a-z0-9-]+$/',
|
||||
'unique:tours,slug,' . $this->tour
|
||||
],
|
||||
// 'slug' =>
|
||||
// ['nullable', 'string',
|
||||
// 'max:200',
|
||||
// 'regex:/^[a-z0-9-]+$/',
|
||||
// 'unique:tours,slug,' . $this->tour
|
||||
// ],
|
||||
|
||||
'description' =>
|
||||
[
|
||||
'required',
|
||||
'string'
|
||||
],
|
||||
'duration' =>
|
||||
[
|
||||
'required',
|
||||
'string',
|
||||
'max:50'
|
||||
],
|
||||
'start_date' =>
|
||||
[
|
||||
'required',
|
||||
'date'
|
||||
],
|
||||
'end_date' =>
|
||||
[
|
||||
'required',
|
||||
'date',
|
||||
'after_or_equal:start_date'
|
||||
],
|
||||
// 'description' =>
|
||||
// [
|
||||
// 'nullable',
|
||||
// 'string'
|
||||
// ],
|
||||
// 'duration' =>
|
||||
// [
|
||||
// 'nullable',
|
||||
// 'string',
|
||||
// 'max:50'
|
||||
// ],
|
||||
// 'start_date' =>
|
||||
// [
|
||||
// 'nullable',
|
||||
// 'date'
|
||||
// ],
|
||||
// 'end_date' =>
|
||||
// [
|
||||
// 'nullable',
|
||||
// 'date',
|
||||
// 'after_or_equal:start_date'
|
||||
// ],
|
||||
'price' =>
|
||||
[
|
||||
'required',
|
||||
'numeric',
|
||||
'min:0'
|
||||
],
|
||||
'capacity' =>
|
||||
[
|
||||
'required',
|
||||
'integer',
|
||||
'min:0'],
|
||||
// 'capacity' =>
|
||||
// [
|
||||
// 'nullable',
|
||||
// 'integer',
|
||||
// 'min:0'],
|
||||
'images' =>
|
||||
[
|
||||
'required',
|
||||
'nullable',
|
||||
'array'
|
||||
],
|
||||
'images.*' =>
|
||||
|
||||
@@ -2,61 +2,63 @@
|
||||
|
||||
@section('content')
|
||||
<div class="container mt-4">
|
||||
<div class="row justify-content-center">
|
||||
<div class="col-md-8">
|
||||
<div class="card shadow">
|
||||
<div class="card-header bg-primary text-white">
|
||||
<h4 class="mb-0">ثبت تور جدید</h4>
|
||||
<div class="d-flex justify-content-between align-items-center mb-3">
|
||||
<h2>افزودن تور جدید</h2>
|
||||
<a href="{{ route('admin.tours.index') }}" class="btn btn-secondary">بازگشت</a>
|
||||
</div>
|
||||
|
||||
@if ($errors->any())
|
||||
<div class="alert alert-danger">
|
||||
<ul class="mb-0">
|
||||
@foreach ($errors->all() as $error)
|
||||
<li>{{ $error }}</li>
|
||||
@endforeach
|
||||
</ul>
|
||||
</div>
|
||||
@endif
|
||||
|
||||
<div class="card shadow">
|
||||
<div class="card-body">
|
||||
<form action="{{ route('admin.tours.store') }}" method="POST" enctype="multipart/form-data">
|
||||
@csrf
|
||||
|
||||
<div class="mb-3">
|
||||
<label class="form-label">عنوان تور</label>
|
||||
<input type="text" name="title"
|
||||
<div class="row">
|
||||
{{-- تصویر --}}
|
||||
<div class="col-md-4 mb-3">
|
||||
<label for="image" class="form-label">تصویر تور</label>
|
||||
<input type="file" name="image" id="image"
|
||||
class="form-control @error('image') is-invalid @enderror">
|
||||
@error('image')
|
||||
<div class="invalid-feedback">{{ $message }}</div>
|
||||
@enderror
|
||||
</div>
|
||||
|
||||
{{-- عنوان --}}
|
||||
<div class="col-md-4 mb-3">
|
||||
<label for="title" class="form-label">عنوان تور</label>
|
||||
<input type="text" name="title" id="title"
|
||||
class="form-control @error('title') is-invalid @enderror"
|
||||
value="{{ old('title') }}">
|
||||
@error('title')
|
||||
<div class="invalid-feedback">{{ $message }}</div> @enderror
|
||||
<div class="invalid-feedback">{{ $message }}</div>
|
||||
@enderror
|
||||
</div>
|
||||
|
||||
<div class="mb-3">
|
||||
<label class="form-label">توضیحات</label>
|
||||
<textarea name="description"
|
||||
class="form-control @error('description') is-invalid @enderror"
|
||||
rows="4">{{ old('description') }}</textarea>
|
||||
@error('description')
|
||||
<div class="invalid-feedback">{{ $message }}</div> @enderror
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-6 mb-3">
|
||||
<label class="form-label">قیمت</label>
|
||||
<input type="number" name="price"
|
||||
{{-- قیمت --}}
|
||||
<div class="col-md-4 mb-3">
|
||||
<label for="price" class="form-label">قیمت (تومان)</label>
|
||||
<input type="number" name="price" id="price" step="1000" min="0"
|
||||
class="form-control @error('price') is-invalid @enderror"
|
||||
value="{{ old('price') }}">
|
||||
@error('price')
|
||||
<div class="invalid-feedback">{{ $message }}</div> @enderror
|
||||
</div>
|
||||
<div class="col-md-6 mb-3">
|
||||
<label class="form-label">تصویر تور</label>
|
||||
<input type="file" name="image"
|
||||
class="form-control @error('image') is-invalid @enderror">
|
||||
@error('image')
|
||||
<div class="invalid-feedback">{{ $message }}</div> @enderror
|
||||
<div class="invalid-feedback">{{ $message }}</div>
|
||||
@enderror
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mt-4 d-flex justify-content-between">
|
||||
<a href="{{ route('admin.tours.index') }}" class="btn btn-secondary">انصراف</a>
|
||||
<button type="submit" class="btn btn-success">ذخیره تور</button>
|
||||
</div>
|
||||
<button type="submit" class="btn btn-primary">ذخیره تور</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
|
||||
|
||||
@@ -1,38 +1,400 @@
|
||||
@extends('layouts.app')
|
||||
|
||||
@section('content')
|
||||
<h1>{{ $tour->title }}</h1>
|
||||
|
||||
{{-- گالری تصاویر (اسلایدر) --}}
|
||||
<div id="tourGallery" class="carousel slide" data-bs-ride="carousel">
|
||||
@foreach ($tour->images as $image)
|
||||
<div class="carousel-item @if($loop->first) active @endif">
|
||||
<img src="{{ $image->path }}" class="d-block w-100" alt="">
|
||||
</div>
|
||||
@endforeach
|
||||
<div class="tour-details-page">
|
||||
|
||||
<div class="container">
|
||||
|
||||
<div class="tour-details-card">
|
||||
|
||||
{{-- تصویر تور --}}
|
||||
<div class="tour-details-image">
|
||||
|
||||
@if($tour->image)
|
||||
|
||||
<img
|
||||
src="{{ asset('storage/' . $tour->image) }}"
|
||||
alt="{{ $tour->title }}"
|
||||
>
|
||||
|
||||
@else
|
||||
|
||||
<div class="tour-no-image">
|
||||
تصویر برای این تور ثبت نشده است
|
||||
</div>
|
||||
|
||||
<p>{{ $tour->description }}</p>
|
||||
<p>تاریخ شروع: {{ $tour->start_date?->format('Y/m/d') }}</p>
|
||||
@endif
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
{{-- محتوای تور --}}
|
||||
<div class="tour-details-content">
|
||||
|
||||
{{-- عنوان --}}
|
||||
<h1 class="tour-details-title">
|
||||
{{ $tour->title }}
|
||||
</h1>
|
||||
|
||||
|
||||
{{-- اطلاعات اصلی --}}
|
||||
<div class="tour-details-info">
|
||||
|
||||
{{-- نوع سفر --}}
|
||||
<div class="tour-info-box">
|
||||
|
||||
<span class="tour-info-label">
|
||||
نوع سفر
|
||||
</span>
|
||||
|
||||
<strong>
|
||||
{{ $tour->travelType->title ?? 'نامشخص' }}
|
||||
</strong>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
{{-- تاریخ شروع --}}
|
||||
<div class="tour-info-box">
|
||||
|
||||
<span class="tour-info-label">
|
||||
تاریخ حرکت
|
||||
</span>
|
||||
|
||||
<strong>
|
||||
{{ $tour->start_date
|
||||
? \Carbon\Carbon::parse($tour->start_date)->format('Y/m/d')
|
||||
: 'نامشخص'
|
||||
}}
|
||||
</strong>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
{{-- تاریخ پایان --}}
|
||||
<div class="tour-info-box">
|
||||
|
||||
<span class="tour-info-label">
|
||||
تاریخ پایان
|
||||
</span>
|
||||
|
||||
<strong>
|
||||
{{ $tour->end_date
|
||||
? \Carbon\Carbon::parse($tour->end_date)->format('Y/m/d')
|
||||
: 'نامشخص'
|
||||
}}
|
||||
</strong>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
{{-- مدت سفر --}}
|
||||
<div class="tour-info-box">
|
||||
|
||||
<span class="tour-info-label">
|
||||
مدت سفر
|
||||
</span>
|
||||
|
||||
<strong>
|
||||
{{ $tour->duration ?? 'نامشخص' }}
|
||||
</strong>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
{{-- قیمت --}}
|
||||
<div class="tour-info-box">
|
||||
|
||||
<span class="tour-info-label">
|
||||
قیمت
|
||||
</span>
|
||||
|
||||
<strong>
|
||||
{{ number_format($tour->price) }}
|
||||
تومان
|
||||
</strong>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
{{-- ظرفیت --}}
|
||||
<div class="tour-info-box">
|
||||
|
||||
<span class="tour-info-label">
|
||||
ظرفیت
|
||||
</span>
|
||||
|
||||
<strong>
|
||||
{{ $tour->capacity ?? 'نامحدود' }}
|
||||
</strong>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
{{-- تعداد بازدید --}}
|
||||
<div class="tour-info-box">
|
||||
|
||||
<span class="tour-info-label">
|
||||
تعداد بازدید
|
||||
</span>
|
||||
|
||||
<strong>
|
||||
{{ number_format($tour->views_count) }}
|
||||
</strong>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
{{-- توضیحات --}}
|
||||
<div class="tour-description">
|
||||
|
||||
<h2>
|
||||
توضیحات سفر
|
||||
</h2>
|
||||
|
||||
@if($tour->description)
|
||||
|
||||
<p>
|
||||
{{ $tour->description }}
|
||||
</p>
|
||||
|
||||
@else
|
||||
|
||||
<p>
|
||||
توضیحی برای این تور ثبت نشده است.
|
||||
</p>
|
||||
|
||||
@endif
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
{{-- پروازهای تور --}}
|
||||
@if($tour->flights && $tour->flights->count())
|
||||
|
||||
<div class="tour-flights">
|
||||
|
||||
<h2>
|
||||
پروازهای این تور
|
||||
</h2>
|
||||
|
||||
@foreach($tour->flights as $flight)
|
||||
|
||||
<div class="flight-item">
|
||||
|
||||
<div>
|
||||
|
||||
<span>
|
||||
مبدأ
|
||||
</span>
|
||||
|
||||
<strong>
|
||||
{{ $flight->origin ?? '-' }}
|
||||
</strong>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
<div>
|
||||
|
||||
<span>
|
||||
مقصد
|
||||
</span>
|
||||
|
||||
<strong>
|
||||
{{ $flight->destination ?? '-' }}
|
||||
</strong>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
{{-- پروازهای این تور --}}
|
||||
<h3>پروازهای همراه</h3>
|
||||
@foreach ($tour->flights as $flight)
|
||||
<x-flight :flight="$flight"/>
|
||||
@endforeach
|
||||
|
||||
{{-- نظرات --}}
|
||||
<h3>نظرات ({{ $tour->comments->count() }})</h3>
|
||||
@foreach ($tour->comments as $comment)
|
||||
<x-comment :comment="$comment"/>
|
||||
</div>
|
||||
|
||||
@endif
|
||||
|
||||
|
||||
{{-- تورهای مرتبط --}}
|
||||
@if($relatedTours->count())
|
||||
|
||||
<div class="related-tours">
|
||||
|
||||
<h2>
|
||||
تورهای مرتبط
|
||||
</h2>
|
||||
|
||||
<div class="related-tours-grid">
|
||||
|
||||
@foreach($relatedTours as $relatedTour)
|
||||
|
||||
<a
|
||||
href="{{ route('tours.show', $relatedTour) }}"
|
||||
class="related-tour-card"
|
||||
>
|
||||
|
||||
@if($relatedTour->image)
|
||||
|
||||
<img
|
||||
src="{{ asset('storage/' . $relatedTour->image) }}"
|
||||
alt="{{ $relatedTour->title }}"
|
||||
>
|
||||
|
||||
@endif
|
||||
|
||||
<div>
|
||||
|
||||
<h3>
|
||||
{{ $relatedTour->title }}
|
||||
</h3>
|
||||
|
||||
<span>
|
||||
@if($relatedTour->start_date)
|
||||
{{ \Carbon\Carbon::parse($relatedTour->start_date)->format('Y/m/d') }}
|
||||
@endif
|
||||
</span>
|
||||
|
||||
</div>
|
||||
|
||||
</a>
|
||||
|
||||
@endforeach
|
||||
|
||||
@auth
|
||||
<form method="POST" action="{{ route('comments.store', $tour) }}">
|
||||
@csrf
|
||||
<textarea name="body" required></textarea>
|
||||
<button type="submit">ثبت نظر</button>
|
||||
</form>
|
||||
@endauth
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
@endif
|
||||
|
||||
|
||||
{{-- دکمه بازگشت --}}
|
||||
<div class="tour-back">
|
||||
|
||||
<a
|
||||
href="{{ route('tours.index') }}"
|
||||
class="tour-back-button"
|
||||
>
|
||||
بازگشت به لیست تورها
|
||||
</a>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
@endsection
|
||||
|
||||
{{-- resources/views/tours/show.blade.php --}}
|
||||
{{--@extends('layouts.app')--}}
|
||||
|
||||
{{--@section('title', $tour->name)--}}
|
||||
|
||||
{{--@section('content')--}}
|
||||
{{-- <div class="container py-5 mt-4">--}}
|
||||
|
||||
{{-- --}}{{-- اطلاعات تور --}}
|
||||
{{-- <div class="card mb-4 shadow-sm">--}}
|
||||
{{-- <div class="card-body">--}}
|
||||
{{-- <h2 class="card-title">{{ $tour->name }}</h2>--}}
|
||||
{{-- <p class="text-muted">{{ $tour->description }}</p>--}}
|
||||
{{-- <hr>--}}
|
||||
{{-- <div class="row">--}}
|
||||
{{-- <div class="col-md-3"><strong>مبدأ:</strong> {{ $tour->origin->name ?? '—' }}</div>--}}
|
||||
{{-- <div class="col-md-3"><strong>مقصد:</strong> {{ $tour->destination->name ?? '—' }}</div>--}}
|
||||
{{-- <div class="col-md-3"><strong>تاریخ رفت:</strong> {{ $tour->start_date }}</div>--}}
|
||||
{{-- <div class="col-md-3"><strong>بازگشت:</strong> {{ $tour->end_date }}</div>--}}
|
||||
{{-- </div>--}}
|
||||
{{-- <div class="row mt-3">--}}
|
||||
{{-- <div class="col-md-4"><strong>قیمت:</strong> {{ number_format($tour->price) }} تومان</div>--}}
|
||||
{{-- <div class="col-md-4"><strong>ظرفیت:</strong> {{ $tour->capacity }} نفر</div>--}}
|
||||
{{-- <div class="col-md-4"><strong>موجودی:</strong> {{ $tour->available_seats ?? $tour->capacity }} نفر--}}
|
||||
{{-- </div>--}}
|
||||
{{-- </div>--}}
|
||||
{{-- <hr>--}}
|
||||
{{-- <p>{{ $tour->description }}</p>--}}
|
||||
{{-- </div>--}}
|
||||
{{-- </div>--}}
|
||||
{{-- </section>--}}
|
||||
|
||||
{{-- --}}{{-- ===== فرم رزرو تور ===== --}}
|
||||
{{-- @auth--}}
|
||||
{{-- <section class="pb-5">--}}
|
||||
{{-- <div class="container">--}}
|
||||
{{-- <div class="card shadow-sm">--}}
|
||||
{{-- <div class="card-header bg-success text-white">--}}
|
||||
{{-- رزرو تور {{ $tour->name }}--}}
|
||||
{{-- </div>--}}
|
||||
{{-- <div class="card-body">--}}
|
||||
{{-- <form action="{{ route('booking.store', $tour) }}" method="POST">--}}
|
||||
{{-- @csrf--}}
|
||||
{{-- <div class="mb-3">--}}
|
||||
{{-- <label class="form-label">تعداد نفرات</label>--}}
|
||||
{{-- <input type="number" name="seats" min="1" max="{{ $tour->capacity }}" value="1"--}}
|
||||
{{-- class="form-control @error('seats') is-invalid @enderror" required>--}}
|
||||
{{-- @error('seats')--}}
|
||||
{{-- <span class="invalid-feedback">{{ $message }}</span>--}}
|
||||
{{-- @enderror--}}
|
||||
{{-- </div>--}}
|
||||
{{-- <button type="submit" class="btn btn-success w-100">رزرو تور</button>--}}
|
||||
{{-- </form>--}}
|
||||
{{-- </div>--}}
|
||||
{{-- </div>--}}
|
||||
{{-- </div>--}}
|
||||
{{-- </section>--}}
|
||||
{{-- @else--}}
|
||||
{{-- --}}{{-- کاربر لاگین نیست => دکمه ورود به روت login --}}
|
||||
{{-- <div class="alert alert-warning text-center">--}}
|
||||
{{-- برای رزرو تور ابتدا <a href="{{ route('login') }}">وارد شوید</a>.--}}
|
||||
{{-- </div>--}}
|
||||
{{-- </div>--}}
|
||||
{{-- @endauth--}}
|
||||
{{--@endsection--}}
|
||||
|
||||
|
||||
{{--@extends('layouts.app')--}}
|
||||
|
||||
{{--@section('content')--}}
|
||||
{{-- <h1>{{ $tour->title }}</h1>--}}
|
||||
|
||||
{{-- --}}{{----}}{{-- گالری تصاویر (اسلایدر) --}}
|
||||
{{-- <div id="tourGallery" class="carousel slide" data-bs-ride="carousel">--}}
|
||||
{{-- @foreach ($tour->images as $image)--}}
|
||||
{{-- <div class="carousel-item @if($loop->first) active @endif">--}}
|
||||
{{-- <img src="{{ $image->path }}" class="d-block w-100" alt="">--}}
|
||||
{{-- </div>--}}
|
||||
{{-- @endforeach--}}
|
||||
{{-- </div>--}}
|
||||
|
||||
{{-- <p>{{ $tour->description }}</p>--}}
|
||||
{{-- <p>تاریخ شروع: {{ $tour->start_date?->format('Y/m/d') }}</p>--}}
|
||||
|
||||
{{-- --}}{{----}}{{-- پروازهای این تور --}}
|
||||
{{-- <h3>پروازهای همراه</h3>--}}
|
||||
{{-- @foreach ($tour->flights as $flight)--}}
|
||||
{{-- <x-flight :flight="$flight"/>--}}
|
||||
{{-- @endforeach--}}
|
||||
|
||||
{{-- --}}{{----}}{{-- نظرات --}}
|
||||
{{-- <h3>نظرات ({{ $tour->comments->count() }})</h3>--}}
|
||||
{{-- @foreach ($tour->comments as $comment)--}}
|
||||
{{-- <x-comment :comment="$comment"/>--}}
|
||||
{{-- @endforeach--}}
|
||||
|
||||
{{-- @auth--}}
|
||||
{{-- <form method="POST" action="{{ route('comments.store', $tour) }}">--}}
|
||||
{{-- @csrf--}}
|
||||
{{-- <textarea name="body" required></textarea>--}}
|
||||
{{-- <button type="submit">ثبت نظر</button>--}}
|
||||
{{-- </form>--}}
|
||||
{{-- @endauth--}}
|
||||
{{--@endsection--}}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user