/
ildar8919
/
Mediahosting
Обзор
Документация
Войти
/
ildar8919
/
Mediahosting
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
app/Http/Controllers/ProductController.php
229 строк
9 KB
Ildar
Добавление новых файлов
18 янв 2025, 15:18
18 янв 2025, 15:18
a5e5342
Код
Авторство
О чём код?
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Models\Nomenclature; // Модель для работы с номенклатурой use App\Models\Picture; // Модель для работы с картинками use App\Services\RabbitMQService; use Intervention\Image\ImageManager; use Intervention\Image\Drivers\Imagick\Driver; use Illuminate\Support\Facades\Log; class ProductController extends Controller { protected $rabbitMQService; public function __construct(RabbitMQService $rabbitMQService) { $this->rabbitMQService = $rabbitMQService; } public function index(Request $request) { // Начинаем с базового запроса $query = Nomenclature::query(); // Фильтрация по артикулу if ($request->filled('article')) { $query->where('article', 'like', '%' . $request->input('article') . '%'); } // Фильтрация по производителю if ($request->filled('manufacturer')) { $query->where('manufacturer', 'like', '%' . $request->input('manufacturer') . '%'); } // Фильтрация по типу товара if ($request->filled('type_of_product')) { $query->where('type_of_product', $request->input('type_of_product')); } // Фильтрация по категории, если тип товара выбран if ($request->filled('category')) { $query->where('category', $request->input('category')); } // Получаем все номенклатуры с учетом фильтров $nomenclatures = $query->get(); // Получаем уникальные значения для фильтров $articles = Nomenclature::distinct()->pluck('article'); $manufacturers = Nomenclature::distinct()->pluck('manufacturer'); $types = Nomenclature::distinct()->pluck('type_of_product'); $categories = Nomenclature::distinct()->pluck('category'); return view('products.index', compact('nomenclatures', 'articles', 'manufacturers', 'types', 'categories')); } public function upload(Request $request, $uuid) { $request->validate([ 'pictures.*' => 'required|image|max:2048', // Ограничение на размер изображения ]); foreach ($request->file('pictures') as $picture) { $imageManager = new ImageManager(new Driver()); $image = $imageManager->read($picture->getRealPath()); //$image = ImageManager::imagick()->read($picture->getRealPath()); $image->resize(600); // Сохраните временный файл $tempPath = storage_path('app/temp'); Log::info('Значение переменной:', ['variable' => $tempPath]); $image->save($tempPath); // Конвертация изображения в Base64 $imageData = base64_encode(file_get_contents($tempPath)); $uuidPicture = (string) \Str::uuid(); $originalName = $picture->getClientOriginalName(); $extension = $picture->getClientOriginalExtension(); $fileName = $uuidPicture . '.' . $extension; // Создаем уникальное имя файла // Подготовка данных для отправки $data = [ 'uid' => $uuid, 'base64' => $imageData, 'file_name' => $fileName, 'extension' => $extension, 'UUID_picture' => $uuidPicture, 'event'=>[ 'name' => 'ms.pictures.updated' ] ]; // Отправка данных в RabbitMQ $this->rabbitMQService->sendMessage(json_encode($data)); // Сохранение информации о картинке в базе данных // Перемещаем файл в public/img $picture->move(public_path('storage/img/'), $fileName); Picture::create([ 'UUID' => $uuidPicture, 'name_in_1C' => 'NONE', 'extension' => $extension, 'name_in_mediahosting' => $fileName, 'path' => 'img/' . $fileName, // Сохраняем относительный путь 'UUID_nomenclature' => $uuid, ]); // Удалите временный файл после использования unlink($tempPath); } return redirect()->route('nomenclatures.show', ['uuid' => $uuid])->with('success', 'Изображения успешно загружены!'); } public function show($uuid) { // Получаем конкретную номенклатуру с её картинками $nomenclature = Nomenclature::with('pictures')->where('UUID', $uuid)->firstOrFail(); return view('products.show', compact('nomenclature')); } public function getManufacturers(Request $request) { $query = $request->get('query'); $manufacturers = Nomenclature::where('manufacturer', 'like', '%' . $query . '%') ->distinct() ->pluck('manufacturer'); return response()->json($manufacturers); } public function setPrimaryImage(Request $request, $uuid) { // Валидация входных данных $request->validate([ 'picture_uuid' => 'required|exists:picture,UUID', ]); // Получаем номенклатуру и устанавливаем главную картинку $nomenclature = Nomenclature::where('UUID', $uuid)->firstOrFail(); $primaryPicture = Picture::where('UUID', $request->input('picture_uuid'))->firstOrFail(); // Установите UUID главной картинки в номенклатуре (например, в поле primary_image_uuid) $nomenclature->primary_image_uuid = $primaryPicture->UUID; $nomenclature->save(); return redirect()->route('nomenclatures.show', ['uuid' => $uuid])->with('success', 'Главная картинка успешно обновлена!'); } public function exportToRabbitMQ(Request $request, $uuid) { // Получаем номенклатуру по UUID $nomenclature = Nomenclature::where('UUID', $uuid)->firstOrFail(); // Получаем все изображения, связанные с номенклатурой $pictures = $nomenclature->pictures; // Сжимаем изображения и отправляем их в RabbitMQ foreach ($pictures as $picture) { // Сжимаем изображение $imageManager = new ImageManager(new Driver()); $image = $imageManager->read(public_path('storage/' . $picture->path)); // Сжимаем изображение до ширины 600 пикселей $image->resize(600); // Сохраняем временный файл $tempPath = storage_path('app/temp'); $image->save($tempPath); // Конвертация изображения в Base64 $imageData = base64_encode(file_get_contents($tempPath)); // Подготовка данных для отправки $data = [ 'uid' => $uuid, 'base64' => $imageData, 'file_name' => basename($tempPath), 'extension' => pathinfo($tempPath, PATHINFO_EXTENSION), 'UUID_picture' => $picture->UUID, 'event' => [ 'name' => 'ms.pictures.updated' ] ]; // Отправка данных в RabbitMQ $this->rabbitMQService->sendMessage(json_encode($data)); // Удаляем временный файл после использования unlink($tempPath); } return redirect()->route('nomenclatures.show', ['uuid' => $uuid])->with('success', 'Изображения успешно отправлены в RabbitMQ.'); } public function deletePicture(Request $request, $uuid, $picture_uuid) { // Находим номенклатуру по UUID $nomenclature = Nomenclature::where('UUID', $uuid)->firstOrFail(); // Находим картинку по UUID $picture = Picture::where('UUID', $picture_uuid)->firstOrFail(); // Удаляем файл изображения из файловой системы $filePath = public_path('storage/' . $picture->path); if (file_exists($filePath)) { unlink($filePath); } // Отправляем сообщение в RabbitMQ о том, что картинка удалена $data = [ 'uid' => $uuid, 'uid_picture' => $picture_uuid, 'event' => [ 'name' => 'ms.pictures.deleted' ] ]; $this->rabbitMQService->sendMessage(json_encode($data)); // Удаляем запись о картинке из базы данных $picture->delete(); return redirect()->route('nomenclatures.show', ['uuid' => $uuid])->with('success', 'Картинка успешно удалена.'); } }