diff --git a/app/code/core/Mage/Catalog/Model/Product.php b/app/code/core/Mage/Catalog/Model/Product.php index 25cf8881291..5728429a1e1 100644 --- a/app/code/core/Mage/Catalog/Model/Product.php +++ b/app/code/core/Mage/Catalog/Model/Product.php @@ -1464,6 +1464,16 @@ public function duplicate() ->setSkipImagesOnDuplicate($newProduct->getSkipImagesOnDuplicate()) ->duplicate($this->getId(), $newProduct->getId()); + $attributes = $this->getTypeInstance(true)->getSetAttributes($this); + // duplicate media after $this->getResource()->duplicate() + if (!$newProduct->getSkipImagesOnDuplicate() && isset($attributes['media_gallery'])) { + /** @var Mage_Catalog_Model_Resource_Eav_Attribute $mediaGalleryAttribute */ + $mediaGalleryAttribute = $attributes['media_gallery']; + /** @var Mage_Catalog_Model_Product_Attribute_Backend_Media $backend */ + $backend = $mediaGalleryAttribute->getBackend(); + $backend->duplicate($newProduct); + } + // TODO - duplicate product on all stores of the websites it is associated with /*if ($storeIds = $this->getWebsiteIds()) { foreach ($storeIds as $storeId) { diff --git a/app/code/core/Mage/Catalog/Model/Product/Attribute/Backend/Media.php b/app/code/core/Mage/Catalog/Model/Product/Attribute/Backend/Media.php index c17c2c6be07..915ef506771 100644 --- a/app/code/core/Mage/Catalog/Model/Product/Attribute/Backend/Media.php +++ b/app/code/core/Mage/Catalog/Model/Product/Attribute/Backend/Media.php @@ -95,6 +95,10 @@ public function validate($object) */ public function beforeSave($object) { + if ($object->getIsDuplicate() == true) { + return; + } + $attrCode = $this->getAttribute()->getAttributeCode(); $value = $object->getData($attrCode); if (!is_array($value) || !isset($value['images'])) { @@ -120,34 +124,17 @@ public function beforeSave($object) $clearImages = []; $newImages = []; $existImages = []; - if ($object->getIsDuplicate() != true) { - foreach ($value['images'] as &$image) { - if (!empty($image['removed'])) { - $clearImages[] = $image['file']; - } elseif (!isset($image['value_id'])) { - $newFile = $this->_moveImageFromTmp($image['file']); - $image['new_file'] = $newFile; - $newImages[$image['file']] = $image; - $this->_renamedImages[$image['file']] = $newFile; - $image['file'] = $newFile; - } else { - $existImages[$image['file']] = $image; - } - } - } else { - // For duplicating we need copy original images. - $duplicate = []; - foreach ($value['images'] as &$image) { - if (!isset($image['value_id'])) { - continue; - } - - $newFile = $this->_copyImage($image['file']); - $newImages[$image['file']] = [ - 'new_file' => $newFile, - 'label' => $image['label'], - ]; - $duplicate[$image['value_id']] = $newFile; + foreach ($value['images'] as &$image) { + if (!empty($image['removed'])) { + $clearImages[] = $image['file']; + } elseif (!isset($image['value_id'])) { + $newFile = $this->_moveImageFromTmp($image['file']); + $image['new_file'] = $newFile; + $newImages[$image['file']] = $image; + $this->_renamedImages[$image['file']] = $newFile; + $image['file'] = $newFile; + } else { + $existImages[$image['file']] = $image; } } @@ -200,7 +187,6 @@ public function getRenamedImage($file) public function afterSave($object) { if ($object->getIsDuplicate() == true) { - $this->duplicate($object); return; } @@ -700,9 +686,17 @@ public function duplicate($object) return $this; } + $newImagesMap = []; + foreach ($mediaGalleryData['images'] as &$image) { + $newImagesMap[$image['file']] = [ + 'file' => $this->_copyImage($image['file']), + 'old_value_id' => $image['value_id'], + ]; + } + $this->_getResource()->duplicate( $this, - $mediaGalleryData['duplicate'] ?? [], + $newImagesMap, $object->getOriginalId(), $object->getId(), ); diff --git a/app/code/core/Mage/Catalog/Model/Resource/Product/Attribute/Backend/Media.php b/app/code/core/Mage/Catalog/Model/Resource/Product/Attribute/Backend/Media.php index 18a04cca65c..76c87969b58 100644 --- a/app/code/core/Mage/Catalog/Model/Resource/Product/Attribute/Backend/Media.php +++ b/app/code/core/Mage/Catalog/Model/Resource/Product/Attribute/Backend/Media.php @@ -180,7 +180,7 @@ public function duplicate($object, $newFiles, $originalProductId, $newProductId) $data = [ 'attribute_id' => $object->getAttribute()->getId(), 'entity_id' => $newProductId, - 'value' => $newFiles[$row['value_id']] ?? $row['value'], + 'value' => $newFiles[$row['value']]['file'], ]; $valueIdMap[$row['value_id']] = $this->insertGallery($data); @@ -200,6 +200,33 @@ public function duplicate($object, $newFiles, $originalProductId, $newProductId) $this->insertGalleryValueInStore($row); } + // Duplicate product store values + $mediaAttributes = Mage::getModel('catalog/product')->getMediaAttributes(); + $attributeIds = array_map(fn($attr) => $attr->getAttributeId(), $mediaAttributes); + $tableName = $this->getTable(['catalog/product', 'varchar']); + $select = $this->_getReadAdapter()->select() + ->from($tableName, [ + 'entity_type_id', + 'attribute_id', + 'store_id', + 'value', + ]) + ->where('entity_id = ?', $originalProductId) + ->where('attribute_id IN (?)', $attributeIds); + + $attrRows = []; + foreach ($this->_getReadAdapter()->fetchAll($select) as $row) { + $attrRows[] = [ + 'entity_type_id' => $row['entity_type_id'], + 'attribute_id' => $row['attribute_id'], + 'store_id' => $row['store_id'], + 'entity_id' => $newProductId, + 'value' => $newFiles[$row['value']]['file'], + ]; + } + + $this->_getWriteAdapter()->insertOnDuplicate($tableName, $attrRows, ['value']); + return $this; }