Skip to content

Commit 72aebb7

Browse files
authored
Merge pull request #4185 from magento-engcom/graphql-develop-prs
[Magento Community Engineering] Community Contributions - GraphQL
2 parents 2ec065d + 129641c commit 72aebb7

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+1468
-78
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+
}

app/code/Magento/CatalogGraphQl/etc/graphql/di.xml

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,4 +80,19 @@
8080
</virtualType>
8181
<preference for="Magento\Framework\Search\Adapter\Mysql\Query\Builder\Match"
8282
type="Magento\CatalogGraphQl\Model\Search\Adapter\Mysql\Query\Builder\Match" />
83+
<type name="Magento\StoreGraphQl\Model\Resolver\Store\StoreConfigDataProvider">
84+
<arguments>
85+
<argument name="extendedConfigData" xsi:type="array">
86+
<item name="product_url_suffix" xsi:type="string">catalog/seo/product_url_suffix</item>
87+
<item name="category_url_suffix" xsi:type="string">catalog/seo/category_url_suffix</item>
88+
<item name="title_separator" xsi:type="string">catalog/seo/title_separator</item>
89+
<item name="list_mode" xsi:type="string">catalog/frontend/list_mode</item>
90+
<item name="grid_per_page_values" xsi:type="string">catalog/frontend/grid_per_page_values</item>
91+
<item name="list_per_page_values" xsi:type="string">catalog/frontend/list_per_page_values</item>
92+
<item name="grid_per_page" xsi:type="string">catalog/frontend/grid_per_page</item>
93+
<item name="list_per_page" xsi:type="string">catalog/frontend/list_per_page</item>
94+
<item name="catalog_default_sort_by" xsi:type="string">catalog/frontend/default_sort_by</item>
95+
</argument>
96+
</arguments>
97+
</type>
8398
</config>

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -401,3 +401,15 @@ type SortFields @doc(description: "SortFields contains a default value for sort
401401
default: String @doc(description: "Default value of sort fields")
402402
options: [SortField] @doc(description: "Available sort fields")
403403
}
404+
405+
type StoreConfig @doc(description: "The type contains information about a store config") {
406+
product_url_suffix : String @doc(description: "Product URL Suffix")
407+
category_url_suffix : String @doc(description: "Category URL Suffix")
408+
title_separator : String @doc(description: "Page Title Separator")
409+
list_mode : String @doc(description: "List Mode")
410+
grid_per_page_values : String @doc(description: "Products per Page on Grid Allowed Values")
411+
list_per_page_values : String @doc(description: "Products per Page on List Allowed Values")
412+
grid_per_page : Int @doc(description: "Products per Page on Grid Default Value")
413+
list_per_page : Int @doc(description: "Products per Page on List Default Value")
414+
catalog_default_sort_by : String @doc(description: "Default Sort By")
415+
}
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
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\CheckoutAgreementsGraphQl\Model\Resolver;
9+
10+
use Magento\CheckoutAgreements\Model\AgreementModeOptions;
11+
use Magento\CheckoutAgreements\Model\ResourceModel\Agreement\Collection;
12+
use Magento\Framework\GraphQl\Config\Element\Field;
13+
use Magento\Framework\GraphQl\Query\ResolverInterface;
14+
use Magento\Framework\GraphQl\Schema\Type\ResolveInfo;
15+
use Magento\CheckoutAgreements\Api\Data\AgreementInterface;
16+
use Magento\CheckoutAgreements\Model\ResourceModel\Agreement\CollectionFactory;
17+
use Magento\Framework\App\Config\ScopeConfigInterface;
18+
use Magento\Store\Model\ScopeInterface;
19+
use Magento\Store\Model\StoreManagerInterface;
20+
21+
/**
22+
* Checkout Agreements resolver, used for GraphQL request processing
23+
*/
24+
class CheckoutAgreements implements ResolverInterface
25+
{
26+
/**
27+
* @var CollectionFactory
28+
*/
29+
private $agreementCollectionFactory;
30+
31+
/**
32+
* @var StoreManagerInterface
33+
*/
34+
private $storeManager;
35+
36+
/**
37+
* @var ScopeConfigInterface
38+
*/
39+
private $scopeConfig;
40+
41+
/**
42+
* @param CollectionFactory $agreementCollectionFactory
43+
* @param StoreManagerInterface $storeManager
44+
* @param ScopeConfigInterface $scopeConfig
45+
*/
46+
public function __construct(
47+
CollectionFactory $agreementCollectionFactory,
48+
StoreManagerInterface $storeManager,
49+
ScopeConfigInterface $scopeConfig
50+
) {
51+
$this->agreementCollectionFactory = $agreementCollectionFactory;
52+
$this->storeManager = $storeManager;
53+
$this->scopeConfig = $scopeConfig;
54+
}
55+
56+
/**
57+
* @inheritdoc
58+
*/
59+
public function resolve(
60+
Field $field,
61+
$context,
62+
ResolveInfo $info,
63+
array $value = null,
64+
array $args = null
65+
) {
66+
if (!$this->scopeConfig->isSetFlag('checkout/options/enable_agreements', ScopeInterface::SCOPE_STORE)) {
67+
return [];
68+
}
69+
70+
/** @var Collection $agreementsCollection */
71+
$agreementsCollection = $this->agreementCollectionFactory->create();
72+
$agreementsCollection->addStoreFilter($this->storeManager->getStore()->getId());
73+
$agreementsCollection->addFieldToFilter(AgreementInterface::IS_ACTIVE, 1);
74+
75+
$checkoutAgreementData = [];
76+
/** @var AgreementInterface $checkoutAgreement */
77+
foreach ($agreementsCollection->getItems() as $checkoutAgreement) {
78+
$checkoutAgreementData[] = [
79+
AgreementInterface::AGREEMENT_ID => $checkoutAgreement->getAgreementId(),
80+
AgreementInterface::CONTENT => $checkoutAgreement->getContent(),
81+
AgreementInterface::NAME => $checkoutAgreement->getName(),
82+
AgreementInterface::CONTENT_HEIGHT => $checkoutAgreement->getContentHeight(),
83+
AgreementInterface::CHECKBOX_TEXT => $checkoutAgreement->getCheckboxText(),
84+
AgreementInterface::IS_HTML => $checkoutAgreement->getIsHtml(),
85+
AgreementInterface::MODE =>
86+
AgreementModeOptions::MODE_AUTO === (int)$checkoutAgreement->getMode() ? 'AUTO' : 'MANUAL',
87+
];
88+
}
89+
return $checkoutAgreementData;
90+
}
91+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
# CheckoutAgreementsGraphQl
2+
3+
**CheckoutAgreementsGraphQl** provides type information for the GraphQl module
4+
to generate Checkout Agreements fields for Checkout Agreements information endpoints.
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
{
2+
"name": "magento/module-checkout-agreements-graph-ql",
3+
"description": "N/A",
4+
"type": "magento2-module",
5+
"require": {
6+
"php": "~7.1.3||~7.2.0",
7+
"magento/framework": "*",
8+
"magento/module-store": "*",
9+
"magento/module-checkout-agreements": "*"
10+
},
11+
"suggest": {
12+
"magento/module-graph-ql": "*"
13+
},
14+
"license": [
15+
"OSL-3.0",
16+
"AFL-3.0"
17+
],
18+
"autoload": {
19+
"files": [
20+
"registration.php"
21+
],
22+
"psr-4": {
23+
"Magento\\CheckoutAgreementsGraphQl\\": ""
24+
}
25+
}
26+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?xml version="1.0"?>
2+
<!--
3+
/**
4+
* Copyright © Magento, Inc. All rights reserved.
5+
* See COPYING.txt for license details.
6+
*/
7+
-->
8+
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
9+
<module name="Magento_CheckoutAgreementsGraphQl" />
10+
</config>
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# Copyright © Magento, Inc. All rights reserved.
2+
# See COPYING.txt for license details.
3+
4+
type Query {
5+
checkoutAgreements: [CheckoutAgreement] @resolver(class: "Magento\\CheckoutAgreementsGraphQl\\Model\\Resolver\\CheckoutAgreements") @doc(description: "The Checkout Agreements information")
6+
}
7+
8+
type CheckoutAgreement @doc(description: "Defines all Checkout Agreement information") {
9+
agreement_id: Int! @doc(description: "Checkout Agreement identifier")
10+
name: String! @doc(description: "Checkout Agreement name")
11+
content: String! @doc(description: "Checkout Agreement content")
12+
content_height: String @doc(description: "Checkout Agreement content height")
13+
checkbox_text: String! @doc(description: "Checkout Agreement checkbox text")
14+
is_html: Boolean! @doc(description: "Is Checkout Agreement content in HTML format")
15+
mode: CheckoutAgreementMode!
16+
}
17+
18+
enum CheckoutAgreementMode {
19+
AUTO
20+
MANUAL
21+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
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+
use Magento\Framework\Component\ComponentRegistrar;
9+
10+
ComponentRegistrar::register(ComponentRegistrar::MODULE, 'Magento_CheckoutAgreementsGraphQl', __DIR__);

0 commit comments

Comments
 (0)