Skip to content

Commit 96235b6

Browse files
authored
ENGCOM-4085: Improve bundle load speeds #20877
2 parents d4fad68 + 76503c0 commit 96235b6

File tree

2 files changed

+35
-23
lines changed

2 files changed

+35
-23
lines changed

app/code/Magento/Tax/Observer/GetPriceConfigurationObserver.php

Lines changed: 33 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,13 @@
55
*/
66
namespace Magento\Tax\Observer;
77

8-
use Magento\Framework\Event\ObserverInterface;
98
use Magento\Catalog\Pricing\Price\BasePrice;
109
use Magento\Catalog\Pricing\Price\RegularPrice;
10+
use Magento\Framework\Event\ObserverInterface;
1111

12+
/**
13+
* Modifies the bundle config for the front end to resemble the tax included price when tax included prices.
14+
*/
1215
class GetPriceConfigurationObserver implements ObserverInterface
1316
{
1417
/**
@@ -23,6 +26,11 @@ class GetPriceConfigurationObserver implements ObserverInterface
2326
*/
2427
protected $registry;
2528

29+
/**
30+
* @var array Cache of the current bundle selection items
31+
*/
32+
private $selectionCache = [];
33+
2634
/**
2735
* @param \Magento\Framework\Registry $registry
2836
* @param \Magento\Tax\Helper\Data $taxData
@@ -44,6 +52,7 @@ public function __construct(
4452
*/
4553
public function execute(\Magento\Framework\Event\Observer $observer)
4654
{
55+
$this->selectionCache = [];
4756
if ($this->taxData->displayPriceIncludingTax()) {
4857
/** @var \Magento\Catalog\Model\Product $product */
4958
$product = $this->registry->registry('current_product');
@@ -78,12 +87,11 @@ private function recurConfigAndUpdatePrice($input, $searchKey)
7887
if (is_array($el)) {
7988
$holder[$key] =
8089
$this->recurConfigAndUpdatePrice($el, $searchKey);
81-
if ($key === $searchKey) {
82-
if ((array_key_exists('basePrice', $holder[$key]))) {
83-
if (array_key_exists('optionId', $input)) {
84-
$holder = $this->updatePriceForBundle($holder, $key);
85-
}
86-
}
90+
if ($key === $searchKey
91+
&& array_key_exists('optionId', $input)
92+
&& array_key_exists('basePrice', $holder[$key])
93+
) {
94+
$holder = $this->updatePriceForBundle($holder, $key);
8795
}
8896
} else {
8997
$holder[$key] = $el;
@@ -102,32 +110,35 @@ private function recurConfigAndUpdatePrice($input, $searchKey)
102110
*/
103111
private function updatePriceForBundle($holder, $key)
104112
{
105-
if (array_key_exists($key, $holder)) {
106-
if (array_key_exists('basePrice', $holder[$key])) {
107-
/** @var \Magento\Catalog\Model\Product $product */
108-
$product = $this->registry->registry('current_product');
109-
if ($product->getTypeId() == \Magento\Catalog\Model\Product\Type::TYPE_BUNDLE) {
113+
if (array_key_exists($key, $holder)
114+
&& array_key_exists('basePrice', $holder[$key])) {
115+
/** @var \Magento\Catalog\Model\Product $product */
116+
$product = $this->registry->registry('current_product');
117+
if ($product->getTypeId() == \Magento\Catalog\Model\Product\Type::TYPE_BUNDLE) {
118+
if (!isset($this->selectionCache[$product->getId()])) {
110119
$typeInstance = $product->getTypeInstance();
111120
$typeInstance->setStoreFilter($product->getStoreId(), $product);
112121

113122
$selectionCollection = $typeInstance->getSelectionsCollection(
114123
$typeInstance->getOptionsIds($product),
115124
$product
116125
);
126+
$this->selectionCache[$product->getId()] = $selectionCollection->getItems();
127+
}
128+
$arrSelections = $this->selectionCache[$product->getId()];
117129

118-
foreach ($selectionCollection->getItems() as $selectionItem) {
119-
if ($holder['optionId'] == $selectionItem->getId()) {
120-
/** @var \Magento\Framework\Pricing\Amount\Base $baseAmount */
121-
$baseAmount = $selectionItem->getPriceInfo()->getPrice(BasePrice::PRICE_CODE)->getAmount();
122-
/** @var \Magento\Framework\Pricing\Amount\Base $oldAmount */
123-
$oldAmount =
130+
foreach ($arrSelections as $selectionItem) {
131+
if ($holder['optionId'] == $selectionItem->getId()) {
132+
/** @var \Magento\Framework\Pricing\Amount\Base $baseAmount */
133+
$baseAmount = $selectionItem->getPriceInfo()->getPrice(BasePrice::PRICE_CODE)->getAmount();
134+
/** @var \Magento\Framework\Pricing\Amount\Base $oldAmount */
135+
$oldAmount =
124136
$selectionItem->getPriceInfo()->getPrice(RegularPrice::PRICE_CODE)->getAmount();
125-
if ($baseAmount->hasAdjustment('tax')) {
126-
$holder[$key]['basePrice']['amount'] =
137+
if ($baseAmount->hasAdjustment('tax')) {
138+
$holder[$key]['basePrice']['amount'] =
127139
$baseAmount->getBaseAmount() + $baseAmount->getAdjustmentAmount('tax');
128-
$holder[$key]['oldPrice']['amount'] =
140+
$holder[$key]['oldPrice']['amount'] =
129141
$oldAmount->getBaseAmount() + $oldAmount->getAdjustmentAmount('tax');
130-
}
131142
}
132143
}
133144
}

app/code/Magento/Tax/Test/Unit/Observer/GetPriceConfigurationObserverTest.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
* Copyright © Magento, Inc. All rights reserved.
44
* See COPYING.txt for license details.
55
*/
6+
67
namespace Magento\Tax\Test\Unit\Observer;
78

89
use Magento\Framework\TestFramework\Unit\Helper\ObjectManager;
@@ -118,7 +119,7 @@ public function testExecute($testArray, $expectedArray)
118119

119120
$product = $this->createPartialMock(
120121
\Magento\Bundle\Model\Product\Type::class,
121-
['getTypeInstance', 'getTypeId', 'getStoreId', 'getSelectionsCollection']
122+
['getTypeInstance', 'getTypeId', 'getStoreId', 'getSelectionsCollection', 'getId']
122123
);
123124
$product->expects($this->any())
124125
->method('getTypeInstance')

0 commit comments

Comments
 (0)