From 123b43fb38021a704d2530d4eef7cf46a6a6a173 Mon Sep 17 00:00:00 2001 From: shahrzad011 Date: Mon, 17 Aug 2026 19:53:12 +0330 Subject: [PATCH] fix: update tour management --- app/Http/Controllers/admin/TourController.php | 49 +++++++--- app/Http/Requests/TourStoreRequest.php | 12 +++ app/Models/Tour.php | 25 ++++-- resources/views/admin/tours/create.blade.php | 65 +++++++++++++- resources/views/admin/tours/edit.blade.php | 89 ++++++++++++++++++- resources/views/admin/tours/index.blade.php | 64 ++++++++++++- resources/views/admin/tours/show.blade.php | 83 ++++++++++++++++- 7 files changed, 358 insertions(+), 29 deletions(-) diff --git a/app/Http/Controllers/admin/TourController.php b/app/Http/Controllers/admin/TourController.php index cbe4042..5a7bb34 100644 --- a/app/Http/Controllers/admin/TourController.php +++ b/app/Http/Controllers/admin/TourController.php @@ -5,43 +5,72 @@ namespace App\Http\Controllers\Admin; use App\Http\Controllers\Controller; use App\Http\Requests\TourStoreRequest; use App\Models\Tour; +use App\Models\TravelType; use Illuminate\Http\Request; class TourController extends Controller { public function index() { - $tour = Tour::latest()->paginate(10); - return view('admin.tours.index', compact($tour)); - } + $tours = Tour::latest()->paginate(10); + return view('admin.tours.index', compact('tours')); + } - public function create() + public function create() { return view('admin.tours.create'); - } + } - public function store(TourStoreRequest $request) + public function store(TourStoreRequest $request) { - Tour::create($request->validated()); +// Tour::create($request->validated()); + + + $tour = Tour::create($request->only([ + 'travel_type_id', 'title', 'slug', 'description', + 'start_date', 'end_date', 'price', 'capacity', 'status' + ])); + + $this->uploadImages($tour, $request->file('images')); return view('admin.tours.index') ->with('success', 'تور با موفقیت ایجاد شد.'); - } + } + public function show(Tour $tour) { return view('admin.tours.show', compact('tour')); } + public function edit(Tour $tour) { - return view('admin.tours.edit', compact('tour')); + $travelTypes = TravelType::all(); + return view('admin.tours.edit', compact('tour', 'travelTypes')); } + public function update(TourStoreRequest $request, Tour $tour) { $tour->update($request->validated()); + + // ذخیره فایل و گرفتن مسیر (بدون پسوند) + $path = $request->file('image')->store('photos', 'public'); + + $extension = $request->file('image')->getClientOriginalExtension(); + +// ایجاد رکورد + $tour->files()->create([ + 'name' => $path, + 'extension' => $extension, + 'size' => $request->file('image')->getSize(), + 'original_name' => $request->file('image')->getClientOriginalName(), + ]); + + return redirect()->route('admin.tours.index') ->with('success', 'تور با موفقیت به‌روزرسانی شد.'); } + public function destroy(Tour $tour) { $tour->delete(); @@ -50,7 +79,7 @@ class TourController extends Controller ->with('success', 'تور با موفقیت حذف شد.'); } - public function removeImage(Tour $tour, $image) + public function removeImage(Tour $tour, $image) { // منطق حذف تصویر — بسته به جدول تصاویر return back()->with('success', 'تصویر حذف شد.'); diff --git a/app/Http/Requests/TourStoreRequest.php b/app/Http/Requests/TourStoreRequest.php index 8673ff1..0ee6785 100644 --- a/app/Http/Requests/TourStoreRequest.php +++ b/app/Http/Requests/TourStoreRequest.php @@ -74,6 +74,18 @@ class TourStoreRequest extends FormRequest 'required', 'integer', 'min:0'], + 'images' => + [ + 'required', + 'array' + ], + 'images.*' => + [ + 'image', + 'mimes:jpeg,png,jpg,webp', + 'max:2048' + ], + 'status' => [ 'nullable', diff --git a/app/Models/Tour.php b/app/Models/Tour.php index 28dcd21..d8e774b 100644 --- a/app/Models/Tour.php +++ b/app/Models/Tour.php @@ -38,12 +38,17 @@ class Tour extends Model public static $snakeAttributes = false; protected $casts = [ - 'travel_type_id' => 'int', - 'start_date' => 'datetime', - 'end_date' => 'datetime', - 'price' => 'float', - 'capacity' => 'int', - 'status' => 'int' + 'start_date' => 'date', + 'end_date' => 'date', + 'price' => 'decimal:2', + 'status' => 'integer', + +// 'travel_type_id' => 'int', +// 'start_date' => 'datetime', +// 'end_date' => 'datetime', +// 'price' => 'float', +// 'capacity' => 'int', +// 'status' => 'int' ]; protected $fillable = [ @@ -56,7 +61,8 @@ class Tour extends Model 'end_date', 'price', 'capacity', - 'status' + 'status', + 'image', ]; public function travelType() @@ -93,5 +99,10 @@ class Tour extends Model return 'slug'; } + public function getStatusLabelAttribute() + { + return $this->status == 1 ? 'فعال' : 'پیش‌نویس'; + } + } diff --git a/resources/views/admin/tours/create.blade.php b/resources/views/admin/tours/create.blade.php index 6072aca..e0547e3 100644 --- a/resources/views/admin/tours/create.blade.php +++ b/resources/views/admin/tours/create.blade.php @@ -1,3 +1,62 @@ -
- -
+@extends('admin.layouts.app') + +@section('content') +
+
+
+
+
+

ثبت تور جدید

+
+
+
+ @csrf + +
+ + + @error('title') +
{{ $message }}
@enderror +
+ +
+ + + @error('description') +
{{ $message }}
@enderror +
+ +
+
+ + + @error('price') +
{{ $message }}
@enderror +
+
+ + + @error('image') +
{{ $message }}
@enderror +
+
+ +
+ انصراف + +
+
+
+
+
+
+
+@endsection + diff --git a/resources/views/admin/tours/edit.blade.php b/resources/views/admin/tours/edit.blade.php index 6710885..ff8da3a 100644 --- a/resources/views/admin/tours/edit.blade.php +++ b/resources/views/admin/tours/edit.blade.php @@ -1,3 +1,86 @@ -
- -
+@extends('admin.layouts.app') + +@section('content') +
+
+

ویرایش تور: {{ $tour->title }}

+ بازگشت +
+ + @if ($errors->any()) +
+
    + @foreach ($errors->all() as $error) +
  • {{ $error }}
  • + @endforeach +
+
+ @endif + +
+
+
+ @csrf + @method('PUT') + +
+ +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+
+ +
+ +
+
+
+
+
+@endsection diff --git a/resources/views/admin/tours/index.blade.php b/resources/views/admin/tours/index.blade.php index 0b6c400..b3dcc29 100644 --- a/resources/views/admin/tours/index.blade.php +++ b/resources/views/admin/tours/index.blade.php @@ -1,3 +1,61 @@ -
- -
+@extends('admin.layouts.app') {{-- فرض بر وجود لایوت ادمین --}} + +@section('content') +
+
+

مدیریت تورها

+ افزودن تور جدید +
+ + @if(session('success')) +
{{ session('success') }}
+ @endif + +
+
+ + + + + + + + + + + @forelse($tours as $tour) + + + + + + + @empty + + + + @endforelse + +
تصویرعنوان تورقیمت (تومان)عملیات
+ + {{ $tour->title }}{{ number_format($tour->price) }} +
+ مشاهده + ویرایش + +
+ @csrf + @method('DELETE') + +
+
+
هیچ توری یافت نشد.
+ + {{-- بخش بسیار مهم برای آزمون: نمایش لینک‌های صفحه‌بندی --}} +
+ {{ $tours->links() }} +
+
+
+
+@endsection diff --git a/resources/views/admin/tours/show.blade.php b/resources/views/admin/tours/show.blade.php index 404fad5..7e19e79 100644 --- a/resources/views/admin/tours/show.blade.php +++ b/resources/views/admin/tours/show.blade.php @@ -1,3 +1,80 @@ -
- -
+@extends('admin.layouts.app') + +@section('title', 'جزئیات تور') + +@section('content') + {{-- هدر صفحه --}} +
+

+ + جزئیات تور +

+
+ + ویرایش + + + بازگشت به لیست + +
+
+ + {{-- کارت اطلاعات --}} +
+
+ {{ $tour->title }} +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
عنوان{{ $tour->title }}
مبدا{{ $tour->origin }}
مقصد{{ $tour->destination }}
تاریخ شروع{{ \Carbon\Carbon::parse($tour->start_date)->format('Y/m/d') }}
تاریخ پایان{{ \Carbon\Carbon::parse($tour->end_date)->format('Y/m/d') }}
قیمت{{ number_format($tour->price) }} تومان
ظرفیت{{ $tour->capacity }} نفر
وضعیت + @if($tour->status == 0) + غیرفعال + @elseif($tour->status == 1) + فعال / پیش‌نویس + @elseif($tour->status == 2) + منتشرشده + @else + نامشخص + @endif +
توضیحات{!! nl2br(e($tour->description)) !!}
+
+
+@endsection