diff --git a/app/Http/Controllers/IndexController.php b/app/Http/Controllers/IndexController.php new file mode 100644 index 0000000..9d60bbb --- /dev/null +++ b/app/Http/Controllers/IndexController.php @@ -0,0 +1,13 @@ +where('status', 1) // فقط تورهای فعال + ->with(['travelType', 'flights']); // بارگذاری زودهنگام برای جلوگیری از N+1 + + // فیلتر بر اساس نوع سفر (travel_type_id) + 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(12); + $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) { + abort(404); + } + + // بارگذاری پروازها + نوع سفر + نظرات تاییدشده + $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) + ->limit(4) + ->get(); + + 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 . '%') + ->limit(8) + ->get(['id', 'title', 'slug', 'price']); + + return response()->json($tours); + } +} +