Skip to content

Commit f504d8d

Browse files
ENGCOM-4135: [256] Fixed variant collection #331
- Merge Pull Request magento/graphql-ce#331 from magento/graphql-ce:256_configurable_products_variants_attributes_are_empty - Merged commits: 1. 9bee85b 2. e22d32d 3. 23c9822 4. cda1eff
2 parents 8dfe26a + cda1eff commit f504d8d

File tree

4 files changed

+45
-18
lines changed

4 files changed

+45
-18
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ public function resolve(Field $field, $context, ResolveInfo $info, array $value
8585
return $this->valueFactory->create($result);
8686
}
8787

88-
$this->variantCollection->addParentId((int)$value[$linkField]);
88+
$this->variantCollection->addParentProduct($value['model']);
8989
$fields = $this->getProductFields($info);
9090
$matchedFields = $this->attributeCollection->getRequestAttributes($fields);
9191
$this->variantCollection->addEavAttributes($matchedFields);

app/code/Magento/ConfigurableProductGraphQl/Model/Resolver/Variant/Attributes.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,12 +35,12 @@ public function resolve(
3535
$data = [];
3636
foreach ($value['options'] as $option) {
3737
$code = $option['attribute_code'];
38-
if (!isset($value['product'][$code])) {
38+
if (!isset($value['product']['model'][$code])) {
3939
continue;
4040
}
4141

4242
foreach ($option['values'] as $optionValue) {
43-
if ($optionValue['value_index'] != $value['product'][$code]) {
43+
if ($optionValue['value_index'] != $value['product']['model'][$code]) {
4444
continue;
4545
}
4646
$data[] = [

app/code/Magento/ConfigurableProductGraphQl/Model/Variant/Collection.php

Lines changed: 41 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@
99

1010
use Magento\Catalog\Api\Data\ProductInterface;
1111
use Magento\Catalog\Model\Product;
12-
use Magento\ConfigurableProduct\Model\ResourceModel\Product\Type\Configurable\Product\CollectionFactory;
13-
use Magento\ConfigurableProduct\Model\ResourceModel\Product\Type\Configurable\Product\Collection as ChildCollection;
1412
use Magento\Catalog\Model\ProductFactory;
13+
use Magento\ConfigurableProduct\Model\ResourceModel\Product\Type\Configurable\Product\Collection as ChildCollection;
14+
use Magento\ConfigurableProduct\Model\ResourceModel\Product\Type\Configurable\Product\CollectionFactory;
1515
use Magento\Framework\EntityManager\MetadataPool;
1616
use Magento\Framework\Api\SearchCriteriaBuilder;
1717
use Magento\CatalogGraphQl\Model\Resolver\Products\DataProvider\Product as DataProvider;
@@ -47,9 +47,9 @@ class Collection
4747
private $metadataPool;
4848

4949
/**
50-
* @var int[]
50+
* @var Product[]
5151
*/
52-
private $parentIds = [];
52+
private $parentProducts = [];
5353

5454
/**
5555
* @var array
@@ -83,19 +83,22 @@ public function __construct(
8383
}
8484

8585
/**
86-
* Add parent Id to collection filter
86+
* Add parent to collection filter
8787
*
88-
* @param int $id
88+
* @param Product $product
8989
* @return void
9090
*/
91-
public function addParentId(int $id) : void
91+
public function addParentProduct(Product $product) : void
9292
{
93-
if (!in_array($id, $this->parentIds) && !empty($this->childrenMap)) {
93+
if (isset($this->parentProducts[$product->getId()])) {
94+
return;
95+
}
96+
97+
if (!empty($this->childrenMap)) {
9498
$this->childrenMap = [];
95-
$this->parentIds[] = $id;
96-
} elseif (!in_array($id, $this->parentIds)) {
97-
$this->parentIds[] = $id;
99+
98100
}
101+
$this->parentProducts[$product->getId()] = $product;
99102
}
100103

101104
/**
@@ -130,20 +133,23 @@ public function getChildProductsByParentId(int $id) : array
130133
* Fetch all children products from parent id's.
131134
*
132135
* @return array
136+
* @throws \Exception
133137
*/
134138
private function fetch() : array
135139
{
136-
if (empty($this->parentIds) || !empty($this->childrenMap)) {
140+
if (empty($this->parentProducts) || !empty($this->childrenMap)) {
137141
return $this->childrenMap;
138142
}
139143

140144
$linkField = $this->metadataPool->getMetadata(ProductInterface::class)->getLinkField();
141-
foreach ($this->parentIds as $id) {
145+
foreach ($this->parentProducts as $product) {
146+
$attributeData = $this->getAttributesCodes($product);
142147
/** @var ChildCollection $childCollection */
143148
$childCollection = $this->childCollectionFactory->create();
149+
$childCollection->addAttributeToSelect($attributeData);
150+
144151
/** @var Product $product */
145-
$product = $this->productFactory->create();
146-
$product->setData($linkField, $id);
152+
$product->setData($linkField, $product->getId());
147153
$childCollection->setProductFilter($product);
148154

149155
/** @var Product $childProduct */
@@ -160,4 +166,24 @@ private function fetch() : array
160166

161167
return $this->childrenMap;
162168
}
169+
170+
/**
171+
* Get attributes code
172+
*
173+
* @param \Magento\Catalog\Model\Product $currentProduct
174+
* @return array
175+
*/
176+
private function getAttributesCodes(Product $currentProduct): array
177+
{
178+
$attributeCodes = [];
179+
$allowAttributes = $currentProduct->getTypeInstance()->getConfigurableAttributes($currentProduct);
180+
foreach ($allowAttributes as $attribute) {
181+
$productAttribute = $attribute->getProductAttribute();
182+
if (!\in_array($productAttribute->getAttributeCode(), $attributeCodes)) {
183+
$attributeCodes[] = $productAttribute->getAttributeCode();
184+
}
185+
}
186+
187+
return $attributeCodes;
188+
}
163189
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -407,6 +407,7 @@ private function assertConfigurableVariants($actualResponse)
407407
$variantArray['product']['price']
408408
);
409409
$configurableOptions = $this->getConfigurableOptions();
410+
$this->assertEquals(1, count($variantArray['attributes']));
410411
foreach ($variantArray['attributes'] as $attribute) {
411412
$hasAssertion = false;
412413
foreach ($configurableOptions as $option) {

0 commit comments

Comments
 (0)