Skip to content

Commit 9a713e4

Browse files
committed
Merge remote-tracking branch 'l3/ACP2E-634' into PR_L3_06_04_2022
2 parents 6d84004 + fb05539 commit 9a713e4

File tree

13 files changed

+450
-40
lines changed

13 files changed

+450
-40
lines changed

app/code/Magento/CatalogGraphQl/Model/Resolver/Products/DataProvider/Product/CollectionProcessor/StockProcessor.php

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,10 @@ public function process(
5757
array $attributeNames,
5858
ContextInterface $context = null
5959
): Collection {
60-
if (!$this->stockConfig->isShowOutOfStock()) {
61-
$this->stockStatusResource->addIsInStockFilterToCollection($collection);
60+
$stockFlag = 'has_stock_status_filter';
61+
if (!$collection->hasFlag($stockFlag)) {
62+
$this->stockStatusResource->addStockDataToCollection($collection, !$this->stockConfig->isShowOutOfStock());
63+
$collection->setFlag($stockFlag, true);
6264
}
6365

6466
return $collection;
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\ConfigurableProduct\Pricing\Price;
9+
10+
use Magento\Catalog\Api\Data\ProductInterface;
11+
use Magento\Framework\Exception\InvalidArgumentException;
12+
13+
class ConfigurableOptionsCompositeFilter implements ConfigurableOptionsFilterInterface
14+
{
15+
/**
16+
* @var ConfigurableOptionsFilterInterface[]
17+
*/
18+
private $configurableOptionsFilters;
19+
20+
/**
21+
* @param ConfigurableOptionsFilterInterface[] $configurableOptionsFilters
22+
* @throws InvalidArgumentException
23+
*/
24+
public function __construct(
25+
array $configurableOptionsFilters = []
26+
) {
27+
foreach ($configurableOptionsFilters as $configurableOptionsFilter) {
28+
if (!$configurableOptionsFilter instanceof ConfigurableOptionsFilterInterface) {
29+
throw new InvalidArgumentException(
30+
__(
31+
'Filter %1 doesn\'t implement %2',
32+
get_class($configurableOptionsFilter),
33+
ConfigurableOptionsFilterInterface::class
34+
)
35+
);
36+
}
37+
}
38+
$this->configurableOptionsFilters = $configurableOptionsFilters;
39+
}
40+
41+
/**
42+
* @inheritdoc
43+
*/
44+
public function filter(ProductInterface $parentProduct, array $childProducts): array
45+
{
46+
foreach ($this->configurableOptionsFilters as $configurableOptionsFilter) {
47+
$childProducts = $configurableOptionsFilter->filter($parentProduct, $childProducts);
48+
}
49+
return $childProducts;
50+
}
51+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\ConfigurableProduct\Pricing\Price;
9+
10+
use Magento\Catalog\Api\Data\ProductInterface;
11+
12+
/**
13+
* Filter configurable child products for price calculation
14+
*/
15+
interface ConfigurableOptionsFilterInterface
16+
{
17+
/**
18+
* Filter configurable child products for price calculation
19+
*
20+
* @param ProductInterface $parentProduct
21+
* @param ProductInterface[] $childProducts
22+
* @return array
23+
*/
24+
public function filter(ProductInterface $parentProduct, array $childProducts): array;
25+
}

app/code/Magento/ConfigurableProduct/Pricing/Price/ConfigurableOptionsProvider.php

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
use Magento\Catalog\Api\Data\ProductInterface;
1010
use Magento\ConfigurableProduct\Model\Product\Type\Configurable;
11+
use Magento\Framework\App\ObjectManager;
1112

1213
/**
1314
* Provide configurable child products for price calculation
@@ -24,13 +25,22 @@ class ConfigurableOptionsProvider implements ConfigurableOptionsProviderInterfac
2425
*/
2526
private $products;
2627

28+
/**
29+
* @var ConfigurableOptionsFilterInterface
30+
*/
31+
private $configurableOptionsFilter;
32+
2733
/**
2834
* @param Configurable $configurable
35+
* @param ConfigurableOptionsFilterInterface|null $configurableOptionsFilter
2936
*/
3037
public function __construct(
31-
Configurable $configurable
38+
Configurable $configurable,
39+
?ConfigurableOptionsFilterInterface $configurableOptionsFilter = null
3240
) {
3341
$this->configurable = $configurable;
42+
$this->configurableOptionsFilter = $configurableOptionsFilter
43+
?? ObjectManager::getInstance()->get(ConfigurableOptionsFilterInterface::class);
3444
}
3545

3646
/**
@@ -39,7 +49,10 @@ public function __construct(
3949
public function getProducts(ProductInterface $product)
4050
{
4151
if (!isset($this->products[$product->getId()])) {
42-
$this->products[$product->getId()] = $this->configurable->getUsedProducts($product);
52+
$this->products[$product->getId()] = $this->configurableOptionsFilter->filter(
53+
$product,
54+
$this->configurable->getUsedProducts($product)
55+
);
4356
}
4457
return $this->products[$product->getId()];
4558
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\ConfigurableProduct\Pricing\Price;
9+
10+
use Magento\Catalog\Api\Data\ProductInterface;
11+
use Magento\Catalog\Model\Product\Attribute\Source\Status;
12+
13+
class ConfigurableOptionsStatusFilter implements ConfigurableOptionsFilterInterface
14+
{
15+
/**
16+
* @inheritdoc
17+
*/
18+
public function filter(ProductInterface $parentProduct, array $childProducts): array
19+
{
20+
$result = [];
21+
foreach ($childProducts as $childProduct) {
22+
if ((int) $childProduct->getStatus() === Status::STATUS_ENABLED) {
23+
$result[] = $childProduct;
24+
}
25+
}
26+
27+
return $result;
28+
}
29+
}
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\ConfigurableProduct\Pricing\Price;
9+
10+
use Magento\Catalog\Api\Data\ProductInterface;
11+
use Magento\CatalogInventory\Api\StockConfigurationInterface;
12+
13+
class ConfigurableOptionsStockStatusFilter implements ConfigurableOptionsFilterInterface
14+
{
15+
/**
16+
* @var StockConfigurationInterface
17+
*/
18+
private $stockConfig;
19+
20+
/**
21+
* @param StockConfigurationInterface $stockConfig
22+
*/
23+
public function __construct(
24+
StockConfigurationInterface $stockConfig
25+
) {
26+
$this->stockConfig = $stockConfig;
27+
}
28+
29+
/**
30+
* @inheritdoc
31+
*/
32+
public function filter(ProductInterface $parentProduct, array $childProducts): array
33+
{
34+
if ($this->stockConfig->isShowOutOfStock()) {
35+
$result = $childProducts;
36+
if ($parentProduct->getIsSalable()) {
37+
$result = $this->filterInStockProducts($childProducts) ?: $childProducts;
38+
}
39+
} else {
40+
$result = $this->filterInStockProducts($childProducts);
41+
}
42+
43+
return $result;
44+
}
45+
46+
/**
47+
* Returns in-stock products
48+
*
49+
* @param ProductInterface[] $childProducts
50+
* @return ProductInterface[]
51+
*/
52+
private function filterInStockProducts(array $childProducts): array
53+
{
54+
$result = [];
55+
foreach ($childProducts as $childProduct) {
56+
if ($childProduct->getIsSalable()) {
57+
$result[] = $childProduct;
58+
}
59+
}
60+
return $result;
61+
}
62+
}

app/code/Magento/ConfigurableProduct/etc/di.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
<preference for="Magento\ConfigurableProduct\Model\ResourceModel\Attribute\OptionSelectBuilderInterface" type="Magento\ConfigurableProduct\Model\ResourceModel\Attribute\OptionSelectBuilder" />
2020
<preference for="Magento\ConfigurableProduct\Model\ResourceModel\Product\Indexer\Price\OptionsIndexerInterface" type="Magento\ConfigurableProduct\Model\ResourceModel\Product\Indexer\Price\OptionsIndexer" />
2121
<preference for="Magento\ConfigurableProduct\Model\ResourceModel\Product\Indexer\Price\OptionsSelectBuilderInterface" type="Magento\ConfigurableProduct\Model\ResourceModel\Product\Indexer\Price\OptionsSelectBuilder" />
22+
<preference for="Magento\ConfigurableProduct\Pricing\Price\ConfigurableOptionsFilterInterface" type="Magento\ConfigurableProduct\Pricing\Price\ConfigurableOptionsCompositeFilter" />
2223

2324
<type name="Magento\CatalogInventory\Model\Quote\Item\QuantityValidator\Initializer\Option">
2425
<plugin name="configurable_product" type="Magento\ConfigurableProduct\Model\Quote\Item\QuantityValidator\Initializer\Option\Plugin\ConfigurableProduct" sortOrder="50" />

app/code/Magento/ConfigurableProduct/etc/frontend/di.xml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,12 @@
1515
<plugin name="used_products_cache" type="Magento\ConfigurableProduct\Model\Plugin\Frontend\UsedProductsCache" />
1616
<plugin name="used_products_website_filter" type="Magento\ConfigurableProduct\Model\Plugin\Frontend\UsedProductsWebsiteFilter" />
1717
</type>
18+
<type name="Magento\ConfigurableProduct\Pricing\Price\ConfigurableOptionsCompositeFilter">
19+
<arguments>
20+
<argument name="configurableOptionsFilters" xsi:type="array">
21+
<item name="status" xsi:type="object">Magento\ConfigurableProduct\Pricing\Price\ConfigurableOptionsStatusFilter</item>
22+
<item name="stock_status" xsi:type="object">Magento\ConfigurableProduct\Pricing\Price\ConfigurableOptionsStockStatusFilter</item>
23+
</argument>
24+
</arguments>
25+
</type>
1826
</config>

app/code/Magento/ConfigurableProductGraphQl/Model/Options/DataProvider/Variant.php

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,16 +52,15 @@ public function getSalableVariantsByParent(ProductInterface $product): array
5252
$collection
5353
->addAttributeToSelect('*')
5454
->addFilterByRequiredOptions();
55-
$collection->addMediaGalleryData();
56-
$collection->addTierPriceData();
5755

5856
$stockFlag = 'has_stock_status_filter';
5957
if (!$collection->hasFlag($stockFlag)) {
6058
$stockStatusResource = $this->stockStatusFactory->create();
6159
$stockStatusResource->addStockDataToCollection($collection, true);
6260
$collection->setFlag($stockFlag, true);
6361
}
64-
$collection->clear();
62+
$collection->addMediaGalleryData();
63+
$collection->addTierPriceData();
6564

6665
return $collection->getItems() ?? [];
6766
}

0 commit comments

Comments
 (0)