From 83dc64e7ad70a8217333821730083444c20de1d1 Mon Sep 17 00:00:00 2001 From: Yaroslav Rogoza Date: Sun, 5 Aug 2018 18:47:31 +0200 Subject: [PATCH 1/6] Render category description directives --- .../Model/Resolver/Categories.php | 1 + .../Category/CategoryHtmlAttribute.php | 73 +++++++++++++++++++ .../Products/DataProvider/CategoryTree.php | 1 + .../CatalogGraphQl/etc/schema.graphqls | 4 +- 4 files changed, 77 insertions(+), 2 deletions(-) create mode 100644 app/code/Magento/CatalogGraphQl/Model/Resolver/Category/CategoryHtmlAttribute.php diff --git a/app/code/Magento/CatalogGraphQl/Model/Resolver/Categories.php b/app/code/Magento/CatalogGraphQl/Model/Resolver/Categories.php index 378e7cb4c367..cd28d32b4f2c 100644 --- a/app/code/Magento/CatalogGraphQl/Model/Resolver/Categories.php +++ b/app/code/Magento/CatalogGraphQl/Model/Resolver/Categories.php @@ -110,6 +110,7 @@ public function resolve(Field $field, $context, ResolveInfo $info, array $value $categories[$item->getId()] = $this->customAttributesFlattener ->flatten($categories[$item->getId()]); $categories[$item->getId()]['product_count'] = $item->getProductCount(); + $categories[$item->getId()]['model'] = $item; } } diff --git a/app/code/Magento/CatalogGraphQl/Model/Resolver/Category/CategoryHtmlAttribute.php b/app/code/Magento/CatalogGraphQl/Model/Resolver/Category/CategoryHtmlAttribute.php new file mode 100644 index 000000000000..17715344fad2 --- /dev/null +++ b/app/code/Magento/CatalogGraphQl/Model/Resolver/Category/CategoryHtmlAttribute.php @@ -0,0 +1,73 @@ +valueFactory = $valueFactory; + $this->outputHelper = $outputHelper; + } + + /** + * {@inheritdoc} + */ + public function resolve( + Field $field, + $context, + ResolveInfo $info, + array $value = null, + array $args = null + ): Value { + if (!isset($value['model'])) { + $result = function () { + return null; + }; + return $this->valueFactory->create($result); + } + + /* @var $category Category */ + $category = $value['model']; + $fieldName = $field->getName(); + $renderedValue = $this->outputHelper->categoryAttribute($category, $category->getData($fieldName), $fieldName); + + $result = function () use ($renderedValue) { + return $renderedValue; + }; + + return $this->valueFactory->create($result); + } +} diff --git a/app/code/Magento/CatalogGraphQl/Model/Resolver/Products/DataProvider/CategoryTree.php b/app/code/Magento/CatalogGraphQl/Model/Resolver/Products/DataProvider/CategoryTree.php index d2fc174fb1ed..13b8bf7523a1 100644 --- a/app/code/Magento/CatalogGraphQl/Model/Resolver/Products/DataProvider/CategoryTree.php +++ b/app/code/Magento/CatalogGraphQl/Model/Resolver/Products/DataProvider/CategoryTree.php @@ -119,6 +119,7 @@ private function processTree(\Iterator $iterator) : array $iterator->next(); $nextCategory = $iterator->current(); $tree[$category->getId()] = $this->hydrator->hydrateCategory($category); + $tree[$category->getId()]['model'] = $category; if ($nextCategory && (int) $nextCategory->getLevel() !== (int) $category->getLevel()) { $tree[$category->getId()]['children'] = $this->processTree($iterator); } diff --git a/app/code/Magento/CatalogGraphQl/etc/schema.graphqls b/app/code/Magento/CatalogGraphQl/etc/schema.graphqls index 9235ec271a3c..a0bada52cf96 100644 --- a/app/code/Magento/CatalogGraphQl/etc/schema.graphqls +++ b/app/code/Magento/CatalogGraphQl/etc/schema.graphqls @@ -364,7 +364,7 @@ interface CustomizableProductInterface @typeResolver(class: "Magento\\CatalogGra interface CategoryInterface @typeResolver(class: "Magento\\CatalogGraphQl\\Model\\CategoryInterfaceTypeResolver") @doc(description: "CategoryInterface contains the full set of attributes that can be returned in a category search") { id: Int @doc(description: "An ID that uniquely identifies the category") - description: String @doc(description: "An optional description of the category") + description: String @doc(description: "An optional description of the category") @resolver(class: "\\Magento\\CatalogGraphQl\\Model\\Resolver\\Category\\CategoryHtmlAttribute") name: String @doc(description: "The display name of the category") path: String @doc(description: "Category Path") path_in_store: String @doc(description: "Category path in store") @@ -548,6 +548,6 @@ type SortField { } type SortFields @doc(description: "SortFields contains a default value for sort fields and all available sort fields") { - default: String @doc(description: "Default value of sort fields") + default: String @doc(description: "Default value of sort fields") options: [SortField] @doc(description: "Available sort fields") } From 665ec85a8aba7cc7916385cafd1520c67d1fb06a Mon Sep 17 00:00:00 2001 From: Yaroslav Rogoza Date: Wed, 8 Aug 2018 16:40:32 +0200 Subject: [PATCH 2/6] Api-functional test added --- .../CategoryWithDescriptionDirectivesTest.php | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 dev/tests/api-functional/testsuite/Magento/GraphQl/Catalog/CategoryWithDescriptionDirectivesTest.php diff --git a/dev/tests/api-functional/testsuite/Magento/GraphQl/Catalog/CategoryWithDescriptionDirectivesTest.php b/dev/tests/api-functional/testsuite/Magento/GraphQl/Catalog/CategoryWithDescriptionDirectivesTest.php new file mode 100644 index 000000000000..48496d4ca9fb --- /dev/null +++ b/dev/tests/api-functional/testsuite/Magento/GraphQl/Catalog/CategoryWithDescriptionDirectivesTest.php @@ -0,0 +1,65 @@ +objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager(); + } + + /** + * @magentoApiDataFixture Magento/Catalog/_files/category.php + */ + public function testHtmlDirectivesRendered() + { + $categoryId = 333; + $mediaFilePath = '/path/to/mediafile'; + /** @var StoreManagerInterface $storeManager */ + $storeManager = ObjectManager::getInstance()->get(StoreManagerInterface::class); + $storeBaseUrl = $storeManager->getStore()->getBaseUrl(); + + /* Remove index.php from base URL */ + $storeBaseUrlParts = explode('/index.php', $storeBaseUrl); + $storeBaseUrl = $storeBaseUrlParts[0]; + + /** @var CategoryRepositoryInterface $categoryRepository */ + $categoryRepository = ObjectManager::getInstance()->get(CategoryRepositoryInterface::class); + /** @var CategoryInterface $category */ + $category = $categoryRepository->get($categoryId); + $category->setDescription('Test: {{media url="' . $mediaFilePath . '"}}'); + $categoryRepository->save($category); + + $query = <<graphQlQuery($query); + + self::assertNotContains('media url', $response['category']['description']); + self::assertContains($storeBaseUrl, $response['category']['description']); + } +} From 101716c2ab584a6cdc923afc903c76b212825bc5 Mon Sep 17 00:00:00 2001 From: Yaroslav Rogoza Date: Wed, 26 Sep 2018 14:46:48 +0200 Subject: [PATCH 3/6] Fixed methods DocBlock comments --- app/code/Magento/CatalogGraphQl/Model/Resolver/Categories.php | 2 +- .../Model/Resolver/Category/CategoryHtmlAttribute.php | 2 +- .../GraphQl/Catalog/CategoryWithDescriptionDirectivesTest.php | 3 +++ 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/app/code/Magento/CatalogGraphQl/Model/Resolver/Categories.php b/app/code/Magento/CatalogGraphQl/Model/Resolver/Categories.php index 4fc3ab470505..e2998438bd74 100644 --- a/app/code/Magento/CatalogGraphQl/Model/Resolver/Categories.php +++ b/app/code/Magento/CatalogGraphQl/Model/Resolver/Categories.php @@ -79,7 +79,7 @@ public function __construct( } /** - * {@inheritdoc} + * @inheritdoc * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ public function resolve(Field $field, $context, ResolveInfo $info, array $value = null, array $args = null) diff --git a/app/code/Magento/CatalogGraphQl/Model/Resolver/Category/CategoryHtmlAttribute.php b/app/code/Magento/CatalogGraphQl/Model/Resolver/Category/CategoryHtmlAttribute.php index 17715344fad2..55c90425c2f5 100644 --- a/app/code/Magento/CatalogGraphQl/Model/Resolver/Category/CategoryHtmlAttribute.php +++ b/app/code/Magento/CatalogGraphQl/Model/Resolver/Category/CategoryHtmlAttribute.php @@ -43,7 +43,7 @@ public function __construct( } /** - * {@inheritdoc} + * @inheritdoc */ public function resolve( Field $field, diff --git a/dev/tests/api-functional/testsuite/Magento/GraphQl/Catalog/CategoryWithDescriptionDirectivesTest.php b/dev/tests/api-functional/testsuite/Magento/GraphQl/Catalog/CategoryWithDescriptionDirectivesTest.php index 48496d4ca9fb..c115f7124c9f 100644 --- a/dev/tests/api-functional/testsuite/Magento/GraphQl/Catalog/CategoryWithDescriptionDirectivesTest.php +++ b/dev/tests/api-functional/testsuite/Magento/GraphQl/Catalog/CategoryWithDescriptionDirectivesTest.php @@ -23,6 +23,9 @@ class CategoryWithDescriptionDirectivesTest extends GraphQlAbstract */ private $objectManager; + /** + * @inheritdoc + */ protected function setUp() { $this->objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager(); From accac0b81338f166d86c0cf2ca07ee9e27e60c37 Mon Sep 17 00:00:00 2001 From: Yaroslav Rogoza Date: Thu, 27 Sep 2018 11:21:43 +0200 Subject: [PATCH 4/6] Added methods descriptions to CategoryTree --- .../Model/Resolver/Products/DataProvider/CategoryTree.php | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/app/code/Magento/CatalogGraphQl/Model/Resolver/Products/DataProvider/CategoryTree.php b/app/code/Magento/CatalogGraphQl/Model/Resolver/Products/DataProvider/CategoryTree.php index ab39e33bddb9..e532a30c9877 100644 --- a/app/code/Magento/CatalogGraphQl/Model/Resolver/Products/DataProvider/CategoryTree.php +++ b/app/code/Magento/CatalogGraphQl/Model/Resolver/Products/DataProvider/CategoryTree.php @@ -83,9 +83,12 @@ public function __construct( } /** + * Returns categories tree starting from parent $rootCategoryId + * * @param ResolveInfo $resolveInfo * @param int $rootCategoryId * @return array + * @throws \Exception */ public function getTree(ResolveInfo $resolveInfo, int $rootCategoryId) : array { @@ -107,6 +110,8 @@ public function getTree(ResolveInfo $resolveInfo, int $rootCategoryId) : array } /** + * Iterates through category tree + * * @param \Iterator $iterator * @return array */ @@ -129,6 +134,8 @@ private function processTree(\Iterator $iterator) : array } /** + * Joins EAV attributes recursively + * * @param Collection $collection * @param FieldNode $fieldNode * @return void From 8e9b1eb911753eb8a3fe23adc07cab5578e2b0fb Mon Sep 17 00:00:00 2001 From: Yaroslav Rogoza Date: Fri, 28 Sep 2018 13:34:58 +0200 Subject: [PATCH 5/6] Reducing the number of dependencies --- .../Model/Resolver/Products/DataProvider/CategoryTree.php | 1 - 1 file changed, 1 deletion(-) diff --git a/app/code/Magento/CatalogGraphQl/Model/Resolver/Products/DataProvider/CategoryTree.php b/app/code/Magento/CatalogGraphQl/Model/Resolver/Products/DataProvider/CategoryTree.php index e532a30c9877..07d8996838e9 100644 --- a/app/code/Magento/CatalogGraphQl/Model/Resolver/Products/DataProvider/CategoryTree.php +++ b/app/code/Magento/CatalogGraphQl/Model/Resolver/Products/DataProvider/CategoryTree.php @@ -88,7 +88,6 @@ public function __construct( * @param ResolveInfo $resolveInfo * @param int $rootCategoryId * @return array - * @throws \Exception */ public function getTree(ResolveInfo $resolveInfo, int $rootCategoryId) : array { From cb7a755d8851e15c5cfbbefd4950c668b1ea3e4e Mon Sep 17 00:00:00 2001 From: Valeriy Nayda Date: Mon, 1 Oct 2018 13:11:01 +0300 Subject: [PATCH 6/6] GraphQL-135: GraphQL API returns rendered content for category --- .../Category/CategoryHtmlAttribute.php | 24 ++++--------------- .../Model/Resolver/Product/Image.php | 3 ++- 2 files changed, 6 insertions(+), 21 deletions(-) diff --git a/app/code/Magento/CatalogGraphQl/Model/Resolver/Category/CategoryHtmlAttribute.php b/app/code/Magento/CatalogGraphQl/Model/Resolver/Category/CategoryHtmlAttribute.php index 55c90425c2f5..7ccb46c3a293 100644 --- a/app/code/Magento/CatalogGraphQl/Model/Resolver/Category/CategoryHtmlAttribute.php +++ b/app/code/Magento/CatalogGraphQl/Model/Resolver/Category/CategoryHtmlAttribute.php @@ -8,9 +8,8 @@ namespace Magento\CatalogGraphQl\Model\Resolver\Category; use Magento\Catalog\Model\Category; +use Magento\Framework\Exception\LocalizedException; use Magento\Framework\GraphQl\Config\Element\Field; -use Magento\Framework\GraphQl\Query\Resolver\Value; -use Magento\Framework\GraphQl\Query\Resolver\ValueFactory; use Magento\Framework\GraphQl\Query\ResolverInterface; use Magento\Framework\GraphQl\Schema\Type\ResolveInfo; use Magento\Catalog\Helper\Output as OutputHelper; @@ -20,25 +19,17 @@ */ class CategoryHtmlAttribute implements ResolverInterface { - /** - * @var ValueFactory - */ - private $valueFactory; - /** * @var OutputHelper */ private $outputHelper; /** - * @param ValueFactory $valueFactory * @param OutputHelper $outputHelper */ public function __construct( - ValueFactory $valueFactory, OutputHelper $outputHelper ) { - $this->valueFactory = $valueFactory; $this->outputHelper = $outputHelper; } @@ -51,12 +42,9 @@ public function resolve( ResolveInfo $info, array $value = null, array $args = null - ): Value { + ) { if (!isset($value['model'])) { - $result = function () { - return null; - }; - return $this->valueFactory->create($result); + throw new LocalizedException(__('"model" value should be specified')); } /* @var $category Category */ @@ -64,10 +52,6 @@ public function resolve( $fieldName = $field->getName(); $renderedValue = $this->outputHelper->categoryAttribute($category, $category->getData($fieldName), $fieldName); - $result = function () use ($renderedValue) { - return $renderedValue; - }; - - return $this->valueFactory->create($result); + return $renderedValue; } } diff --git a/app/code/Magento/CatalogGraphQl/Model/Resolver/Product/Image.php b/app/code/Magento/CatalogGraphQl/Model/Resolver/Product/Image.php index 49617c442eeb..6830aecb78f1 100644 --- a/app/code/Magento/CatalogGraphQl/Model/Resolver/Product/Image.php +++ b/app/code/Magento/CatalogGraphQl/Model/Resolver/Product/Image.php @@ -9,6 +9,7 @@ use Magento\Catalog\Model\Product; use Magento\Catalog\Model\Product\ImageFactory; +use Magento\Framework\Exception\LocalizedException; use Magento\Framework\GraphQl\Config\Element\Field; use Magento\Framework\GraphQl\Query\ResolverInterface; use Magento\Framework\GraphQl\Schema\Type\ResolveInfo; @@ -45,7 +46,7 @@ public function resolve( array $args = null ): array { if (!isset($value['model'])) { - throw new \LogicException(__('"model" value should be specified')); + throw new LocalizedException(__('"model" value should be specified')); } /** @var Product $product */ $product = $value['model'];