| Current Path : /home/rtorresani/www/vendor/magento/module-catalog/Block/Product/View/ |
| Current File : //home/rtorresani/www/vendor/magento/module-catalog/Block/Product/View/Gallery.php |
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
namespace Magento\Catalog\Block\Product\View;
use Magento\Catalog\Block\Product\Context;
use Magento\Catalog\Helper\Image;
use Magento\Catalog\Model\Product;
use Magento\Catalog\Model\Product\Gallery\ImagesConfigFactoryInterface;
use Magento\Catalog\Model\Product\Image\UrlBuilder;
use Magento\Framework\Data\Collection;
use Magento\Framework\DataObject;
use Magento\Framework\App\ObjectManager;
use Magento\Framework\Json\EncoderInterface;
use Magento\Framework\Stdlib\ArrayUtils;
/**
* Product gallery block
*
* @api
* @since 100.0.2
*/
class Gallery extends AbstractView
{
/**
* @var \Magento\Framework\Config\View
*/
protected $configView;
/**
* @var EncoderInterface
*/
protected $jsonEncoder;
/**
* @var array
*/
private $galleryImagesConfig;
/**
* @var ImagesConfigFactoryInterface
*/
private $galleryImagesConfigFactory;
/**
* @var UrlBuilder
*/
private $imageUrlBuilder;
/**
* @param Context $context
* @param ArrayUtils $arrayUtils
* @param EncoderInterface $jsonEncoder
* @param array $data
* @param ImagesConfigFactoryInterface|null $imagesConfigFactory
* @param array $galleryImagesConfig
* @param UrlBuilder|null $urlBuilder
*/
public function __construct(
Context $context,
ArrayUtils $arrayUtils,
EncoderInterface $jsonEncoder,
array $data = [],
ImagesConfigFactoryInterface $imagesConfigFactory = null,
array $galleryImagesConfig = [],
UrlBuilder $urlBuilder = null
) {
parent::__construct($context, $arrayUtils, $data);
$this->jsonEncoder = $jsonEncoder;
$this->galleryImagesConfigFactory = $imagesConfigFactory ?: ObjectManager::getInstance()
->get(ImagesConfigFactoryInterface::class);
$this->galleryImagesConfig = $galleryImagesConfig;
$this->imageUrlBuilder = $urlBuilder ?? ObjectManager::getInstance()->get(UrlBuilder::class);
}
/**
* Retrieve collection of gallery images
*
* @return Collection
*/
public function getGalleryImages()
{
$product = $this->getProduct();
$images = $product->getMediaGalleryImages();
if (!$images instanceof \Magento\Framework\Data\Collection) {
return $images;
}
foreach ($images as $image) {
$galleryImagesConfig = $this->getGalleryImagesConfig()->getItems();
foreach ($galleryImagesConfig as $imageConfig) {
$image->setData(
$imageConfig->getData('data_object_key'),
$this->imageUrlBuilder->getUrl($image->getFile(), $imageConfig['image_id'])
);
}
}
return $images;
}
/**
* Return magnifier options
*
* @return string
*/
public function getMagnifier()
{
return $this->jsonEncoder->encode($this->getVar('magnifier'));
}
/**
* Return breakpoints options
*
* @return string
*/
public function getBreakpoints()
{
return $this->jsonEncoder->encode($this->getVar('breakpoints'));
}
/**
* Retrieve product images in JSON format
*
* @return string
*/
public function getGalleryImagesJson()
{
$imagesItems = [];
/** @var DataObject $image */
foreach ($this->getGalleryImages() as $image) {
$mediaType = $image->getMediaType();
$imageItem = new DataObject(
[
'thumb' => $image->getData('small_image_url'),
'img' => $image->getData('medium_image_url'),
'full' => $image->getData('large_image_url'),
'caption' => $image->getLabel() ?: $this->getProduct()->getName(),
'position' => $image->getData('position'),
'isMain' => $this->isMainImage($image),
'type' => $mediaType !== null ? str_replace('external-', '', $mediaType) : '',
'videoUrl' => $image->getVideoUrl(),
]
);
foreach ($this->getGalleryImagesConfig()->getItems() as $imageConfig) {
$imageItem->setData(
$imageConfig->getData('json_object_key'),
$image->getData($imageConfig->getData('data_object_key'))
);
}
$imagesItems[] = $imageItem->toArray();
}
if (empty($imagesItems)) {
$imagesItems[] = [
'thumb' => $this->_imageHelper->getDefaultPlaceholderUrl('thumbnail'),
'img' => $this->_imageHelper->getDefaultPlaceholderUrl('image'),
'full' => $this->_imageHelper->getDefaultPlaceholderUrl('image'),
'caption' => '',
'position' => '0',
'isMain' => true,
'type' => 'image',
'videoUrl' => null,
];
}
return json_encode($imagesItems);
}
/**
* Retrieve gallery url
*
* @param null|\Magento\Framework\DataObject $image
* @return string
*/
public function getGalleryUrl($image = null)
{
$params = ['id' => $this->getProduct()->getId()];
if ($image) {
$params['image'] = $image->getValueId();
}
return $this->getUrl('catalog/product/gallery', $params);
}
/**
* Is product main image
*
* @param \Magento\Framework\DataObject $image
* @return bool
*/
public function isMainImage($image)
{
$product = $this->getProduct();
return $product->getImage() == $image->getFile();
}
/**
* Returns image attribute
*
* @param string $imageId
* @param string $attributeName
* @param string $default
* @return string
*/
public function getImageAttribute($imageId, $attributeName, $default = null)
{
$attributes = $this->getConfigView()
->getMediaAttributes('Magento_Catalog', Image::MEDIA_TYPE_CONFIG_NODE, $imageId);
return $attributes[$attributeName] ?? $default;
}
/**
* Retrieve config view
*
* @return \Magento\Framework\Config\View
*/
private function getConfigView()
{
if (!$this->configView) {
$this->configView = $this->_viewConfig->getViewConfig();
}
return $this->configView;
}
/**
* Returns image gallery config object
*
* @return Collection
*/
private function getGalleryImagesConfig()
{
if (false === $this->hasData('gallery_images_config')) {
$galleryImageConfig = $this->galleryImagesConfigFactory->create($this->galleryImagesConfig);
$this->setData('gallery_images_config', $galleryImageConfig);
}
return $this->getData('gallery_images_config');
}
}