Skip to content

Commit 07592df

Browse files
committed
PWA-1326: Implement the schema changes for Configurable Options Selection
- combining schema with variant attribute details
1 parent f7903ab commit 07592df

File tree

5 files changed

+113
-19
lines changed

5 files changed

+113
-19
lines changed

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

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,6 @@
1818
use Magento\Framework\Api\Search\SearchResultInterface;
1919
use Magento\Framework\Api\SearchCriteriaInterface;
2020
use Magento\Framework\Api\SearchResultsInterface;
21-
use Magento\Framework\Exception\LocalizedException;
22-
use Magento\Framework\GraphQl\Exception\GraphQlNoSuchEntityException;
2321
use Magento\GraphQl\Model\Query\ContextInterface;
2422

2523
/**
@@ -89,7 +87,6 @@ public function __construct(
8987
* @param array $attributes
9088
* @param ContextInterface|null $context
9189
* @return SearchResultsInterface
92-
* @throws GraphQlNoSuchEntityException
9390
*/
9491
public function getList(
9592
SearchCriteriaInterface $searchCriteria,
@@ -110,13 +107,6 @@ public function getList(
110107
)->apply();
111108

112109
$this->collectionPreProcessor->process($collection, $searchCriteriaForCollection, $attributes, $context);
113-
114-
try {
115-
$collection->addMediaGalleryData();
116-
} catch (LocalizedException $e) {
117-
throw new GraphQlNoSuchEntityException(__('Cannot load media gallery'));
118-
}
119-
120110
$collection->load();
121111
$this->collectionPostProcessor->process($collection, $attributes);
122112

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
7+
declare(strict_types=1);
8+
9+
namespace Magento\ConfigurableProductGraphQl\Model\Options;
10+
11+
use Magento\Catalog\Api\Data\ProductInterface;
12+
use Magento\ConfigurableProduct\Helper\Data;
13+
use Magento\ConfigurableProduct\Model\Product\Type\Configurable\Attribute;
14+
use Magento\ConfigurableProductGraphQl\Model\Formatter\Option;
15+
16+
/**
17+
* Retrieve metadata for configurable option selection.
18+
*/
19+
class Metadata
20+
{
21+
/**
22+
* @var Data
23+
*/
24+
private $configurableProductHelper;
25+
26+
/**
27+
* @var Option
28+
*/
29+
private $configurableOptionsFormatter;
30+
31+
/**
32+
* @param Data $configurableProductHelper
33+
* @param Option $configurableOptionsFormatter
34+
*/
35+
public function __construct(
36+
Data $configurableProductHelper,
37+
Option $configurableOptionsFormatter
38+
) {
39+
$this->configurableProductHelper = $configurableProductHelper;
40+
$this->configurableOptionsFormatter = $configurableOptionsFormatter;
41+
}
42+
43+
/**
44+
* Load available selections from configurable options and variant.
45+
*
46+
* @param ProductInterface $product
47+
* @param array $options
48+
* @param array $selectedOptions
49+
* @return array
50+
*/
51+
public function getAvailableSelections(ProductInterface $product, array $options, array $selectedOptions): array
52+
{
53+
$attributes = $this->getAttributes($product);
54+
$availableSelections = [];
55+
56+
foreach ($options as $attributeId => $option) {
57+
if ($attributeId === 'index' || isset($selectedOptions[$attributeId])) {
58+
continue;
59+
}
60+
61+
$availableSelections[] = $this->configurableOptionsFormatter->format(
62+
$attributes[$attributeId],
63+
$options[$attributeId] ?? []
64+
);
65+
}
66+
67+
return $availableSelections;
68+
}
69+
70+
/**
71+
* Retrieve configurable attributes for the product
72+
*
73+
* @param ProductInterface $product
74+
* @return Attribute[]
75+
*/
76+
private function getAttributes(ProductInterface $product): array
77+
{
78+
$allowedAttributes = $this->configurableProductHelper->getAllowAttributes($product);
79+
$attributes = [];
80+
foreach ($allowedAttributes as $attribute) {
81+
$attributes[$attribute->getAttributeId()] = $attribute;
82+
}
83+
84+
return $attributes;
85+
}
86+
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
/**
1717
* Retrieve metadata for configurable option selection.
1818
*/
19-
class Metadata
19+
class ConfigurableOptionsMetadata
2020
{
2121
/**
2222
* @var Data

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

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
use Magento\ConfigurableProduct\Helper\Data;
1111
use Magento\ConfigurableProductGraphQl\Model\Formatter\Variant as VariantFormatter;
12+
use Magento\ConfigurableProductGraphQl\Model\Options\ConfigurableOptionsMetadata;
1213
use Magento\ConfigurableProductGraphQl\Model\Options\DataProvider\Variant;
1314
use Magento\ConfigurableProductGraphQl\Model\Options\Metadata;
1415
use Magento\ConfigurableProductGraphQl\Model\Options\SelectionUidFormatter;
@@ -27,6 +28,11 @@ class OptionsSelectionMetadata implements ResolverInterface
2728
*/
2829
private $configurableSelectionMetadata;
2930

31+
/**
32+
* @var ConfigurableOptionsMetadata
33+
*/
34+
private $configurableOptionsMetadata;
35+
3036
/**
3137
* @var SelectionUidFormatter
3238
*/
@@ -49,19 +55,22 @@ class OptionsSelectionMetadata implements ResolverInterface
4955

5056
/**
5157
* @param Metadata $configurableSelectionMetadata
58+
* @param ConfigurableOptionsMetadata $configurableOptionsMetadata
5259
* @param SelectionUidFormatter $selectionUidFormatter
5360
* @param Variant $variant
5461
* @param VariantFormatter $variantFormatter
5562
* @param Data $configurableProductHelper
5663
*/
5764
public function __construct(
5865
Metadata $configurableSelectionMetadata,
66+
ConfigurableOptionsMetadata $configurableOptionsMetadata,
5967
SelectionUidFormatter $selectionUidFormatter,
6068
Variant $variant,
6169
VariantFormatter $variantFormatter,
6270
Data $configurableProductHelper
6371
) {
6472
$this->configurableSelectionMetadata = $configurableSelectionMetadata;
73+
$this->configurableOptionsMetadata = $configurableOptionsMetadata;
6574
$this->selectionUidFormatter = $selectionUidFormatter;
6675
$this->variant = $variant;
6776
$this->variantFormatter = $variantFormatter;
@@ -85,14 +94,23 @@ public function resolve(Field $field, $context, ResolveInfo $info, array $value
8594
$variants = $this->variant->getSalableVariantsByParent($product);
8695
$options = $this->configurableProductHelper->getOptions($product, $variants);
8796

97+
$configurableOptions = $this->configurableOptionsMetadata->getAvailableSelections(
98+
$product,
99+
$options,
100+
$selectedOptions
101+
);
102+
103+
$optionsAvailableForSelection = $this->configurableSelectionMetadata->getAvailableSelections(
104+
$product,
105+
$args['configurableOptionValueUids'] ?? []
106+
);
107+
88108
return [
89-
'configurable_options' => $this->configurableSelectionMetadata->getAvailableSelections(
90-
$product,
91-
$options,
92-
$selectedOptions
93-
),
109+
'configurable_options' => $configurableOptions,
94110
'variant' => $this->variantFormatter->format($options, $selectedOptions, $variants),
95-
'model' => $product
111+
'model' => $product,
112+
'options_available_for_selection' => $optionsAvailableForSelection['options_available_for_selection'],
113+
'availableSelectionProducts' => $optionsAvailableForSelection['availableSelectionProducts']
96114
];
97115
}
98116
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,11 @@ class SelectionMediaGallery implements ResolverInterface
2121
*/
2222
public function resolve(Field $field, $context, ResolveInfo $info, array $value = null, array $args = null)
2323
{
24-
if (!isset($value['product']) || !$value['product']) {
24+
if (!isset($value['model']) || !$value['model']) {
2525
return null;
2626
}
2727

28-
$product = $value['product'];
28+
$product = $value['model'];
2929
$availableSelectionProducts = $value['availableSelectionProducts'];
3030
$mediaGalleryEntries = [];
3131
$usedProducts = $product->getTypeInstance()->getUsedProducts($product, null);

0 commit comments

Comments
 (0)