fix: update public tour functionality

This commit is contained in:
2026-08-20 08:20:29 +03:30
parent 99e7d4ee95
commit 854324813e
3 changed files with 617 additions and 33 deletions
+194 -26
View File
@@ -4,9 +4,9 @@ namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Http\Requests\TourStoreRequest;
use App\Models\Flight;
use App\Models\Tour;
use App\Models\TravelType;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Storage;
@@ -14,18 +14,37 @@ use Illuminate\Support\Str;
class TourController extends Controller
{
/**
* لیست تورها
*/
public function index()
{
$tours = Tour::latest()->paginate(10);
return view('admin.tours.index', compact('tours'));
// همه تورها نمایش داده می‌شوند
// اگر فقط تورهای تایید شده را می‌خواهی:
// ->where('status', 2)
$tours = Tour::latest()->paginate(20);
// آخرین پروازهای تایید شده
$flights = Flight::where('status', 2)
->latest()
->paginate(3);
return view('admin.tours.index', compact('tours', 'flights'));
}
/**
* فرم ایجاد تور
*/
public function create()
{
$travelTypes = TravelType::all();
return view('admin.tours.create', compact('travelTypes'));
}
/**
* ذخیره تور جدید
*/
public function store(TourStoreRequest $request)
{
DB::beginTransaction();
@@ -33,89 +52,238 @@ class TourController extends Controller
try {
$data = $request->validated();
// ساخت slug اگر خالی بود
// ساخت slug در صورت خالی بودن
if (empty($data['slug'])) {
$data['slug'] = Str::slug($data['title']);
}
/*
* وضعیت تور
*
* 1 = در انتظار
* 2 = تایید شده
*
* اگر می‌خواهی تور بلافاصله در لیست نمایش داده شود،
* مقدار 2 قرار می‌دهیم.
*/
$data['status'] = 2;
// ایجاد تور
$tour = Tour::create($data);
// آپلود تصویر
if ($request->hasFile('image')) {
$image = $request->file('image');
$newFileName = time() . '.tour-image' . rand(11111, 99999) . '.' . $image->extension();
$path = $image->storeAs('tours', $newFileName, 'public');
$tour->update(['image' => $path]);
$image = $request->file('image');
$newFileName =
time()
. '.tour-image'
. rand(11111, 99999)
. '.'
. $image->extension();
$path = $image->storeAs(
'tours',
$newFileName,
'public'
);
$tour->update([
'image' => $path
]);
}
DB::commit();
return redirect()->route('admin.tours.index')->with('success', 'تور با موفقیت ایجاد شد.');
return redirect()
->route('admin.tours.index')
->with('success', 'تور با موفقیت ایجاد شد.');
} catch (\Exception $exception) {
Log::error($exception);
DB::rollBack();
return back()->withInput()->withErrors(['general' => 'خطایی در ثبت رخ داد.']);
Log::error($exception);
return back()
->withInput()
->withErrors([
'general' => 'خطایی در ثبت تور رخ داد.'
]);
}
}
/**
* نمایش جزئیات تور
*/
public function show(Tour $tour)
{
return view('admin.tours.show', compact('tour'));
}
/**
* فرم ویرایش تور
*/
public function edit(Tour $tour)
{
$travelTypes = TravelType::all();
return view('admin.tours.edit', compact('tour', 'travelTypes'));
return view(
'admin.tours.edit',
compact('tour', 'travelTypes')
);
}
public function update(TourStoreRequest $request, Tour $tour)
{
/**
* بروزرسانی تور
*/
public function update(
TourStoreRequest $request,
Tour $tour
) {
DB::beginTransaction();
try {
$data = $request->validated();
// ساخت slug
if (empty($data['slug'])) {
$data['slug'] = Str::slug($data['title']);
}
/*
* اگر status از فرم ارسال نشده باشد،
* وضعیت فعلی تور حفظ شود.
*/
if (!isset($data['status'])) {
$data['status'] = $tour->status ?? 2;
}
// اگر تصویر جدید آپلود شده
if ($request->hasFile('image')) {
// حذف عکس قبلی از حافظه
if ($tour->image && Storage::disk('public')->exists($tour->image)) {
// حذف تصویر قبلی
if (
$tour->image &&
Storage::disk('public')->exists($tour->image)
) {
Storage::disk('public')->delete($tour->image);
}
$image = $request->file('image');
$newFileName = time() . '.tour-image' . rand(11111, 99999) . '.' . $image->extension();
$path = $image->storeAs('tours', $newFileName, 'public');
$newFileName =
time()
. '.tour-image'
. rand(11111, 99999)
. '.'
. $image->extension();
$path = $image->storeAs(
'tours',
$newFileName,
'public'
);
$data['image'] = $path;
}
// بروزرسانی
$tour->update($data);
DB::commit();
return redirect()->route('admin.tours.index')->with('success', 'تور با موفقیت به‌روزرسانی شد.');
return redirect()
->route('admin.tours.index')
->with(
'success',
'تور با موفقیت به‌روزرسانی شد.'
);
} catch (\Exception $exception) {
Log::error($exception);
DB::rollBack();
return back()->withInput()->withErrors(['general' => 'خطایی در به‌روزرسانی رخ داد.']);
Log::error($exception);
return back()
->withInput()
->withErrors([
'general' =>
'خطایی در به‌روزرسانی تور رخ داد.'
]);
}
}
/**
* حذف تصویر تور
*/
public function removeImage(Tour $tour)
{
// حذف تصویر تکی (اختیاری — می‌توانی منطق دلخواه بگذاری)
return back()->with('success', 'عملیات حذف تصویر انجام شد.');
try {
if (
$tour->image &&
Storage::disk('public')->exists($tour->image)
) {
Storage::disk('public')->delete($tour->image);
}
$tour->update([
'image' => null
]);
return back()->with(
'success',
'تصویر تور با موفقیت حذف شد.'
);
} catch (\Exception $exception) {
Log::error($exception);
return back()->withErrors([
'general' =>
'حذف تصویر با خطا مواجه شد.'
]);
}
}
/**
* حذف تور
*/
public function destroy(Tour $tour)
{
$tour->delete();
try {
return redirect()->route('admin.tours.index')
->with('success', 'تور با موفقیت حذف شد.');
// حذف تصویر
if (
$tour->image &&
Storage::disk('public')->exists($tour->image)
) {
Storage::disk('public')->delete($tour->image);
}
// حذف تور
$tour->delete();
return redirect()
->route('admin.tours.index')
->with(
'success',
'تور با موفقیت حذف شد.'
);
} catch (\Exception $exception) {
Log::error($exception);
return back()->withErrors([
'general' =>
'حذف تور با خطا مواجه شد.'
]);
}
}
}