![]() Server : Apache System : Linux server2.corals.io 4.18.0-348.2.1.el8_5.x86_64 #1 SMP Mon Nov 15 09:17:08 EST 2021 x86_64 User : corals ( 1002) PHP Version : 7.4.33 Disable Function : exec,passthru,shell_exec,system Directory : /home/corals/old/vendor/magento/module-catalog/Model/Product/Gallery/ |
<?php /** * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ declare(strict_types=1); namespace Magento\Catalog\Model\Product\Gallery; use Magento\Catalog\Api\Data\ProductAttributeInterface; use Magento\Catalog\Api\Data\ProductInterface; use Magento\Catalog\Api\ProductAttributeRepositoryInterface; use Magento\Catalog\Model\Product; use Magento\Catalog\Model\ResourceModel\Product\Gallery; use Magento\Eav\Model\ResourceModel\AttributeValue; use Magento\Framework\EntityManager\EntityMetadata; use Magento\Framework\EntityManager\MetadataPool; use Magento\Framework\EntityManager\Operation\ExtensionInterface; use Magento\Framework\Serialize\Serializer\Json; /** * Copy gallery data from one product to another */ class CopyHandler implements ExtensionInterface { /** * @var EntityMetadata */ private $metadata; /** * @var Gallery */ private $galleryResourceModel; /** * @var ProductAttributeRepositoryInterface */ private $attributeRepository; /** * @var AttributeValue */ private $attributeValue; /** * @var Json */ private $json; /** * @var ProductAttributeInterface */ private $attribute; /** * @param MetadataPool $metadataPool * @param Gallery $galleryResourceModel * @param ProductAttributeRepositoryInterface $attributeRepository * @param AttributeValue $attributeValue * @param Json $json */ public function __construct( MetadataPool $metadataPool, Gallery $galleryResourceModel, ProductAttributeRepositoryInterface $attributeRepository, AttributeValue $attributeValue, Json $json ) { $this->metadata = $metadataPool->getMetadata(ProductInterface::class); $this->galleryResourceModel = $galleryResourceModel; $this->attributeRepository = $attributeRepository; $this->attributeValue = $attributeValue; $this->json = $json; } /** * Copy gallery data from one product to another * * @param Product $product * @param array $arguments * @return void */ public function execute($product, $arguments = []): void { $fromId = (int) $arguments['original_link_id']; $toId = $product->getData($this->metadata->getLinkField()); $attributeId = $this->getAttribute()->getAttributeId(); $valueIdMap = $this->galleryResourceModel->duplicate($attributeId, [], $fromId, $toId); $gallery = $this->getMediaGalleryCollection($product); if (!empty($gallery['images'])) { $images = []; foreach ($gallery['images'] as $key => $image) { $valueId = $image['value_id'] ?? null; $newKey = $key; if ($valueId !== null) { $newValueId = $valueId; if (isset($valueIdMap[$valueId])) { $newValueId = $valueIdMap[$valueId]; } if (((int) $valueId) === $key) { $newKey = $newValueId; } $image['value_id'] = $newValueId; } $images[$newKey] = $image; } $gallery['images'] = $images; $attrCode = $this->getAttribute()->getAttributeCode(); $product->setData($attrCode, $gallery); } //Copy media attribute values from one product to another if (isset($arguments['media_attribute_codes'])) { $values = $this->attributeValue->getValues( ProductInterface::class, $fromId, $arguments['media_attribute_codes'] ); if ($values) { foreach (array_keys($values) as $key) { $values[$key][$this->metadata->getLinkField()] = $product->getData($this->metadata->getLinkField()); unset($values[$key]['value_id']); } $this->attributeValue->insertValues( ProductInterface::class, $values ); } } } /** * Get product media gallery collection * * @param Product $product * @return array */ private function getMediaGalleryCollection(Product $product): array { $attrCode = $this->getAttribute()->getAttributeCode(); $value = $product->getData($attrCode); if (is_array($value) && isset($value['images'])) { if (!is_array($value['images']) && strlen($value['images']) > 0) { $value['images'] = $this->json->unserialize($value['images']); } if (!is_array($value['images'])) { $value['images'] = []; } } return $value; } /** * Returns media gallery attribute instance * * @return ProductAttributeInterface */ private function getAttribute(): ProductAttributeInterface { if (!$this->attribute) { $this->attribute = $this->attributeRepository->get( ProductInterface::MEDIA_GALLERY ); } return $this->attribute; } }