diff --git a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Initialization/Helper.php b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Initialization/Helper.php index 28ec88c2013a0bd0672a8df0ff1692baa58449bf..3d9e71cb00cda663b4a5a38b8a63f708acc00423 100644 --- a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Initialization/Helper.php +++ b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Initialization/Helper.php @@ -167,7 +167,13 @@ class Helper } } $product = $this->productLinks->initializeLinks($product, $links); - $productLinks = $product->getProductLinks(); + $productLinks = []; + $savedLinksByType = []; + foreach ($product->getProductLinks() as $link) { + $savedLinksByType[$link->getLinkType()][] = $link; + } + $this->dropRelationProductsCache($product); + $linkTypes = [ 'related' => $product->getRelatedReadonly(), 'upsell' => $product->getUpsellReadonly(), @@ -184,7 +190,18 @@ class Helper ->setPosition(isset($linkData['position']) ? (int)$linkData['position'] : 0); $productLinks[] = $link; } + } else { + if (array_key_exists($linkType, $savedLinksByType)) { + $productLinks = array_merge($productLinks, $savedLinksByType[$linkType]); + } } + if (isset($savedLinksByType[$linkType])) { + unset($savedLinksByType[$linkType]); + } + } + + foreach($savedLinksByType as $links) { + $productLinks = array_merge($productLinks, $links); } $product->setProductLinks($productLinks); @@ -241,4 +258,18 @@ class Helper return $options; } + + /** + * @param \Magento\Catalog\Model\Product $product + * @return void + */ + private function dropRelationProductsCache(\Magento\Catalog\Model\Product $product) + { + $product->unsetData('up_sell_products'); + $product->unsetData('up_sell_products_ids'); + $product->unsetData('related_products'); + $product->unsetData('related_products_ids'); + $product->unsetData('cross_sell_products'); + $product->unsetData('cross_sell_products_ids'); + } } diff --git a/app/code/Magento/Catalog/Test/Unit/Controller/Adminhtml/Product/Initialization/HelperTest.php b/app/code/Magento/Catalog/Test/Unit/Controller/Adminhtml/Product/Initialization/HelperTest.php index e64d8c2ef84fa9c3d777eacbaaebfebf4ee00e60..419793b43a507d20c0bed0e1ccd948379c7af441 100644 --- a/app/code/Magento/Catalog/Test/Unit/Controller/Adminhtml/Product/Initialization/HelperTest.php +++ b/app/code/Magento/Catalog/Test/Unit/Controller/Adminhtml/Product/Initialization/HelperTest.php @@ -110,6 +110,7 @@ class HelperTest extends \PHPUnit_Framework_TestCase [ 'setData', 'addData', + 'unsetData', 'getId', 'setWebsiteIds', 'isLockedAttribute', diff --git a/app/code/Magento/GroupedProduct/Model/Product/Initialization/Helper/ProductLinks/Plugin/Grouped.php b/app/code/Magento/GroupedProduct/Model/Product/Initialization/Helper/ProductLinks/Plugin/Grouped.php index c617dcf66324e435f4840ad699981ec2dd320f4c..4bb49b2513b67285b0123517612631439879c259 100644 --- a/app/code/Magento/GroupedProduct/Model/Product/Initialization/Helper/ProductLinks/Plugin/Grouped.php +++ b/app/code/Magento/GroupedProduct/Model/Product/Initialization/Helper/ProductLinks/Plugin/Grouped.php @@ -75,6 +75,7 @@ class Grouped } $newLinks = []; $existingLinks = $product->getProductLinks(); + $product->unsetData('_cache_instance_associated_products'); if ($links) { foreach ($links as $linkId => $linkRaw) { /** @var \Magento\Catalog\Api\Data\ProductLinkInterface $productLink */