Skip to content

Commit 55f90b4

Browse files
committed
#31332:Schema changes implementation for configurable options selection - added test coverage
1 parent 42d5ef9 commit 55f90b4

File tree

8 files changed

+387
-477
lines changed

8 files changed

+387
-477
lines changed

app/code/Magento/CatalogGraphQl/Model/Resolver/Products/DataProvider/ProductSearch.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ public function getList(
114114
try {
115115
$collection->addMediaGalleryData();
116116
} catch (LocalizedException $e) {
117-
throw new GraphQlNoSuchEntityException(__('Cannot load media galery'));
117+
throw new GraphQlNoSuchEntityException(__('Cannot load media gallery'));
118118
}
119119

120120
$collection->load();

app/code/Magento/ConfigurableProductGraphQl/Model/Formatter/Option.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,14 +42,15 @@ public function __construct(
4242
* Format configurable product options according to the GraphQL schema
4343
*
4444
* @param Attribute $attribute
45+
* @param array $optionIds
4546
* @return array|null
4647
*/
47-
public function format(Attribute $attribute): ?array
48+
public function format(Attribute $attribute, array $optionIds): ?array
4849
{
4950
$optionValues = [];
5051

5152
foreach ($attribute->getOptions() as $option) {
52-
$optionValues[] = $this->valueFormatter->format($option, $attribute);
53+
$optionValues[] = $this->valueFormatter->format($option, $attribute, $optionIds);
5354
}
5455

5556
return [

app/code/Magento/ConfigurableProductGraphQl/Model/Formatter/OptionValue.php

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

99
namespace Magento\ConfigurableProductGraphQl\Model\Formatter;
1010

11+
use Magento\CatalogInventory\Model\StockRegistry;
1112
use Magento\ConfigurableProduct\Model\Product\Type\Configurable\Attribute;
1213
use Magento\ConfigurableProductGraphQl\Model\Options\SelectionUidFormatter;
1314
use Magento\SwatchesGraphQl\Model\Resolver\Product\Options\DataProvider\SwatchDataProvider;
@@ -27,26 +28,35 @@ class OptionValue
2728
*/
2829
private $swatchDataProvider;
2930

31+
/**
32+
* @var StockRegistry
33+
*/
34+
private $stockRegistry;
35+
3036
/**
3137
* @param SelectionUidFormatter $selectionUidFormatter
3238
* @param SwatchDataProvider $swatchDataProvider
39+
* @param StockRegistry $stockRegistry
3340
*/
3441
public function __construct(
3542
SelectionUidFormatter $selectionUidFormatter,
36-
SwatchDataProvider $swatchDataProvider
43+
SwatchDataProvider $swatchDataProvider,
44+
StockRegistry $stockRegistry
3745
) {
3846
$this->selectionUidFormatter = $selectionUidFormatter;
3947
$this->swatchDataProvider = $swatchDataProvider;
48+
$this->stockRegistry = $stockRegistry;
4049
}
4150

4251
/**
4352
* Format configurable product option values according to the GraphQL schema
4453
*
4554
* @param array $optionValue
4655
* @param Attribute $attribute
56+
* @param array $optionIds
4757
* @return array
4858
*/
49-
public function format(array $optionValue, Attribute $attribute): array
59+
public function format(array $optionValue, Attribute $attribute, array $optionIds): array
5060
{
5161
$valueIndex = (int)$optionValue['value_index'];
5262
$attributeId = (int)$attribute->getAttributeId();
@@ -56,10 +66,27 @@ public function format(array $optionValue, Attribute $attribute): array
5666
$attributeId,
5767
$valueIndex
5868
),
59-
'is_available' => true,
60-
'is_default' => (bool)$attribute->getIsUseDefault(),
69+
'is_available' => $this->getIsAvailable($optionIds[$valueIndex] ?? []),
70+
'is_use_default' => (bool)$attribute->getIsUseDefault(),
6171
'label' => $optionValue['label'],
6272
'swatch' => $this->swatchDataProvider->getData($optionValue['value_index'])
6373
];
6474
}
75+
76+
/**
77+
* Get is variants available
78+
*
79+
* @param array $variantIds
80+
* @return bool
81+
*/
82+
private function getIsAvailable(array $variantIds): bool
83+
{
84+
foreach ($variantIds as $variantId) {
85+
if ($this->stockRegistry->getProductStockStatus($variantId)) {
86+
return true;
87+
}
88+
}
89+
90+
return false;
91+
}
6592
}

app/code/Magento/ConfigurableProductGraphQl/Model/Options/Metadata.php

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,6 @@
1212
use Magento\ConfigurableProduct\Helper\Data;
1313
use Magento\ConfigurableProduct\Model\Product\Type\Configurable\Attribute;
1414
use Magento\ConfigurableProductGraphQl\Model\Formatter\Option;
15-
use Magento\ConfigurableProductGraphQl\Model\Options\DataProvider\Variant;
16-
use Magento\ConfigurableProductGraphQl\Model\Formatter\Variant as VariantFormatter;
1715

1816
/**
1917
* Retrieve metadata for configurable option selection.
@@ -37,7 +35,6 @@ class Metadata
3735
public function __construct(
3836
Data $configurableProductHelper,
3937
Option $configurableOptionsFormatter
40-
4138
) {
4239
$this->configurableProductHelper = $configurableProductHelper;
4340
$this->configurableOptionsFormatter = $configurableOptionsFormatter;
@@ -54,19 +51,20 @@ public function __construct(
5451
public function getAvailableSelections(ProductInterface $product, array $options, array $selectedOptions): array
5552
{
5653
$attributes = $this->getAttributes($product);
57-
5854
$availableSelections = [];
5955

6056
foreach ($options as $attributeId => $option) {
6157
if ($attributeId === 'index' || isset($selectedOptions[$attributeId])) {
6258
continue;
6359
}
6460

65-
$availableSelections[] = $this->configurableOptionsFormatter->format($attributes[$attributeId]);
61+
$availableSelections[] = $this->configurableOptionsFormatter->format(
62+
$attributes[$attributeId],
63+
$options[$attributeId] ?? []
64+
);
6665
}
6766

6867
return $availableSelections;
69-
7068
}
7169

7270
/**

app/code/Magento/ConfigurableProductGraphQl/Model/Resolver/OptionsSelectionMetadata.php

Lines changed: 0 additions & 49 deletions
This file was deleted.

app/code/Magento/ConfigurableProductGraphQl/etc/schema.graphqls

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -102,11 +102,6 @@ type ConfigurableWishlistItem implements WishlistItemInterface @doc(description:
102102
configurable_options: [SelectedConfigurableOption!] @resolver(class: "\\Magento\\ConfigurableProductGraphQl\\Model\\Wishlist\\ConfigurableOptions") @doc (description: "An array of selected configurable options")
103103
}
104104

105-
type ConfigurableOptionAvailableForSelection @doc(description: "Configurable option available for further selection based on current selection.") {
106-
option_value_uids: [ID!]! @doc(description: "Configurable option values available for further selection.")
107-
attribute_code: String! @doc(description: "Attribute code that uniquely identifies configurable option.")
108-
}
109-
110105
type StoreConfig @doc(description: "The type contains information about a store config") {
111106
configurable_thumbnail_source : String @doc(description: "The configuration setting determines which thumbnail should be used in the cart for configurable products.")
112107
}

0 commit comments

Comments
 (0)