Skip to content
This repository was archived by the owner on Dec 19, 2019. It is now read-only.

Commit d9e5581

Browse files
committed
#438: Adjust adding configurable products to the shopping cart
1 parent cea3e79 commit d9e5581

File tree

4 files changed

+64
-58
lines changed

4 files changed

+64
-58
lines changed

app/code/Magento/ConfigurableProductGraphQl/Model/Cart/BuyRequest/SuperAttributeDataProvider.php

Lines changed: 47 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,12 @@
77

88
namespace Magento\ConfigurableProductGraphQl\Model\Cart\BuyRequest;
99

10+
use Magento\Framework\Exception\NoSuchEntityException;
11+
use Magento\Framework\GraphQl\Exception\GraphQlNoSuchEntityException;
1012
use Magento\Framework\Stdlib\ArrayManager;
1113
use Magento\QuoteGraphQl\Model\Cart\BuyRequest\BuyRequestDataProviderInterface;
14+
use Magento\Catalog\Api\ProductRepositoryInterface;
15+
use Magento\ConfigurableProductGraphQl\Model\Options\Collection as OptionCollection;
1216

1317
/**
1418
* DataProvider for building super attribute options in buy requests
@@ -21,26 +25,63 @@ class SuperAttributeDataProvider implements BuyRequestDataProviderInterface
2125
private $arrayManager;
2226

2327
/**
28+
* @var ProductRepositoryInterface
29+
*/
30+
private $productRepository;
31+
32+
/**
33+
* @var OptionCollection
34+
*/
35+
private $optionCollection;
36+
37+
/**
38+
* SuperAttributeDataProvider constructor.
2439
* @param ArrayManager $arrayManager
40+
* @param ProductRepositoryInterface $productRepository
41+
* @param OptionCollection $optionCollection
2542
*/
2643
public function __construct(
27-
ArrayManager $arrayManager
28-
) {
44+
ArrayManager $arrayManager,
45+
ProductRepositoryInterface $productRepository,
46+
OptionCollection $optionCollection
47+
)
48+
{
2949
$this->arrayManager = $arrayManager;
50+
$this->productRepository = $productRepository;
51+
$this->optionCollection = $optionCollection;
3052
}
3153

