diff --git a/vendor/magento/module-bundle/Controller/Adminhtml/Product/Initialization/Helper/Plugin/Bundle.php b/vendor/magento/module-bundle/Controller/Adminhtml/Product/Initialization/Helper/Plugin/Bundle.php index 3c9eac68eb9..27dacfede11 100644 --- a/vendor/magento/module-bundle/Controller/Adminhtml/Product/Initialization/Helper/Plugin/Bundle.php +++ b/vendor/magento/module-bundle/Controller/Adminhtml/Product/Initialization/Helper/Plugin/Bundle.php @@ -8,12 +8,14 @@ namespace Magento\Bundle\Controller\Adminhtml\Product\Initialization\Helper\Plug use Magento\Bundle\Api\Data\OptionInterfaceFactory as OptionFactory; use Magento\Bundle\Api\Data\LinkInterfaceFactory as LinkFactory; use Magento\Catalog\Api\Data\ProductCustomOptionInterfaceFactory; +use Magento\Catalog\Api\Data\ProductInterface; use Magento\Catalog\Api\ProductRepositoryInterface as ProductRepository; use Magento\Store\Model\StoreManagerInterface as StoreManager; use Magento\Framework\App\RequestInterface; /** - * Class Bundle + * Plugin class to initialize Bundle product + * * @SuppressWarnings(PHPMD.CouplingBetweenObjects) */ class Bundle @@ -106,12 +108,14 @@ class Bundle $product->setBundleOptionsData($result['bundle_options']); } + if (!$result['bundle_selections']) { + $this->resetBundleProductOptions($product); + } + $this->processBundleOptionsData($product); $this->processDynamicOptionsData($product); } elseif (!$compositeReadonly) { - $extension = $product->getExtensionAttributes(); - $extension->setBundleProductOptions([]); - $product->setExtensionAttributes($extension); + $this->resetBundleProductOptions($product); } $affectProductSelections = (bool)$this->request->getPost('affect_bundle_product_selections'); @@ -120,6 +124,8 @@ class Bundle } /** + * Process Bundle Options Data + * * @param \Magento\Catalog\Model\Product $product * @return void * @SuppressWarnings(PHPMD.CyclomaticComplexity) @@ -161,10 +167,11 @@ class Bundle $extension = $product->getExtensionAttributes(); $extension->setBundleProductOptions($options); $product->setExtensionAttributes($extension); - return; } /** + * Process Dynamic Options Data + * * @param \Magento\Catalog\Model\Product $product * @return void */ @@ -198,9 +205,10 @@ class Bundle } /** + * Build product link + * * @param \Magento\Catalog\Model\Product $product * @param array $linkData - * * @return \Magento\Bundle\Api\Data\LinkInterface */ private function buildLink( @@ -228,4 +236,18 @@ class Bundle return $link; } + + /** + * Resets bundle product options inside product extension attributes + * + * @param ProductInterface $product + * @return void + */ + private function resetBundleProductOptions(ProductInterface $product) : void + { + $extension = $product->getExtensionAttributes(); + $extension->setBundleProductOptions([]); + $product->setExtensionAttributes($extension); + $product->setDropOptions(true); + } } diff --git a/vendor/magento/module-bundle/Model/Product/SaveHandler.php b/vendor/magento/module-bundle/Model/Product/SaveHandler.php index 41278356548..434055e891e 100644 --- a/vendor/magento/module-bundle/Model/Product/SaveHandler.php +++ b/vendor/magento/module-bundle/Model/Product/SaveHandler.php @@ -95,7 +95,9 @@ class SaveHandler implements ExtensionInterface /** @var OptionInterface[] $bundleProductOptions */ $bundleProductOptions = $entity->getExtensionAttributes()->getBundleProductOptions() ?: []; //Only processing bundle products. - if ($entity->getTypeId() !== Type::TYPE_CODE || empty($bundleProductOptions)) { + if ($entity->getTypeId() !== Type::TYPE_CODE + || (empty($bundleProductOptions) && !$entity->getDropOptions()) + ) { return $entity; }