imageHelper = $imageHelper; $this->viewConfig = $viewConfig; $this->imageParamsBuilder = $imageParamsBuilder; $this->videoHelper = $videoHelper; $this->adapterFactory = $adapterFactory; parent::__construct($context); } /** * @return bool */ public function checkDependencies() { try { $this->adapterFactory->create(); return true; } catch (Exception $e) { $this->_logger->critical($e->getMessage()); return false; } } /** * @param Product $product * @param string $imageId * @param string $imageIdHover * @param string $template * @param array $attributes * @param array $properties * * @return mixed */ public function getImageHover( Product $product, $imageId, $imageIdHover, $template = self::HOVER_TEMPLATE, array $attributes = [], $properties = [] ) { if (!$this->hasHoverImage($product, $imageId, $imageIdHover) && !$this->videoHelper->videoOnHover($product) ) { return $this->getImage($product, $imageId, self::TEMPLATE, $attributes, $properties); } if ($this->videoHelper->videoOnHover($product)) { $imageIdHover = $imageId; } $image = $this->_getImage($product, $imageId, $properties)->getUrl(); $imageMiscParams = $this->getImageParams($imageId); $image_hoverMiscParams = $this->getImageParams($imageIdHover); $image_hover = $this->resizeImage( $product, $imageIdHover, [ $imageMiscParams['image_width'], $imageMiscParams['image_height'], ], $properties )->getUrl(); $data = [ 'data' => [ 'template' => $template, 'product_id' => $product->getId(), 'product' => $product, 'image_id' => $imageId, 'image_hover_id' => $imageIdHover, 'image_url' => $image, 'image_hover_url' => $image_hover, 'label' => $this->getLabel($product, $imageMiscParams['image_type']), 'label_hover' => $this->getLabel($product, $image_hoverMiscParams['image_type']), 'width' => $imageMiscParams['image_width'], 'height' => $imageMiscParams['image_height'], 'ratio' => $this->getRatio($imageMiscParams['image_width'], $imageMiscParams['image_height']), 'class' => $this->getClass($attributes), 'custom_attributes' => $this->getStringCustomAttributes($attributes), ], ]; return $this->_createTemplate($data); } /** * @param Product $product * @param string $imageId * @param string $imageId_hover * * @return bool */ public function hasHoverImage(Product $product, $imageId, $imageId_hover) { if ($this->hoverImageEnabled()) { if ($imageId != $imageId_hover) { $_imageId = $this->getImageParams($imageId); $_imageId_hover = $this->getImageParams($imageId_hover); if ($_imageId['image_type'] !== $_imageId_hover['image_type']) { $image = $product->getData($_imageId['image_type']); $image_hover = $product->getData($_imageId_hover['image_type']); return $image && $image_hover && 'no_selection' !== $image_hover && $image !== $image_hover; } } } return false; } public function hoverImageEnabled() { return (bool)$this->getConfig(static::HOVER_IMAGE_ENABLED); } public function getConfig($path, $storeCode = null) { return $this->getSystemValue($path, $storeCode); } public function getSystemValue($path, $storeCode = null, $scopeType = ScopeInterface::SCOPE_STORE) { $value = $this->scopeConfig->getValue( $path, $scopeType, $storeCode ); if (is_null($value)) { $value = ''; } return $value; } /** * @param int $imageId * * @return array */ public function getImageParams($imageId) { $viewImageConfig = $this->getConfigView()->getMediaAttributes( 'Magento_Catalog', Image::MEDIA_TYPE_CONFIG_NODE, $imageId ); $imageMiscParams = $this->imageParamsBuilder->build($viewImageConfig); if (empty($imageMiscParams)) { $imageMiscParams = $this->getDefaultParams(); $this->_logger->critical(sprintf('No options found for "%s" images!', $imageId)); } return $imageMiscParams; } /** * Retrieve config view * * @return View */ protected function getConfigView() { if (!$this->configView) { $this->configView = $this->viewConfig->getViewConfig(); } return $this->configView; } /** * @return array */ protected function getDefaultParams() { return [ "image_type" => "small_image", "image_height" => 240, "image_width" => 240, "background" => [255, 255, 255], "quality" => 80, "keep_aspect_ratio" => true, "keep_frame" => true, "keep_transparency" => true, "constrain_only" => true, ]; } /** * @param Product $product * @param string $imageId * @param string $template * @param array $attributes * @param array $properties * * @return mixed */ public function getImage( Product $product, $imageId, $template = self::TEMPLATE, array $attributes = [], $properties = [] ) { $imageMiscParams = $this->getImageParams($imageId); $originalFilePath = $product->getData($imageMiscParams['image_type']); $isPlaceholder = $originalFilePath === null || $originalFilePath === 'no_selection'; $class = '\Magento\Catalog\Model\View\Asset\\' . ($isPlaceholder ? 'PlaceholderFactory' : 'ImageFactory'); if (class_exists($class)) { /** @var ImageFactory|PlaceholderFactory $viewAssetImageFactory */ $viewAssetImageFactory = ObjectManager::getInstance()->get($class); $image = $viewAssetImageFactory->create( [ 'miscParams' => $imageMiscParams, 'filePath' => $originalFilePath, 'type' => $imageMiscParams['image_type'] ] ); } else { $image = $this->_getImage($product, $imageId, $properties); } $attributes = $attributes === null ? [] : $attributes; $data = [ 'data' => [ 'template' => $template, 'product_id' => $product->getId(), 'product' => $product, 'image_id' => $imageId, 'image_url' => $image->getUrl(), 'label' => $this->getLabel($product, $imageMiscParams['image_type']), 'width' => $imageMiscParams['image_width'], 'height' => $imageMiscParams['image_height'], 'ratio' => $this->getRatio($imageMiscParams['image_width'], $imageMiscParams['image_height']), 'class' => $this->getClass($attributes), 'custom_attributes' => $this->getStringCustomAttributes($attributes), ], ]; return $this->_createTemplate($data); } /** * @param Product $product * @param string $imageId * @param array $properties * * @return Image */ private function _getImage(Product $product, $imageId, $properties = []) { return $this->imageHelper->init($product, $imageId, $properties); } /** * @param Product $product * * @param string $imageType * * @return string */ private function getLabel(Product $product, string $imageType): string { $label = ""; if (!empty($imageType)) { $label = $product->getData($imageType . '_' . 'label'); } if (empty($label)) { $label = $product->getName(); } return (string)$label; } /** * Calculate image ratio * * @param $width * @param $height * * @return float */ private function getRatio(int $width, int $height): float { if ($width && $height) { return $height / $width; } return 1.0; } /** * Retrieve image class for HTML element * * @param array $attributes * * @return string */ private function getClass(array $attributes): string { return $attributes['class'] ?? 'product-image-photo'; } /** * Retrieve image custom attributes for HTML element * * @param array $attributes * * @return string|array */ private function getStringCustomAttributes(array $attributes) { if (!$this->compareVersion()) { return $attributes; } $result = []; foreach ($attributes as $name => $value) { $result[] = $name . '="' . $value . '"'; } return !empty($result) ? implode(' ', $result) : ''; } /** * @param $version * * @return bool */ protected function compareVersion($version = '2.4.0') { return version_compare($this->getMagentoVersion(), $version, '<'); } /** * @return string */ private function getMagentoVersion() { if (!$this->_magentoVersion) { $this->_magentoVersion = ObjectManager::getInstance()->get(ProductMetadataInterface::class)->getVersion(); } return $this->_magentoVersion; } /** * @param array $data * * @return CatalogBlockProductImage */ private function _createTemplate($data = []) { return ObjectManager::getInstance()->create(CatalogBlockProductImage::class, $data); } /** * @param Product $product * @param string $imageId * @param array|int $size * @param array $properties * * @return Image */ public function resizeImage(Product $product, $imageId, $size, $properties = []) { $size = $this->prepareSize($size); $image = $this->_getImage($product, $imageId, $properties); if ($this->checkDependencies()) { $image->resize($size[0], $size[1]); } return $image; } /** * @param array|int $size * * @return array */ private function prepareSize($size) { if (is_array($size) && 1 >= count($size)) { $size = array_shift($size); } if (!is_array($size)) { $size = [$size, $size]; } $size = array_map('floatval', $size); $size = array_map('abs', $size); return $size; } public function getResizedImagesProduct( Product $product, $size, $template = self::THUMB_TEMPLATE, array $attributes = [], $properties = [] ) { ObjectManager::getInstance()->get(ReadHandler::class)->execute($product); $images = $product->getMediaGalleryImages(); $_images = []; $imageHelper = ObjectManager::getInstance()->get(\Olegnax\Athlete2\Helper\Image::class); $media_path = ObjectManager::getInstance()->get(Filesystem::class)->getDirectoryRead(DirectoryList::MEDIA)->getAbsolutePath(''); foreach ($images as $image) { $id = $image->getId(); $path = str_replace($media_path, '', $image->getPath()); $image = $imageHelper->init($path, $properties); $image->adaptiveResize($size); $image_width = $image->getWidth(); $image_height = $image->getHeight(); $image = $image->getUrl(); $_images[] = [ 'image_id' => $id, 'image_url' => $image, 'label' => $this->getLabel($product, ''), 'width' => $image_width, 'height' => $image_height, 'ratio' => $this->getRatio($image_width, $image_height), ]; } $data = [ 'data' => [ 'template' => $template, 'product_id' => $product->getId(), 'product' => $product, 'images' => $_images, 'width' => isset($_images[0]['width']) ? $_images[0]['width'] : 1, 'height' => isset($_images[0]['height']) ? $_images[0]['height'] : 1, 'ratio' => isset($_images[0]['ratio']) ? $_images[0]['ratio'] : 1, 'class' => $this->getClass($attributes), 'custom_attributes' => $this->getStringCustomAttributes($attributes), ], ]; return $this->_createTemplate($data); } /** * @param Product $product * @param string $imageId * @param string $imageId_hover * @param array|int $size * @param string $template * @param array $attributes * @param array $properties * * @return CatalogBlockProductImage|mixed */ public function getResizedImageHover( Product $product, $imageId, $imageId_hover, $size, $template = self::HOVER_TEMPLATE, array $attributes = [], $properties = [] ) { if (!is_array($template)) { $template = [ $template, self::TEMPLATE, ]; } else { foreach ([self::HOVER_TEMPLATE, self::TEMPLATE] as $key => $value) { if (!isset($template[$key]) || empty($template[$key])) { $template[$key] = $value; } } } if (!$this->hasHoverImage($product, $imageId, $imageId_hover) && !$this->videoHelper->videoOnHover($product) ) { return $this->getResizedImage($product, $imageId, $size, $template[1], $attributes, $properties); } if ($this->videoHelper->videoOnHover($product)) { $imageId_hover = $imageId; } $imageMiscParams = $this->getImageParams($imageId); if (empty($size)) { $size = [$imageMiscParams['image_width'], $imageMiscParams['image_height']]; } elseif (is_array($size)) { foreach (['image_width', 'image_height'] as $key => $value) { if (!isset($size[$key]) || empty($size[$key])) { $size[$key] = $imageMiscParams[$value]; } } } $image = $this->resizeImage($product, $imageId, $size, $properties); try { [ $imageMiscParams['image_width'], $imageMiscParams['image_height'] ] = $image->getResizedImageInfo(); } catch (Exception $e) { $this->_logger->error("OX Product Image: " . $e->getMessage()); $imageMiscParams['image_width'] = $imageMiscParams['image_height'] = 1; } $placeholder = $image->getDefaultPlaceholderUrl(); $image = $image->getUrl(); $image_hover = $this->resizeImage($product, $imageId_hover, $size, $properties)->getUrl(); $image_hoverMiscParams = $this->getImageParams($imageId_hover); if ($image_hover == $placeholder) { return $this->getResizedImage($product, $imageId, $size, $template[1], $attributes, $properties); } if ($image == $placeholder) { return $this->getImage($product, $imageId, $template[1], $attributes, $properties); } if (array_key_exists('class', $attributes)) { unset($attributes['class']); } $data = [ 'data' => [ 'template' => $template[0], 'product_id' => $product->getId(), 'product' => $product, 'image_id' => $imageId, 'image_hover_id' => $imageId_hover, 'image_url' => $image, 'image_hover_url' => $image_hover, 'label' => $this->getLabel($product, $imageMiscParams['image_type']), 'label_hover' => $this->getLabel($product, $image_hoverMiscParams['image_type']), 'width' => $imageMiscParams['image_width'], 'height' => $imageMiscParams['image_height'], 'ratio' => $this->getRatio($imageMiscParams['image_width'], $imageMiscParams['image_height']), 'class' => $this->getClass($attributes), 'custom_attributes' => $this->getStringCustomAttributes($attributes), ], ]; return $this->_createTemplate($data); } /** * @param Product $product * @param string $imageId * @param array|int $size * @param string $template * @param array $attributes * @param array $properties * * @return CatalogBlockProductImage|mixed */ public function getResizedImage( Product $product, $imageId, $size, $template = self::TEMPLATE, array $attributes = [], $properties = [] ) { $imageMiscParams = $this->getImageParams($imageId); if (empty($size)) { return $this->getImage($product, $imageId, $template, $attributes, $properties); } if (is_array($size)) { foreach (['image_width', 'image_height'] as $key => $value) { if (!isset($size[$key]) || empty($size[$key])) { $size[$key] = $imageMiscParams[$value]; } } } $image = $this->resizeImage($product, $imageId, $size, $properties); $imageMiscParams = $this->getImageParams($imageId); try { [ $imageMiscParams['image_width'], $imageMiscParams['image_height'] ] = $image->getResizedImageInfo(); } catch (Exception $e) { $this->_logger->error("OX Product Image: " . $e->getMessage()); $imageMiscParams['image_width'] = $imageMiscParams['image_height'] = 1; } $placeholder = $image->getDefaultPlaceholderUrl(); $image = $image->getUrl(); if ($image == $placeholder) { return $this->getImage($product, $imageId, $template, $attributes, $properties); } $data = [ 'data' => [ 'template' => $template, 'product_id' => $product->getId(), 'product' => $product, 'image_id' => $imageId, 'image_url' => $image, 'label' => $this->getLabel($product, $imageMiscParams['image_type']), 'width' => $imageMiscParams['image_width'], 'height' => $imageMiscParams['image_height'], 'ratio' => $this->getRatio($imageMiscParams['image_width'], $imageMiscParams['image_height']), 'class' => $this->getClass($attributes), 'custom_attributes' => $this->getStringCustomAttributes($attributes), ], ]; return $this->_createTemplate($data); } /** * @param Product $product * @param string $image * @param array|int $size * @param array $properties * * @return string */ public function getUrlResizedImage(Product $product, $image, $size, $properties = []) { $image = $this->resizeImage($product, $image, $size, $properties); return $image->getUrl(); } }