File: //home/marketing.cfbon.ru/public_html/app/Http/Controllers/Site/Menu/ProductController.php
<?php
namespace App\Http\Controllers\Site\Menu;
use App\Http\Controllers\Controller;
use App\Http\Requests\Site\Menu\ProductRequest;
use App\Models\Product;
use App\Models\ProductCategory;
use App\Models\Volume;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\Storage;
use Illuminate\View\View;
class ProductController extends Controller
{
public function index() : View
{
return view('site.menu.products.index', [
'productCategories' => ProductCategory::with('products.volumes')->get(),
]);
}
public function create() : View
{
$categories = ProductCategory::all();
$volumes = Volume::all();
return view('site.menu.products.create', compact('categories', 'volumes'));
}
public function store(ProductRequest $request) : RedirectResponse
{
$product = Product::create([
'category_id' => $request->input('category_id'),
'title' => $request->input('title'),
'description' => $request->input('description'),
'price' => $request->input('price'),
'size' => $request->input('size'),
'has_volumes' => $request->input('has_volumes'),
'is_only_here' => $request->input('is_only_here'),
'img' => $request->file('img'),
]);
if ($request->input('has_volumes') && $request->input('variations')) {
$product->volumes()->attach($request->input('variations'));
}
return redirect()->route('site.menu.products.index')->with('success', 'Товар успешно добавлен');
}
public function edit(string $id) : View
{
return view('site.menu.products.edit', [
'product' => Product::with('volumes')->findOrFail($id),
'categories' => ProductCategory::all(),
'volumes' => Volume::all(),
]);
}
public function update(ProductRequest $request, string $id) : RedirectResponse
{
$product = Product::findOrFail($id);
$product->update(Arr::except($request->validated(), ['variations']));
if ($request->input('has_volumes') && $request->input('variations')) {
$variations = collect($request->input('variations'))
->mapWithKeys(fn($item) => [
$item['volume_id'] => [
'price' => $item['price'],
'created_at' => now(),
'updated_at' => now()
]
])
->all();
$product->volumes()->sync($variations);
}
return redirect()->back()->with('success', 'Товар успешно изменен');
}
public function destroy(string $id) : RedirectResponse
{
$product = Product::findOrFail($id);
$product->delete();
return redirect()->route('site.menu.products.index')->with('success', 'Товар успешно удален');
}
public function deleteImg(string $id) : RedirectResponse
{
$product = Product::findOrFail($id);
Storage::disk('public')->delete($product->img);
$product->update(['img' => null]);
return redirect()->back()->with('success', 'Изображение удалено');
}
public function changeDescription(Request $request, string $id) : JsonResponse
{
try {
$validated = $request->validate([
'description' => 'nullable|string'
]);
$product = Product::findOrFail($id);
$product->update(['description' => $validated['description']]);
return response()->json([
'success' => true,
'message' => 'Описание успешно обновлено!',
'description' => $validated['description']
]);
} catch (\Exception $e) {
return response()->json([
'success' => false,
'message' => 'Ошибка при сохранении: ' . $e->getMessage()
], 500);
}
}
}