diff --git a/app/code/Magento/ConfigurableProduct/Model/ConfigurableMaxPriceCalculator.php b/app/code/Magento/ConfigurableProduct/Model/ConfigurableMaxPriceCalculator.php index 53496206963df..fc4411f29a006 100644 --- a/app/code/Magento/ConfigurableProduct/Model/ConfigurableMaxPriceCalculator.php +++ b/app/code/Magento/ConfigurableProduct/Model/ConfigurableMaxPriceCalculator.php @@ -1,7 +1,7 @@ resourceConnection->getConnection(); $superLinkTable = $this->resourceConnection->getTableName('catalog_product_super_link'); @@ -63,7 +63,7 @@ public function getMaxPriceForConfigurableProduct($productId) $result = $connection->fetchRow($select); if ($result && isset($result['max_price'])) { - return $result['max_price']; + return (float) $result['max_price']; } // Return a default value or handle the case where there's no max price diff --git a/app/code/Magento/ConfigurableProduct/Pricing/Price/ConfigurableRegularPrice.php b/app/code/Magento/ConfigurableProduct/Pricing/Price/ConfigurableRegularPrice.php index 58c5e422a73a5..acb50b8b9fbdd 100644 --- a/app/code/Magento/ConfigurableProduct/Pricing/Price/ConfigurableRegularPrice.php +++ b/app/code/Magento/ConfigurableProduct/Pricing/Price/ConfigurableRegularPrice.php @@ -1,7 +1,7 @@ isPriceEqualAcrossChildProducts(); + } + + /** + * Check whether Configurable options do not have price difference + * + * @return bool + */ + public function isPriceEqualAcrossChildProducts(): bool { $minPrice = $this->getMinRegularAmount()->getValue(); - $final_price = $product->getFinalPrice(); - $productId = $product->getId(); - if ($final_price < $minPrice) { + + if ($this->product instanceof Product && $this->product->getFinalPrice() < $minPrice) { return false; } - $attributes = $product->getTypeInstance()->getConfigurableAttributes($product); - $items = $attributes->getItems(); - $options = reset($items); - $maxPrice = $this->configurableMaxPriceCalculator->getMaxPriceForConfigurableProduct($productId); - if ($maxPrice == 0) { + + $maxPrice = $this->configurableMaxPriceCalculator + ->getMaxPriceForConfigurableProduct((int) $this->product->getId()); + if ($maxPrice === 0.0) { $maxPrice = $this->getMaxRegularAmount()->getValue(); } - return (count($options->getOptions()) > 1) && $minPrice == $maxPrice; + + return $minPrice === $maxPrice; } } diff --git a/app/code/Magento/ConfigurableProduct/view/base/templates/product/price/final_price.phtml b/app/code/Magento/ConfigurableProduct/view/base/templates/product/price/final_price.phtml index 880a11fa9b305..792dba8137511 100644 --- a/app/code/Magento/ConfigurableProduct/view/base/templates/product/price/final_price.phtml +++ b/app/code/Magento/ConfigurableProduct/view/base/templates/product/price/final_price.phtml @@ -1,7 +1,7 @@ getPriceType('final_price'); $regularPriceModel = $block->getPriceType('regular_price'); $idSuffix = $block->getIdSuffix() ? $block->getIdSuffix() : ''; $schema = ($block->getZone() == 'item_view') ? true : false; -$product = $regularPriceModel->getProduct(); ?> renderAmount($finalPriceModel->getAmount(), [ - 'display_label' => $regularPriceModel->isChildProductsOfEqualPrices($product) ? '' : __('As low as'), + 'display_label' => $regularPriceModel->isPriceEqualAcrossChildProducts() ? '' : __('As low as'), 'price_id' => $block->getPriceId('product-price-' . $idSuffix), 'price_type' => 'finalPrice', 'include_container' => true, diff --git a/dev/tests/integration/testsuite/Magento/ConfigurableProduct/Block/Product/View/Type/ConfigurableViewOnCategoryPageTest.php b/dev/tests/integration/testsuite/Magento/ConfigurableProduct/Block/Product/View/Type/ConfigurableViewOnCategoryPageTest.php index cf8bfd31387fe..435b642013b67 100644 --- a/dev/tests/integration/testsuite/Magento/ConfigurableProduct/Block/Product/View/Type/ConfigurableViewOnCategoryPageTest.php +++ b/dev/tests/integration/testsuite/Magento/ConfigurableProduct/Block/Product/View/Type/ConfigurableViewOnCategoryPageTest.php @@ -1,7 +1,7 @@ assertProductPrice('configurable', '$150.00'); } + #[ + AppIsolation(true), + DataFixture(CategoryFixture::class, [], 'category'), + DataFixture(ProductFixture::class, [ + 'sku' => 'simple_1', + 'price' => 10.0, + 'visibility' => Visibility::VISIBILITY_NOT_VISIBLE + ], 'p1'), + DataFixture(AttributeFixture::class, as: 'attr'), + DataFixture( + ConfigurableProductFixture::class, + [ + 'sku' => 'configurable', + '_options' => ['$attr$'], + '_links' => ['$p1$'] + ], + 'configurable' + ), + DataFixture( + AssignProductsFixture::class, + ['products' => ['$configurable$', '$p1$'], 'category' => '$category$'], + as: 'assignProducts' + ) + ] + public function testCheckConfigurablePriceOnOneSimple(): void + { + $this->resetPageLayout(); + $fixtures = DataFixtureStorageManager::getStorage(); + + $this->registry->unregister('current_category'); + $this->registry->register( + 'current_category', + $fixtures->get('category') + ); + $this->page->addHandle(['default', 'catalog_category_view']); + $this->page->getLayout()->generateXml(); + + $this->assertCollectionSize(1, $this->getListingBlock()->getLoadedProductCollection()); + $priceHtml = $this->getListingBlock()->getProductPrice($this->getProduct('configurable')); + $this->assertStringContainsString('$10.00', $this->clearPriceHtml($priceHtml)); + } + /** * @param string $sku * @param string $priceString