feat: images and products loading optimization
This commit is contained in:
@@ -66,4 +66,24 @@ class ProductsHandler
|
||||
'data' => $product,
|
||||
]);
|
||||
}
|
||||
|
||||
public function getProductImages(Request $request): JsonResponse
|
||||
{
|
||||
$productId = (int) $request->get('id');
|
||||
|
||||
try {
|
||||
$images = $this->productsService->getProductImages($productId);
|
||||
} catch (EntityNotFoundException $exception) {
|
||||
return new JsonResponse([
|
||||
'message' => 'Product with id ' . $productId . ' not found',
|
||||
], Response::HTTP_NOT_FOUND);
|
||||
} catch (Exception $exception) {
|
||||
$this->logger->error('Could not load images for product ' . $productId, ['exception' => $exception]);
|
||||
$images = [];
|
||||
}
|
||||
|
||||
return new JsonResponse([
|
||||
'data' => $images,
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -149,10 +149,19 @@ class ProductsService
|
||||
|
||||
$productsImagesMap = [];
|
||||
foreach ($productsImages as $item) {
|
||||
$productsImagesMap[$item['product_id']][] = [
|
||||
'url' => $this->image->make($item['image'])->contain($imageWidth, $imageHeight)->url(),
|
||||
'alt' => 'Product Image',
|
||||
];
|
||||
$productId = $item['product_id'];
|
||||
|
||||
// Ограничиваем количество картинок для каждого товара до 3
|
||||
if (!isset($productsImagesMap[$productId])) {
|
||||
$productsImagesMap[$productId] = [];
|
||||
}
|
||||
|
||||
if (count($productsImagesMap[$productId]) < 2) {
|
||||
$productsImagesMap[$productId][] = [
|
||||
'url' => $this->image->make($item['image'])->cover($imageWidth, $imageHeight)->url(),
|
||||
'alt' => 'Product Image',
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
$debug = [];
|
||||
@@ -234,10 +243,6 @@ class ProductsService
|
||||
$this->oc->load->model('catalog/review');
|
||||
$this->oc->load->model('tool/image');
|
||||
|
||||
$imageThumbWidth = 500;
|
||||
$imageThumbHeight = 500;
|
||||
$imageFullWidth = 1000;
|
||||
$imageFullHeight = 1000;
|
||||
$configTax = $this->oc->config->get('config_tax');
|
||||
|
||||
$product_info = $this->oc->model_catalog_product->getProduct($productId);
|
||||
@@ -271,35 +276,7 @@ class ProductsService
|
||||
$data['stock'] = $this->oc->language->get('text_instock');
|
||||
}
|
||||
|
||||
$allImages = [];
|
||||
if ($product_info['image']) {
|
||||
$allImages[] = $product_info['image'];
|
||||
}
|
||||
$results = $this->oc->model_catalog_product->getProductImages($productId);
|
||||
foreach ($results as $result) {
|
||||
$allImages[] = $result['image'];
|
||||
}
|
||||
|
||||
$images = [];
|
||||
foreach ($allImages as $imagePath) {
|
||||
try {
|
||||
[$width, $height] = $this->image->make($imagePath)->getRealSize();
|
||||
$images[] = [
|
||||
'thumbnailURL' => $this->image
|
||||
->make($imagePath)
|
||||
->contain($imageThumbWidth, $imageThumbHeight)
|
||||
->url(),
|
||||
'largeURL' => $this->image->make($imagePath)->resize($imageFullWidth, $imageFullHeight)->url(),
|
||||
'width' => $width,
|
||||
'height' => $height,
|
||||
'alt' => Str::htmlEntityEncode($product_info['name']),
|
||||
];
|
||||
} catch (Exception $e) {
|
||||
$this->logger->error($e->getMessage(), ['exception' => $e]);
|
||||
}
|
||||
}
|
||||
|
||||
$data['images'] = $images;
|
||||
$data['images'] = [];
|
||||
|
||||
$price = $this->priceCalculator->format($product_info['price'], $product_info['tax_class_id']);
|
||||
$priceNumeric = $this->priceCalculator->getPriceNumeric($product_info['price'], $product_info['tax_class_id']);
|
||||
@@ -441,4 +418,49 @@ class ProductsService
|
||||
->where('product_to_category.product_id', '=', $productId)
|
||||
->firstOrNull();
|
||||
}
|
||||
|
||||
public function getProductImages(int $productId): array
|
||||
{
|
||||
$imageThumbWidth = 500;
|
||||
$imageThumbHeight = 500;
|
||||
$imageFullWidth = 1000;
|
||||
$imageFullHeight = 1000;
|
||||
|
||||
$product_info = $this->oc->model_catalog_product->getProduct($productId);
|
||||
|
||||
if (! $product_info) {
|
||||
throw new EntityNotFoundException('Product with id ' . $productId . ' not found');
|
||||
}
|
||||
|
||||
$allImages = [];
|
||||
if ($product_info['image']) {
|
||||
$allImages[] = $product_info['image'];
|
||||
}
|
||||
|
||||
$results = $this->oc->model_catalog_product->getProductImages($productId);
|
||||
foreach ($results as $result) {
|
||||
$allImages[] = $result['image'];
|
||||
}
|
||||
|
||||
$images = [];
|
||||
foreach ($allImages as $imagePath) {
|
||||
try {
|
||||
[$width, $height] = $this->image->make($imagePath)->getRealSize();
|
||||
$images[] = [
|
||||
'thumbnailURL' => $this->image
|
||||
->make($imagePath)
|
||||
->contain($imageThumbWidth, $imageThumbHeight)
|
||||
->url(),
|
||||
'largeURL' => $this->image->make($imagePath)->resize($imageFullWidth, $imageFullHeight)->url(),
|
||||
'width' => $width,
|
||||
'height' => $height,
|
||||
'alt' => Str::htmlEntityEncode($product_info['name']),
|
||||
];
|
||||
} catch (Exception $e) {
|
||||
$this->logger->error($e->getMessage(), ['exception' => $e]);
|
||||
}
|
||||
}
|
||||
|
||||
return $images;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -37,4 +37,5 @@ return [
|
||||
'webhook' => [TelegramHandler::class, 'webhook'],
|
||||
'etlCustomers' => [ETLHandler::class, 'customers'],
|
||||
'etlCustomersMeta' => [ETLHandler::class, 'getCustomersMeta'],
|
||||
'getProductImages' => [ProductsHandler::class, 'getProductImages'],
|
||||
];
|
||||
|
||||
Reference in New Issue
Block a user