diff --git a/app/Http/Controllers/PlacesController.php b/app/Http/Controllers/PlacesController.php index 89885be..2768d4c 100644 --- a/app/Http/Controllers/PlacesController.php +++ b/app/Http/Controllers/PlacesController.php @@ -60,22 +60,37 @@ class PlacesController extends Controller return str_replace([',',' '], ['|',''], $gps); } - public function edit(Place $place): VIEW + public function edit(int $id): VIEW { + $place = Place::find($id); return view('places.edit', compact('place')); } - public function update(Request $request, Place $place): Redirector|RedirectResponse + public function update(Request $request, int $id) { - $data = $request->validate([ - 'name' => 'required|string|max:255', - 'lat' => 'required|numeric', - 'lng' => 'required|numeric', + // Очистка телефона от маски перед валидацией + if ($request->filled('phone')) { + $request->merge(['phone' => preg_replace('/\D/', '', $request->phone)]); + } + + $validated = $request->validate([ + 'name' => 'required|max:512', + 'address' => 'nullable|max:512', + 'phone' => 'nullable|digits:11', + 'gps' => [ + 'nullable', + 'regex:/^[-+]?([1-8]?\d(\.\d+)?|90(\.0+)?),\s*[-+]?(180(\.0+)?|((1[0-7]\d)|([1-9]?\d))(\.\d+)?)$/' + ], + 'url' => 'nullable|url|max:255', + 'description' => 'nullable', ]); - $place->update($data); + + $place = Place::findOrFail($id); + $place->update($validated); + return redirect() ->route('places.index') - ->with('status', 'Обновлено!'); + ->with('success', 'Данные обновлены'); } public function delete(int $id): Redirector|RedirectResponse diff --git a/database/migrations/2026_05_19_142924_create_places_table.php b/database/migrations/2026_05_19_142924_create_places_table.php new file mode 100644 index 0000000..231e8af --- /dev/null +++ b/database/migrations/2026_05_19_142924_create_places_table.php @@ -0,0 +1,39 @@ +id(); + + // Основные поля + $create->string('name', 512)->nullable(); + $create->string('address', 512)->nullable(); + $create->string('phone', 128)->nullable(); + $create->string('gps', 512)->nullable(); + $create->string('url', 255)->nullable(); + $create->text('description')->nullable(); + + // Даты (Laravel по умолчанию использует timestamp, + // но здесь приведены к вашему формату datetime) + $create->datetime('created_at')->useCurrent(); + $create->datetime('updated_at')->useCurrent()->useCurrentOnUpdate(); + $create->softDeletes(); // Это поле deleted_at + + // Индексы с ограничением длины (как в вашем SQL) + $create->index([DB::raw('name(255)')], 'idx_name'); + $create->index([DB::raw('gps(255)')], 'idx_gps'); + }); + } + + public function down(): void + { + Schema::dropIfExists('places'); + } +}; diff --git a/resources/views/places/edit.blade.php b/resources/views/places/edit.blade.php new file mode 100644 index 0000000..24d06f3 --- /dev/null +++ b/resources/views/places/edit.blade.php @@ -0,0 +1,159 @@ +@extends('layouts.app') + +@section('content') +
+
+
+ +
+ + ← Назад к списку + + ID: {{ $place->id }} +
+ +
+
+ Редактировать локацию: {{ $place->name }} +
+ +
+
+ @csrf + @method('PUT') + + +
+ + + @error('name') +
{{ $message }}
+ @enderror +
+ + +
+ + + @error('address') +
{{ $message }}
+ @enderror +
+ + +
+ + + @error('phone') +
{{ $message }}
+ @enderror +
+ + +
+ + + @error('url') +
{{ $message }}
+ @enderror +
+ + +
+ +
+ + + + + + + +
+ @error('gps') +
{{ $message }}
+ @enderror +
+ + +
+ + +
+ + @if ($errors->any()) +
+
При сохранении возникли ошибки:
+
    + @foreach ($errors->all() as $error) +
  • {{ $error }}
  • + @endforeach +
+
+ @endif + +
+ +
+
+
+
+
+
+
+@endsection + +@push('scripts') + +@endpush diff --git a/resources/views/places/index.blade.php b/resources/views/places/index.blade.php index 5ed0db2..e9ac181 100644 --- a/resources/views/places/index.blade.php +++ b/resources/views/places/index.blade.php @@ -26,11 +26,6 @@ @endif
- @if(session('success')) -
- {{ session('success') }} -
- @endif @@ -61,7 +56,7 @@
- Редактировать + Редактировать
@csrf @method('DELETE') @@ -81,7 +76,6 @@
-
{{ $places->links() }}
diff --git a/routes/web.php b/routes/web.php index 4f6e36d..67e0e97 100755 --- a/routes/web.php +++ b/routes/web.php @@ -15,7 +15,8 @@ use App\Http\Controllers\PlacesController; Route::middleware('auth') ->group(function () { Route::get('/places', [PlacesController::class, 'index'])->name('places.index'); - Route::patch('/places/{id}', [PlacesController::class, 'update'])->name('places.update'); + Route::get('/places/{id}', [PlacesController::class, 'edit'])->name('places.edit'); + Route::put('/places/{id}', [PlacesController::class, 'update'])->name('places.update'); Route::get('/places/create', [PlacesController::class, 'create'])->name('places.create'); Route::post('/places/store', [PlacesController::class, 'store'])->name('places.store'); Route::delete('/places/{id}', [PlacesController::class, 'delete'])->name('places.delete');