Skip to content

Commit 319ed53

Browse files
committed
Merge remote-tracking branch 'origin/ENGCOM-5091-magento-graphql-ce-371' into graphql-develop-prs
# Conflicts: # composer.lock
2 parents 2aeb977 + 44529af commit 319ed53

File tree

13 files changed

+550
-39
lines changed

13 files changed

+550
-39
lines changed

app/code/Magento/CatalogGraphQl/Model/Resolver/Product.php

Lines changed: 8 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,13 @@
77

88
namespace Magento\CatalogGraphQl\Model\Resolver;
99

10-
use Magento\Framework\GraphQl\Schema\Type\ResolveInfo;
10+
use Magento\CatalogGraphQl\Model\Resolver\Product\ProductFieldsSelector;
1111
use Magento\CatalogGraphQl\Model\Resolver\Products\DataProvider\Deferred\Product as ProductDataProvider;
1212
use Magento\Framework\GraphQl\Config\Element\Field;
1313
use Magento\Framework\GraphQl\Exception\GraphQlInputException;
14-
use Magento\Framework\GraphQl\Query\FieldTranslator;
15-
use Magento\Framework\GraphQl\Query\Resolver\Value;
1614
use Magento\Framework\GraphQl\Query\Resolver\ValueFactory;
1715
use Magento\Framework\GraphQl\Query\ResolverInterface;
16+
use Magento\Framework\GraphQl\Schema\Type\ResolveInfo;
1817

1918
/**
2019
* @inheritdoc
@@ -32,23 +31,23 @@ class Product implements ResolverInterface
3231
private $valueFactory;
3332

3433
/**
35-
* @var FieldTranslator
34+
* @var ProductFieldsSelector
3635
*/
37-
private $fieldTranslator;
36+
private $productFieldsSelector;
3837

3938
/**
4039
* @param ProductDataProvider $productDataProvider
4140
* @param ValueFactory $valueFactory
42-
* @param FieldTranslator $fieldTranslator
41+
* @param ProductFieldsSelector $productFieldsSelector
4342
*/
4443
public function __construct(
4544
ProductDataProvider $productDataProvider,
4645
ValueFactory $valueFactory,
47-
FieldTranslator $fieldTranslator
46+
ProductFieldsSelector $productFieldsSelector
4847
) {
4948
$this->productDataProvider = $productDataProvider;
5049
$this->valueFactory = $valueFactory;
51-
$this->fieldTranslator = $fieldTranslator;
50+
$this->productFieldsSelector = $productFieldsSelector;
5251
}
5352

