Skip to content

Commit 9bff89e

Browse files
author
Valeriy Nayda
committed
Merge remote-tracking branch 'origin/31-cms-page-graphql-support' into GraphQL-165
# Conflicts: # composer.lock
2 parents 5c70bb7 + 2966ac3 commit 9bff89e

File tree

10 files changed

+413
-0
lines changed

10 files changed

+413
-0
lines changed
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
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\CmsGraphQl\Model\Resolver;
9+
10+
use Magento\CmsGraphQl\Model\Resolver\DataProvider\Block as BlockDataProvider;
11+
use Magento\Framework\Exception\NoSuchEntityException;
12+
use Magento\Framework\GraphQl\Config\Element\Field;
13+
use Magento\Framework\GraphQl\Exception\GraphQlInputException;
14+
use Magento\Framework\GraphQl\Exception\GraphQlNoSuchEntityException;
15+
use Magento\Framework\GraphQl\Query\Resolver\Value;
16+
use Magento\Framework\GraphQl\Query\Resolver\ValueFactory;
17+
use Magento\Framework\GraphQl\Query\ResolverInterface;
18+
use Magento\Framework\GraphQl\Schema\Type\ResolveInfo;
19+
20+
/**
21+
* CMS blocks field resolver, used for GraphQL request processing
22+
*/
23+
class Blocks implements ResolverInterface
24+
{
25+
/**
26+
* @var BlockDataProvider
27+
*/
28+
private $blockDataProvider;
29+
30+
/**
31+
* @var ValueFactory
32+
*/
33+
private $valueFactory;
34+
35+
/**
36+
* @param BlockDataProvider $blockDataProvider
37+
* @param ValueFactory $valueFactory
38+
*/
39+
public function __construct(
40+
BlockDataProvider $blockDataProvider,
41+
ValueFactory $valueFactory
42+
) {
43+
$this->blockDataProvider = $blockDataProvider;
44+
$this->valueFactory = $valueFactory;
45+
}
46+
47+
/**
48+
* @inheritdoc
49+
*/
50+
public function resolve(
51+
Field $field,
52+
$context,
53+
ResolveInfo $info,
54+
array $value = null,
55+
array $args = null
56+
) : Value {
57+
58+
$result = function () use ($args) {
59+
$blockIdentifiers = $this->getBlockIdentifiers($args);
60+
$blocksData = $this->getBlocksData($blockIdentifiers);
61+
62+
$resultData = [
63+
'items' => $blocksData,
64+
];
65+
return $resultData;
66+
};
67+
return $this->valueFactory->create($result);
68+
}
69+
70+
/**
71+
* @param array $args
72+
* @return string[]
73+
* @throws GraphQlInputException
74+
*/
75+
private function getBlockIdentifiers(array $args): array
76+
{
77+
if (!isset($args['identifiers']) || !is_array($args['identifiers']) || count($args['identifiers']) === 0) {
78+
throw new GraphQlInputException(__('"identifiers" of CMS blocks should be specified'));
79+
}
80+
81+
return $args['identifiers'];
82+
}
83+
84+
/**
85+
* @param array $blockIdentifiers
86+
* @return array
87+
* @throws GraphQlNoSuchEntityException
88+
*/
89+
private function getBlocksData(array $blockIdentifiers): array
90+
{
91+
$blocksData = [];
92+
try {
93+
foreach ($blockIdentifiers as $blockIdentifier) {
94+
$blocksData[$blockIdentifier] = $this->blockDataProvider->getData($blockIdentifier);
95+
}
96+
} catch (NoSuchEntityException $e) {
97+
throw new GraphQlNoSuchEntityException(__($e->getMessage()), $e);
98+
}
99+
return $blocksData;
100+
}
101+
}
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
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\CmsGraphQl\Model\Resolver\DataProvider;
9+
10+
use Magento\Cms\Api\BlockRepositoryInterface;
11+
use Magento\Cms\Api\Data\BlockInterface;
12+
use Magento\Framework\Exception\NoSuchEntityException;
13+
use Magento\Widget\Model\Template\FilterEmulate;
14+
15+
/**
16+
* Cms block data provider
17+
*/
18+
class Block
19+
{
20+
/**
21+
* @var BlockRepositoryInterface
22+
*/
23+
private $blockRepository;
24+
25+
/**
26+
* @var FilterEmulate
27+
*/
28+
private $widgetFilter;
29+
30+
/**
31+
* @param BlockRepositoryInterface $blockRepository
32+
* @param FilterEmulate $widgetFilter
33+
*/
34+
public function __construct(
35+
BlockRepositoryInterface $blockRepository,
36+
FilterEmulate $widgetFilter
37+
) {
38+
$this->blockRepository = $blockRepository;
39+
$this->widgetFilter = $widgetFilter;
40+
}
41+
42+
/**
43+
* @param string $blockIdentifier
44+
* @return array
45+
* @throws NoSuchEntityException
46+
*/
47+
public function getData(string $blockIdentifier): array
48+
{
49+
$block = $this->blockRepository->getById($blockIdentifier);
50+
51+
if (false === $block->isActive()) {
52+
throw new NoSuchEntityException();
53+
}
54+
55+
$renderedContent = $this->widgetFilter->filter($block->getContent());
56+
57+
$blockData = [
58+
BlockInterface::IDENTIFIER => $block->getIdentifier(),
59+
BlockInterface::TITLE => $block->getTitle(),
60+
BlockInterface::CONTENT => $renderedContent,
61+
];
62+
return $blockData;
63+
}
64+
}
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
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\CmsGraphQl\Model\Resolver\DataProvider;
9+
10+
use Magento\Cms\Api\Data\PageInterface;
11+
use Magento\Cms\Api\PageRepositoryInterface;
12+
use Magento\Framework\Exception\NoSuchEntityException;
13+
use Magento\Widget\Model\Template\FilterEmulate;
14+
15+
/**
16+
* Cms page data provider
17+
*/
18+
class Page
19+
{
20+
/**
21+
* @var FilterEmulate
22+
*/
23+
private $widgetFilter;
24+
25+
/**
26+
* @var PageRepositoryInterface
27+
*/
28+
private $pageRepository;
29+
30+
/**
31+
* @param PageRepositoryInterface $pageRepository
32+
* @param FilterEmulate $widgetFilter
33+
*/
34+
public function __construct(
35+
PageRepositoryInterface $pageRepository,
36+
FilterEmulate $widgetFilter
37+
) {
38+
$this->pageRepository = $pageRepository;
39+
$this->widgetFilter = $widgetFilter;
40+
}
41+
42+
/**
43+
* @param int $pageId
44+
* @return array
45+
* @throws NoSuchEntityException
46+
*/
47+
public function getData(int $pageId): array
48+
{
49+
$page = $this->pageRepository->getById($pageId);
50+
51+
if (false === $page->isActive()) {
52+
throw new NoSuchEntityException();
53+
}
54+
55+
$renderedContent = $this->widgetFilter->filter($page->getContent());
56+
57+
$pageData = [
58+
'url_key' => $page->getIdentifier(),
59+
PageInterface::TITLE => $page->getTitle(),
60+
PageInterface::CONTENT => $renderedContent,
61+
PageInterface::CONTENT_HEADING => $page->getContentHeading(),
62+
PageInterface::PAGE_LAYOUT => $page->getPageLayout(),
63+
PageInterface::META_TITLE => $page->getMetaTitle(),
64+
PageInterface::META_DESCRIPTION => $page->getMetaDescription(),
65+
PageInterface::META_KEYWORDS => $page->getMetaKeywords(),
66+
];
67+
return $pageData;
68+
}
69+
}
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
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\CmsGraphQl\Model\Resolver;
9+
10+
use Magento\CmsGraphQl\Model\Resolver\DataProvider\Page as PageDataProvider;
11+
use Magento\Framework\Exception\NoSuchEntityException;
12+
use Magento\Framework\GraphQl\Config\Element\Field;
13+
use Magento\Framework\GraphQl\Exception\GraphQlInputException;
14+
use Magento\Framework\GraphQl\Exception\GraphQlNoSuchEntityException;
15+
use Magento\Framework\GraphQl\Query\Resolver\Value;
16+
use Magento\Framework\GraphQl\Query\Resolver\ValueFactory;
17+
use Magento\Framework\GraphQl\Query\ResolverInterface;
18+
use Magento\Framework\GraphQl\Schema\Type\ResolveInfo;
19+
20+
/**
21+
* CMS page field resolver, used for GraphQL request processing
22+
*/
23+
class Page implements ResolverInterface
24+
{
25+
/**
26+
* @var PageDataProvider
27+
*/
28+
private $pageDataProvider;
29+
30+
/**
31+
* @var ValueFactory
32+
*/
33+
private $valueFactory;
34+
35+
/**
36+
* @param PageDataProvider $pageDataProvider
37+
* @param ValueFactory $valueFactory
38+
*/
39+
public function __construct(
40+
PageDataProvider $pageDataProvider,
41+
ValueFactory $valueFactory
42+
) {
43+
$this->pageDataProvider = $pageDataProvider;
44+
$this->valueFactory = $valueFactory;
45+
}
46+
47+
/**
48+
* @inheritdoc
49+
*/
50+
public function resolve(
51+
Field $field,
52+
$context,
53+
ResolveInfo $info,
54+
array $value = null,
55+
array $args = null
56+
) : Value {
57+
58+
$result = function () use ($args) {
59+
$pageId = $this->getPageId($args);
60+
$pageData = $this->getPageData($pageId);
61+
62+
return $pageData;
63+
};
64+
return $this->valueFactory->create($result);
65+
}
66+
67+
/**
68+
* @param array $args
69+
* @return int
70+
* @throws GraphQlInputException
71+
*/
72+
private function getPageId(array $args): int
73+
{
74+
if (!isset($args['id'])) {
75+
throw new GraphQlInputException(__('"Page id should be specified'));
76+
}
77+
78+
return (int)$args['id'];
79+
}
80+
81+
/**
82+
* @param int $pageId
83+
* @return array
84+
* @throws GraphQlNoSuchEntityException
85+
*/
86+
private function getPageData(int $pageId): array
87+
{
88+
try {
89+
$pageData = $this->pageDataProvider->getData($pageId);
90+
} catch (NoSuchEntityException $e) {
91+
throw new GraphQlNoSuchEntityException(__($e->getMessage()), $e);
92+
}
93+
return $pageData;
94+
}
95+
}

app/code/Magento/CmsGraphQl/README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
# CmsGraphQl
2+
3+
**CmsGraphQl** provides type information for the GraphQl module
4+
to generate CMS fields for cms information endpoints.
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
{
2+
"name": "magento/module-cms-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-cms": "*",
9+
"magento/module-widget": "*"
10+
},
11+
"license": [
12+
"OSL-3.0",
13+
"AFL-3.0"
14+
],
15+
"autoload": {
16+
"files": [
17+
"registration.php"
18+
],
19+
"psr-4": {
20+
"Magento\\CmsGraphQl\\": ""
21+
}
22+
}
23+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
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_CmsGraphQl">
10+
<sequence>
11+
<module name="Magento_GraphQl"/>
12+
</sequence>
13+
</module>
14+
</config>

0 commit comments

Comments
 (0)