HEX
Server: LiteSpeed
System: Linux php-prod-3.spaceapp.ru 5.15.0-151-generic #161-Ubuntu SMP Tue Jul 22 14:25:40 UTC 2025 x86_64
User: sarli3128 (1010)
PHP: 7.4.33
Disabled: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
Upload Files
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);
        }
    }
}