5453
/**
@@ -60,7 +59,7 @@ public function resolve(Field $field, $context, ResolveInfo $info, array $value
6059
throw new GraphQlInputException(__('No child sku found for product link.'));
6160
}
6261
$this->productDataProvider->addProductSku($value['sku']);
63-
$fields = $this->getProductFields($info);
62+
$fields = $this->productFieldsSelector->getProductFieldsFromInfo($info);
6463
$this->productDataProvider->addEavAttributes($fields);
6564

6665
$result = function () use ($value) {
@@ -86,34 +85,4 @@ public function resolve(Field $field, $context, ResolveInfo $info, array $value
8685

8786
return $this->valueFactory->create($result);
8887
}
89-
90-
/**
91-
* Return field names for all requested product fields.
92-
*
93-
* @param ResolveInfo $info
94-
* @return string[]
95-
*/
96-
private function getProductFields(ResolveInfo $info) : array
97-
{
98-
$fieldNames = [];
99-
foreach ($info->fieldNodes as $node) {
100-
if ($node->name->value !== 'product') {
101-
continue;
102-
}
103-
foreach ($node->selectionSet->selections as $selectionNode) {
104-
if ($selectionNode->kind === 'InlineFragment') {
105-
foreach ($selectionNode->selectionSet->selections as $inlineSelection) {
106-
if ($inlineSelection->kind === 'InlineFragment') {
107-
continue;
108-
}
109-
$fieldNames[] = $this->fieldTranslator->translate($inlineSelection->name->value);
110-
}
111-
continue;
112-
}
113-
$fieldNames[] = $this->fieldTranslator->translate($selectionNode->name->value);
114-
}
115-
}
116-
117-
return $fieldNames;
118-
}
11988
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
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\CatalogGraphQl\Model\Resolver\Product;
9+
10+
use Magento\Framework\GraphQl\Query\FieldTranslator;
11+
use Magento\Framework\GraphQl\Schema\Type\ResolveInfo;
12+
13+
/**
14+
* Select Product Fields From Resolve Info
15+
*/
16+
class ProductFieldsSelector
17+
{
18+
/**
19+
* @var FieldTranslator
20+
*/
21+
private $fieldTranslator;
22+
23+
/**
24+
* @param FieldTranslator $fieldTranslator
25+
*/
26+
public function __construct(FieldTranslator $fieldTranslator)
27+
{
28+
$this->fieldTranslator = $fieldTranslator;
29+
}
30+
31+
/**
32+
* Return field names for all requested product fields.
33+
*
34+
* @param ResolveInfo $info
35+
* @param string $productNodeName
36+
* @return string[]
37+
*/
38+
public function getProductFieldsFromInfo(ResolveInfo $info, string $productNodeName = 'product') : array
39+
{
40+
$fieldNames = [];
41+
foreach ($info->fieldNodes as $node) {
42+
if ($node->name->value !== $productNodeName) {
43+
continue;
44+
}
45+
foreach ($node->selectionSet->selections as $selectionNode) {
46+
if ($selectionNode->kind === 'InlineFragment') {
47+
foreach ($selectionNode->selectionSet->selections as $inlineSelection) {
48+
if ($inlineSelection->kind === 'InlineFragment') {
49+
continue;
50+
}
51+
$fieldNames[] = $this->fieldTranslator->translate($inlineSelection->name->value);
52+
}
53+
continue;
54+
}
55+
$fieldNames[] = $this->fieldTranslator->translate($selectionNode->name->value);
56+
}
57+
}
58+
59+
return $fieldNames;
60+
}
61+
}
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
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\RelatedProductGraphQl\Model\DataProvider;
9+
10+
use Magento\Catalog\Model\Product;
11+
use Magento\Catalog\Model\Product\Link;
12+
use Magento\Catalog\Model\Product\LinkFactory;
13+
14+
/**
15+
* Related Products Data Provider
16+
*/
17+
class RelatedProductDataProvider
18+
{
19+
/**
20+
* @var LinkFactory
21+
*/
22+
private $linkFactory;
23+
24+
/**
25+
* @param LinkFactory $linkFactory
26+
*/
27+
public function __construct(
28+
LinkFactory $linkFactory
29+
) {
30+
$this->linkFactory = $linkFactory;
31+
}
32+
33+
/**
34+
* Related Products Data
35+
*
36+
* @param Product $product
37+
* @param array $fields
38+
* @param int $linkType
39+
* @return array
40+
*/
41+
public function getData(Product $product, array $fields, int $linkType): array
42+
{
43+
$relatedProducts = $this->getRelatedProducts($product, $fields, $linkType);
44+
45+
$productsData = [];
46+
foreach ($relatedProducts as $relatedProduct) {
47+
$productData = $relatedProduct->getData();
48+
$productData['model'] = $relatedProduct;
49+
$productsData[] = $productData;
50+
}
51+
return $productsData;
52+
}
53+
54+
/**
55+
* Get Related Products
56+
*
57+
* @param Product $product
58+
* @param array $fields
59+
* @param int $linkType
60+
* @return Product[]
61+
*/
62+
private function getRelatedProducts(Product $product, array $fields, int $linkType): array
63+
{
64+
/** @var Link $link */
65+
$link = $this->linkFactory->create([ 'data' => [
66+
'link_type_id' => $linkType,
67+
]]);
68+
69+
$collection = $link->getProductCollection();
70+
$collection->setIsStrongMode();
71+
foreach ($fields as $field) {
72+
$collection->addAttributeToSelect($field);
73+
}
74+
$collection->setProduct($product);
75+
76+
return $collection->getItems();
77+
}
78+
}
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
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\RelatedProductGraphQl\Model\Resolver;
9+
10+
use Magento\Catalog\Model\Product\Link;
11+
use Magento\CatalogGraphQl\Model\Resolver\Product\ProductFieldsSelector;
12+
use Magento\Framework\Exception\LocalizedException;
13+
use Magento\RelatedProductGraphQl\Model\DataProvider\RelatedProductDataProvider;
14+
use Magento\Framework\GraphQl\Config\Element\Field;
15+
use Magento\Framework\GraphQl\Query\ResolverInterface;
16+
use Magento\Framework\GraphQl\Schema\Type\ResolveInfo;
17+
18+
/**
19+
* CrossSell Products Resolver
20+
*/
21+
class CrossSellProducts implements ResolverInterface
22+
{
23+
/**
24+
* @var ProductFieldsSelector
25+
*/
26+
private $productFieldsSelector;
27+
28+
/**
29+
* @var RelatedProductDataProvider
30+
*/
31+
private $relatedProductDataProvider;
32+
33+
/**
34+
* @param ProductFieldsSelector $productFieldsSelector
35+
* @param RelatedProductDataProvider $relatedProductDataProvider
36+
*/
37+
public function __construct(
38+
ProductFieldsSelector $productFieldsSelector,
39+
RelatedProductDataProvider $relatedProductDataProvider
40+
) {
41+
$this->productFieldsSelector = $productFieldsSelector;
42+
$this->relatedProductDataProvider = $relatedProductDataProvider;
43+
}
44+
45+
/**
46+
* @inheritdoc
47+
*/
48+
public function resolve(Field $field, $context, ResolveInfo $info, array $value = null, array $args = null)
49+
{
50+
if (!isset($value['model'])) {
51+
throw new LocalizedException(__('"model" value should be specified'));
52+
}
53+
$product = $value['model'];
54+
$fields = $this->productFieldsSelector->getProductFieldsFromInfo($info, 'crosssell_products');
55+
56+
$data = $this->relatedProductDataProvider->getData($product, $fields, Link::LINK_TYPE_CROSSSELL);
57+
return $data;
58+
}
59+
}
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
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\RelatedProductGraphQl\Model\Resolver;
9+
10+
use Magento\Catalog\Model\Product\Link;
11+
use Magento\CatalogGraphQl\Model\Resolver\Product\ProductFieldsSelector;
12+
use Magento\Framework\Exception\LocalizedException;
13+
use Magento\RelatedProductGraphQl\Model\DataProvider\RelatedProductDataProvider;
14+
use Magento\Framework\GraphQl\Config\Element\Field;
15+
use Magento\Framework\GraphQl\Query\ResolverInterface;
16+
use Magento\Framework\GraphQl\Schema\Type\ResolveInfo;
17+
18+
/**
19+
* Related Products Resolver
20+
*/
21+
class RelatedProducts implements ResolverInterface
22+
{
23+
/**
24+
* @var ProductFieldsSelector
25+
*/
26+
private $productFieldsSelector;
27+
28+
/**
29+
* @var RelatedProductDataProvider
30+
*/
31+
private $relatedProductDataProvider;
32+
33+
/**
34+
* @param ProductFieldsSelector $productFieldsSelector
35+
* @param RelatedProductDataProvider $relatedProductDataProvider
36+
*/
37+
public function __construct(
38+
ProductFieldsSelector $productFieldsSelector,
39+
RelatedProductDataProvider $relatedProductDataProvider
40+
) {
41+
$this->productFieldsSelector = $productFieldsSelector;
42+
$this->relatedProductDataProvider = $relatedProductDataProvider;
43+
}
44+
45+
/**
46+
* @inheritdoc
47+
*/
48+
public function resolve(Field $field, $context, ResolveInfo $info, array $value = null, array $args = null)
49+
{
50+
if (!isset($value['model'])) {
51+
throw new LocalizedException(__('"model" value should be specified'));
52+
}
53+
$product = $value['model'];
54+
$fields = $this->productFieldsSelector->getProductFieldsFromInfo($info, 'related_products');
55+
56+
$data = $this->relatedProductDataProvider->getData($product, $fields, Link::LINK_TYPE_RELATED);
57+
return $data;
58+
}
59+
}

0 commit comments

Comments
 (0)