0

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

2
  • what issue you are facing? Commented Jun 6, 2022 at 12:25
  • issue fixed now, in Enterprise edition Magento_CatalogStaging module confilct. Commented Jun 6, 2022 at 12:53

1 Answer 1

0

I have fixed the above issue for the Magento EE and ECE versions. Just override CreateHandler.php and UpdateHandler.php files in di.xml

Imgix/Magento/etc/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" />
    <preference for="Magento\CatalogStaging\Model\Product\Gallery\CreateHandler"
                type="Imgix\Magento\Model\Product\Gallery\CreateHandler" />
    <preference for="Magento\CatalogStaging\Model\Product\Gallery\UpdateHandler"
                type="Imgix\Magento\Model\Product\Gallery\UpdateHandler" />
</config>

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.