3254
/**
3355
* @inheritdoc
3456
*/
3557
public function execute(array $cartItemData): array
3658
{
37-
$superAttributes = $this->arrayManager->get('configurable_attributes', $cartItemData, []);
59+
$parentSku = $this->arrayManager->get('parent_sku', $cartItemData);
60+
if ($parentSku === null) {
61+
return [];
62+
}
63+
$sku = $this->arrayManager->get('data/sku', $cartItemData);
3864

39-
$superAttributesData = [];
40-
foreach ($superAttributes as $superAttribute) {
41-
$superAttributesData[$superAttribute['id']] = $superAttribute['value'];
65+
try {
66+
$parentProduct = $this->productRepository->get($parentSku);
67+
$product = $this->productRepository->get($sku);
68+
} catch (NoSuchEntityException $e) {
69+
throw new GraphQlNoSuchEntityException(__('Could not find specified product.'));
4270
}
4371

72+
$this->optionCollection->addProductId((int)$parentProduct->getId());
73+
$options = $this->optionCollection->getAttributesByProductId((int)$parentProduct->getId());
74+
75+
$superAttributesData = [];
76+
foreach ($options as $option) {
77+
$code = $option['attribute_code'];
78+
foreach ($option['values'] as $optionValue) {
79+
if ($optionValue['value_index'] === $product->getData($code)) {
80+
$superAttributesData[$option['attribute_id']] = $optionValue['value_index'];
81+
break;
82+
}
83+
}
84+
}
4485
return ['super_attribute' => $superAttributesData];
4586
}
4687
}

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

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -50,16 +50,11 @@ type AddConfigurableProductsToCartOutput {
5050

5151
input ConfigurableProductCartItemInput {
5252
data: CartItemInput!
53-
variant_sku: String @deprecated(reason: "Use CartItemInput.sku instead")
54-
configurable_attributes: [ConfigurableCartItemAttributesInput]!
53+
variant_sku: String @deprecated(reason: "Use CartItemInput.sku instead.")
54+
parent_sku: String! @doc(descriptiom: "Configurable product SKU.")
5555
customizable_options:[CustomizableOptionInput!]
5656
}
5757

58-
input ConfigurableCartItemAttributesInput {
59-
id: Int!
60-
value: Int!
61-
}
62-
6358
type ConfigurableCartItem implements CartItemInterface {
6459
customizable_options: [SelectedCustomizableOption]!
6560
configurable_options: [SelectedConfigurableOption!]! @resolver(class: "Magento\\ConfigurableProductGraphQl\\Model\\Resolver\\ConfigurableCartItemOptions")

app/code/Magento/QuoteGraphQl/Model/Cart/AddSimpleProductToCart.php

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
use Magento\Framework\Exception\NoSuchEntityException;
1212
use Magento\Framework\GraphQl\Exception\GraphQlInputException;
1313
use Magento\Framework\GraphQl\Exception\GraphQlNoSuchEntityException;
14-
use Magento\Framework\Stdlib\ArrayManager;
1514
use Magento\Quote\Model\Quote;
1615
use Magento\QuoteGraphQl\Model\Cart\BuyRequest\BuyRequestBuilder;
1716

@@ -87,7 +86,11 @@ public function execute(Quote $cart, array $cartItemData): void
8786
*/
8887
private function extractSku(array $cartItemData): string
8988
{
90-
if (!isset($cartItemData['data']['sku']) || empty($cartItemData['data']['sku'])) {
89+
// @ToDo Move this outside the simple product
90+
if (!empty($cartItemData['parent_sku'])) {
91+
return (string)$cartItemData['parent_sku'];
92+
}
93+
if (empty($cartItemData['data']['sku'])) {
9194
throw new GraphQlInputException(__('Missed "sku" in cart item data'));
9295
}
9396
return (string)$cartItemData['data']['sku'];

dev/tests/api-functional/testsuite/Magento/GraphQl/ConfigurableProduct/AddConfigurableProductToCartTest.php

Lines changed: 10 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -41,23 +41,23 @@ public function testAddConfigurableProductToCart()
4141

4242
$quantity = 2;
4343
$maskedQuoteId = $this->getMaskedQuoteIdByReservedOrderId->execute('test_order_1');
44-
$sku = $product['sku'];
44+
$parentSku = $product['sku'];
45+
$sku = 'simple_20';
4546
$attributeId = (int) $product['configurable_options'][0]['attribute_id'];
4647
$optionId = $product['configurable_options'][0]['values'][1]['value_index'];
4748

4849
$query = $this->getQuery(
4950
$maskedQuoteId,
51+
$parentSku,
5052
$sku,
51-
$attributeId,
52-
$optionId,
5353
$quantity
5454
);
5555

5656
$response = $this->graphQlMutation($query);
5757

5858
$cartItem = current($response['addConfigurableProductsToCart']['cart']['items']);
5959
self::assertEquals($quantity, $cartItem['quantity']);
60-
self::assertEquals($sku, $cartItem['product']['sku']);
60+
self::assertEquals($parentSku, $cartItem['product']['sku']);
6161
self::assertArrayHasKey('configurable_options', $cartItem);
6262

6363
$option = current($cartItem['configurable_options']);
@@ -67,32 +67,6 @@ public function testAddConfigurableProductToCart()
6767
self::assertArrayHasKey('value_label', $option);
6868
}
6969

70-
/**
71-
* @magentoApiDataFixture Magento/ConfigurableProduct/_files/product_configurable.php
72-
* @magentoApiDataFixture Magento/Checkout/_files/active_quote.php
73-
* @expectedException \Exception
74-
* @expectedExceptionMessage You need to choose options for your item
75-
*/
76-
public function testAddProductWithInvalidOptions()
77-
{
78-
$searchResponse = $this->graphQlQuery($this->getFetchProductQuery('configurable'));
79-
$product = current($searchResponse['products']['items']);
80-
81-
$maskedQuoteId = $this->getMaskedQuoteIdByReservedOrderId->execute('test_order_1');
82-
$sku = $product['sku'];
83-
$attributeId = (int) $product['configurable_options'][0]['attribute_id'];
84-
85-
$query = $this->getQuery(
86-
$maskedQuoteId,
87-
$sku,
88-
$attributeId,
89-
9999,
90-
1
91-
);
92-
93-
$this->graphQlMutation($query);
94-
}
95-
9670
/**
9771
* @magentoApiDataFixture Magento/ConfigurableProduct/_files/product_configurable_sku.php
9872
* @magentoApiDataFixture Magento/Checkout/_files/active_quote.php
@@ -105,15 +79,13 @@ public function testAddProductIfQuantityIsNotAvailable()
10579
$product = current($searchResponse['products']['items']);
10680

10781
$maskedQuoteId = $this->getMaskedQuoteIdByReservedOrderId->execute('test_order_1');
108-
$sku = $product['sku'];
109-
$attributeId = (int) $product['configurable_options'][0]['attribute_id'];
110-
$optionId = $product['configurable_options'][0]['values'][1]['value_index'];
82+
$parentSku = $product['sku'];
83+
$sku = 'simple_20';
11184

11285
$query = $this->getQuery(
11386
$maskedQuoteId,
87+
$parentSku,
11488
$sku,
115-
$attributeId,
116-
$optionId,
11789
2000
11890
);
11991

@@ -122,25 +94,20 @@ public function testAddProductIfQuantityIsNotAvailable()
12294

12395
/**
12496
* @param string $maskedQuoteId
97+
* @param string $parentSku
12598
* @param string $sku
126-
* @param int $optionId
127-
* @param int $value
12899
* @param int $quantity
129100
* @return string
130101
*/
131-
private function getQuery(string $maskedQuoteId, string $sku, int $optionId, int $value, int $quantity): string
102+
private function getQuery(string $maskedQuoteId, string $parentSku, string $sku, int $quantity): string
132103
{
133104
return <<<QUERY
134105
mutation {
135106
addConfigurableProductsToCart(
136107
input:{
137108
cart_id:"{$maskedQuoteId}"
138109
cart_items:{
139-
configurable_attributes:[{
140-
id:{$optionId}
141-
value:{$value}
142-
}
143-
]
110+
parent_sku: "{$parentSku}"
144111
data:{
145112
sku:"{$sku}"
146113
quantity:{$quantity}

0 commit comments

Comments
 (0)