Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
Product.php
Go to the documentation of this file.
1 <?php
6 declare(strict_types=1);
7 
9 
18 
22 class Product implements ResolverInterface
23 {
27  private $productDataProvider;
28 
32  private $valueFactory;
33 
37  private $fieldTranslator;
38 
44  public function __construct(
45  ProductDataProvider $productDataProvider,
46  ValueFactory $valueFactory,
47  FieldTranslator $fieldTranslator
48  ) {
49  $this->productDataProvider = $productDataProvider;
50  $this->valueFactory = $valueFactory;
51  $this->fieldTranslator = $fieldTranslator;
52  }
53 
57  public function resolve(Field $field, $context, ResolveInfo $info, array $value = null, array $args = null)
58  {
59  if (!isset($value['sku'])) {
60  throw new GraphQlInputException(__('No child sku found for product link.'));
61  }
62  $this->productDataProvider->addProductSku($value['sku']);
63  $fields = $this->getProductFields($info);
64  $this->productDataProvider->addEavAttributes($fields);
65 
66  $result = function () use ($value) {
67  $data = $this->productDataProvider->getProductBySku($value['sku']);
68  if (empty($data)) {
69  return null;
70  }
71  $productModel = $data['model'];
73  $data = $productModel->getData();
74  $data['model'] = $productModel;
75 
76  if (!empty($productModel->getCustomAttributes())) {
77  foreach ($productModel->getCustomAttributes() as $customAttribute) {
78  if (!isset($data[$customAttribute->getAttributeCode()])) {
79  $data[$customAttribute->getAttributeCode()] = $customAttribute->getValue();
80  }
81  }
82  }
83 
84  return array_replace($value, $data);
85  };
86 
87  return $this->valueFactory->create($result);
88  }
89 
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  }
119 }
$fields
Definition: details.phtml:14
__()
Definition: __.php:13
$value
Definition: gender.phtml:16
$productModel
__construct(ProductDataProvider $productDataProvider, ValueFactory $valueFactory, FieldTranslator $fieldTranslator)
Definition: Product.php:44
foreach( $_productCollection as $_product)() ?>" class $info
Definition: listing.phtml:52
resolve(Field $field, $context, ResolveInfo $info, array $value=null, array $args=null)