From fad359f1c53394e73b1dafbf4fe55731fde6ba98 Mon Sep 17 00:00:00 2001 From: shahrzad011 Date: Sat, 22 Aug 2026 07:55:56 +0330 Subject: [PATCH] fix: update tour functionality --- app/Http/Controllers/TourController.php | 273 +++++++++++++++++------- app/Models/Tour.php | 10 + 2 files changed, 206 insertions(+), 77 deletions(-) diff --git a/app/Http/Controllers/TourController.php b/app/Http/Controllers/TourController.php index f9b55eb..0506838 100644 --- a/app/Http/Controllers/TourController.php +++ b/app/Http/Controllers/TourController.php @@ -1,9 +1,13 @@ where('status', 1) ->with(['travelType', 'flights']); - // فیلتر بر اساس نوع سفر 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(); } - // صفحه‌بندی - $tours = $query->paginate(12)->withQueryString(); - - // انواع سفر + $tours = $query->paginate(9); $travelTypes = TravelType::where('status', 1)->get(); - return view( - 'tours.index', - compact('tours', 'travelTypes') - ); + return view('tours.index', compact('tours', 'travelTypes')); } - - /** - * حذف فیلترها - */ - public function removeFilters() - { - return redirect()->route('tours.index'); - } - - /** * نمایش جزئیات یک تور */ public function show(Tour $tour) { - // فقط تورهای فعال قابل مشاهده باشند if ($tour->status != 1) { abort(404); } - // افزایش تعداد بازدید $tour->increment('views_count'); - // بارگذاری اطلاعات مورد نیاز + // بارگذاری اطلاعات مورد نیاز + نظرات تایید شده $tour->load([ 'flights', 'travelType', + 'comments' => function ($query) { + $query->where('status', 1)->latest(); + }, + 'comments.user' // برای نمایش نام کاربری در نظرات ]); - // تورهای مرتبط $relatedTours = Tour::where('status', 1) ->where('travel_type_id', $tour->travel_type_id) ->where('id', '!=', $tour->id) @@ -115,7 +79,6 @@ class TourController extends Controller ->get(); $isFav = false; - if (auth()->check()) { $isFav = Favorite::where('user_id', auth()->id()) ->where('favoritable_type', Tour::class) @@ -123,35 +86,191 @@ class TourController extends Controller ->exists(); } - - return view( - 'tours.show', - compact('tour', 'relatedTours', 'isFav') - ); + return view('tours.show', compact('tour', 'relatedTours', 'isFav')); } + //ثبت نظر جدید برای تور + public function storeComment(Request $request, Tour $tour) + { + $request->validate([ + 'body' => 'required|string|min:5|max:1000', + ]); - /** - * جستجوی پیشنهادی - */ + $tour->comments()->create([ + 'user_id' => auth()->id(), + 'body' => $request->body, + 'status' => 0, // در انتظار تایید + ]); + + return back()->with('success', 'نظر شما ثبت شد و پس از تایید مدیریت نمایش داده می‌شود.'); + } + + //جستجوی پیشنهادی public function searchSuggestion(Request $request) { $q = $request->input('q', ''); - - $tours = Tour::where('status', 1) - ->where( - 'title', - 'like', - '%' . $q . '%' - ) - ->limit(8) - ->get([ - 'id', - 'title', - 'slug', - 'price' - ]); - - return response()->json($tours); + return response()->json( + Tour::where('status', 1) + ->where('title', 'like', '%' . $q . '%') + ->limit(8) + ->get(['id', 'title', 'slug', 'price']) + ); } } + +// +//namespace App\Http\Controllers; +// +//use App\Models\Favorite; +//use App\Models\Tour; +//use App\Models\TravelType; +//use Illuminate\Http\Request; +// +//class TourController extends Controller +//{ +// /** +// * لیست / آرشیو تورها با قابلیت فیلتر +// */ +// public function index(Request $request) +// { +// $query = Tour::query() +// ->where('status', 1) +// ->with(['travelType', 'flights']); +// +// // فیلتر بر اساس نوع سفر +// if ($request->filled('travel_type')) { +// $query->where( +// 'travel_type_id', +// $request->input('travel_type') +// ); +// } +// +// // جستجو بر اساس عنوان +// if ($request->filled('q')) { +// $query->where( +// 'title', +// 'like', +// '%' . $request->input('q') . '%' +// ); +// } +// +// // حداقل قیمت +// if ($request->filled('price_min')) { +// $query->where( +// 'price', +// '>=', +// $request->input('price_min') +// ); +// } +// +// // حداکثر قیمت +// if ($request->filled('price_max')) { +// $query->where( +// 'price', +// '<=', +// $request->input('price_max') +// ); +// } +// +// // مرتب‌سازی +// if ($request->filled('sort')) { +// $query->orderBy( +// 'price', +// $request->input('sort') === 'desc' +// ? 'desc' +// : 'asc' +// ); +// } else { +// $query->latest(); +// } +// +// // صفحه‌بندی +// $tours = $query->paginate(9); +// +// // انواع سفر +// $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 != 1) { +// abort(404); +// } +// +// // افزایش تعداد بازدید +// $tour->increment('views_count'); +// +// // بارگذاری اطلاعات مورد نیاز +// $tour->load([ +// 'flights', +// 'travelType', +// ]); +// +// // تورهای مرتبط +// $relatedTours = Tour::where('status', 1) +// ->where('travel_type_id', $tour->travel_type_id) +// ->where('id', '!=', $tour->id) +// ->latest() +// ->limit(4) +// ->get(); +// +// $isFav = false; +// +// if (auth()->check()) { +// $isFav = Favorite::where('user_id', auth()->id()) +// ->where('favoritable_type', Tour::class) +// ->where('favoritable_id', $tour->id) +// ->exists(); +// } +// +// +// return view( +// 'tours.show', +// compact('tour', 'relatedTours', 'isFav') +// ); +// } +// +// +// /** +// * جستجوی پیشنهادی +// */ +// public function searchSuggestion(Request $request) +// { +// $q = $request->input('q', ''); +// +// $tours = Tour::where('status', 1) +// ->where( +// 'title', +// 'like', +// '%' . $q . '%' +// ) +// ->limit(8) +// ->get([ +// 'id', +// 'title', +// 'slug', +// 'price' +// ]); +// +// return response()->json($tours); +// } +//} diff --git a/app/Models/Tour.php b/app/Models/Tour.php index e32ebca..ae878a1 100644 --- a/app/Models/Tour.php +++ b/app/Models/Tour.php @@ -75,6 +75,16 @@ class Tour extends Model ->withPivot('id') ->withTimestamps(); } + + // در فایل App\Models\Tour.php و App\Models\Flight.php + + public function comments() + { + return $this->morphMany(Comment::class, 'commentable'); + } + + + protected static function booted() { static::creating(function ($tour) {