From 9c8b88ec9a49377ebaf688d621da37898f8cce2f Mon Sep 17 00:00:00 2001
From: Vladyslav Shcherbyna <vshcherbyna@magento.com>
Date: Tue, 26 Jan 2016 21:39:23 +0200
Subject: [PATCH] MAGETWO-47402: All type products are available

---
 .../Product/Initialization/Helper.php         | 33 ++++++++++++++++++-
 .../Product/Initialization/HelperTest.php     |  1 +
 .../Helper/ProductLinks/Plugin/Grouped.php    |  1 +
 3 files changed, 34 insertions(+), 1 deletion(-)

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 28ec88c2013..3d9e71cb00c 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 e64d8c2ef84..419793b43a5 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 c617dcf6632..4bb49b2513b 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 */
-- 
GitLab