I want to override Magento\Catalog\Model\Product\Gallery\CreateHandler
into the custom module.
Imgix/Magento/adminhtml/di.xml
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<preference for="Magento\Catalog\Model\Product\Gallery\CreateHandler"
type="Imgix\Magento\Model\Product\Gallery\CreateHandler"/>
<preference for="Magento\Catalog\Model\Product\Gallery\UpdateHandler"
type="Imgix\Magento\Model\Product\Gallery\UpdateHandler" />
</config>
I need some modifications to execute the method.I have added some line after } elseif (empty($image['value_id']) || !empty($image['recreate'])) {
line.
<?php
namespace Imgix\Magento\Model\Product\Gallery;
use Magento\Catalog\Api\Data\ProductInterface;
use Magento\Catalog\Model\Product;
use Magento\Framework\App\Filesystem\DirectoryList;
use Magento\Framework\App\ObjectManager;
use Magento\Framework\EntityManager\Operation\ExtensionInterface;
use Magento\MediaStorage\Model\File\Uploader as FileUploader;
use Magento\Store\Model\Store;
use Magento\Store\Model\StoreManagerInterface;
use Magento\Framework\EntityManager\EntityMetadata;
use Magento\Catalog\Api\Data\ProductAttributeInterface;
use Magento\MediaStorage\Helper\File\Storage\Database;
use Magento\Framework\EntityManager\MetadataPool;
use Magento\Catalog\Api\ProductAttributeRepositoryInterface;
use Magento\Catalog\Model\ResourceModel\Product\Gallery;
use Magento\Framework\Json\Helper\Data;
use Magento\Catalog\Model\Product\Media\Config;
use Magento\Framework\Filesystem;
use Magento\Framework\Filesystem\Directory\WriteInterface;
use Magento\Catalog\Model\Product\Gallery\CreateHandler as ProductGalleryCreateHandler;
class CreateHandler extends ProductGalleryCreateHandler
{
/**
* @param \Magento\Framework\EntityManager\MetadataPool $metadataPool
* @param \Magento\Catalog\Api\ProductAttributeRepositoryInterface $attributeRepository
* @param \Magento\Catalog\Model\ResourceModel\Product\Gallery $resourceModel
* @param \Magento\Framework\Json\Helper\Data $jsonHelper
* @param \Magento\Catalog\Model\Product\Media\Config $mediaConfig
* @param \Magento\Framework\Filesystem $filesystem
* @param \Magento\MediaStorage\Helper\File\Storage\Database $fileStorageDb
* @param \Magento\Store\Model\StoreManagerInterface|null $storeManager
* @throws \Magento\Framework\Exception\FileSystemException
*/
public function __construct(
\Magento\Framework\EntityManager\MetadataPool $metadataPool,
\Magento\Catalog\Api\ProductAttributeRepositoryInterface $attributeRepository,
\Magento\Catalog\Model\ResourceModel\Product\Gallery $resourceModel,
\Magento\Framework\Json\Helper\Data $jsonHelper,
\Magento\Catalog\Model\Product\Media\Config $mediaConfig,
\Magento\Framework\Filesystem $filesystem,
\Magento\MediaStorage\Helper\File\Storage\Database $fileStorageDb,
\Magento\Store\Model\StoreManagerInterface $storeManager = null
) {
$this->metadata = $metadataPool->getMetadata(\Magento\Catalog\Api\Data\ProductInterface::class);
$this->attributeRepository = $attributeRepository;
$this->resourceModel = $resourceModel;
$this->jsonHelper = $jsonHelper;
$this->mediaConfig = $mediaConfig;
$this->mediaDirectory = $filesystem->getDirectoryWrite(DirectoryList::MEDIA);
$this->fileStorageDb = $fileStorageDb;
$this->storeManager = $storeManager ?: ObjectManager::getInstance()->get(StoreManagerInterface::class);
parent::__construct(
$metadataPool,
$attributeRepository,
$resourceModel,
$jsonHelper,
$mediaConfig,
$filesystem,
$fileStorageDb,
$storeManager
);
}
/**
* Execute create handler
*
* @param object $product
* @param array $arguments
* @return object
* @throws \Magento\Framework\Exception\LocalizedException
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
* @SuppressWarnings(PHPMD.NPathComplexity)
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
* @since 101.0.0
*/
public function execute($product, $arguments = [])
{
$attrCode = $this->getAttribute()->getAttributeCode();
$value = $product->getData($attrCode);
if (!is_array($value) || !isset($value['images'])) {
return $product;
}
if (!is_array($value['images']) && strlen((string) $value['images']) > 0) {
$value['images'] = $this->jsonHelper->jsonDecode($value['images']);
}
if (!is_array($value['images'])) {
$value['images'] = [];
}
$clearImages = [];
$newImages = [];
$existImages = [];
if ($product->getIsDuplicate() != true) {
foreach ($value['images'] as &$image) {
if (!empty($image['removed']) && !$this->canRemoveImage($product, $image['file'])) {
$image['removed'] = '';
}
if (!empty($image['removed'])) {
$clearImages[] = $image['file'];
} elseif (empty($image['value_id']) || !empty($image['recreate'])) {
if (strpos((string) $image['file'], 'imgix') !== false) {
$image['new_file'] = $image['file'];
$newImages[$image['file']] = $image;
} else {
$newFile = $this->moveImageFromTmp($image['file']);
$image['new_file'] = $newFile;
$newImages[$image['file']] = $image;
$image['file'] = $newFile;
}
} else {
$existImages[$image['file']] = $image;
}
}
} else {
// For duplicating we need copy original images.
$duplicate = [];
foreach ($value['images'] as &$image) {
if (!empty($image['removed']) && !$this->canRemoveImage($product, $image['file'])) {
$image['removed'] = '';
}
if (empty($image['value_id']) || !empty($image['removed'])) {
continue;
}
$duplicate[$image['value_id']] = $this->copyImage($image['file']);
$image['new_file'] = $duplicate[$image['value_id']];
$newImages[$image['file']] = $image;
}
$value['duplicate'] = $duplicate;
}
if (!empty($value['images'])) {
$this->processMediaAttributes($product, $existImages, $newImages, $clearImages);
}
$product->setData($attrCode, $value);
if ($product->getIsDuplicate() == true) {
$this->duplicate($product);
return $product;
}
if (!is_array($value) || !isset($value['images']) || $product->isLockedAttribute($attrCode)) {
return $product;
}
$this->processDeletedImages($product, $value['images']);
$this->processNewAndExistingImages($product, $value['images']);
$product->setData($attrCode, $value);
return $product;
}
}
Does anyone know why preference is not working?
Note: Above code is working fine with the Magento CE version. Thanks