diff --git a/app/code/Magento/CatalogGraphQl/Model/Resolver/Category/Breadcrumbs.php b/app/code/Magento/CatalogGraphQl/Model/Resolver/Category/Breadcrumbs.php new file mode 100644 index 000000000000..d49c7f5e5674 --- /dev/null +++ b/app/code/Magento/CatalogGraphQl/Model/Resolver/Category/Breadcrumbs.php @@ -0,0 +1,62 @@ +breadcrumbsDataProvider = $breadcrumbsDataProvider; + $this->valueFactory = $valueFactory; + } + + /** + * @inheritdoc + */ + public function resolve(Field $field, $context, ResolveInfo $info, array $value = null, array $args = null): Value + { + if (!isset($value['path'])) { + $result = function () { + return null; + }; + return $this->valueFactory->create($result); + } + + $result = function () use ($value) { + $breadcrumbsData = $this->breadcrumbsDataProvider->getData($value['path']); + return count($breadcrumbsData) ? $breadcrumbsData : null; + }; + return $this->valueFactory->create($result); + } +} diff --git a/app/code/Magento/CatalogGraphQl/Model/Resolver/Category/DataProvider/Breadcrumbs.php b/app/code/Magento/CatalogGraphQl/Model/Resolver/Category/DataProvider/Breadcrumbs.php new file mode 100644 index 000000000000..9e23c4f1e973 --- /dev/null +++ b/app/code/Magento/CatalogGraphQl/Model/Resolver/Category/DataProvider/Breadcrumbs.php @@ -0,0 +1,58 @@ +collectionFactory = $collectionFactory; + } + + /** + * @param string $categoryPath + * @return array + */ + public function getData(string $categoryPath): array + { + $breadcrumbsData = []; + + $pathCategoryIds = explode('/', $categoryPath); + $parentCategoryIds = array_slice($pathCategoryIds, 2, -1); + + if (count($parentCategoryIds)) { + $collection = $this->collectionFactory->create(); + $collection->addAttributeToSelect(['name', 'url_key']); + $collection->addAttributeToFilter('entity_id', $parentCategoryIds); + + foreach ($collection as $category) { + $breadcrumbsData[] = [ + 'category_id' => $category->getId(), + 'category_name' => $category->getName(), + 'category_level' => $category->getLevel(), + 'category_url_key' => $category->getUrlKey(), + ]; + } + } + return $breadcrumbsData; + } +} diff --git a/app/code/Magento/CatalogGraphQl/etc/schema.graphqls b/app/code/Magento/CatalogGraphQl/etc/schema.graphqls index 762861de94e6..9235ec271a3c 100644 --- a/app/code/Magento/CatalogGraphQl/etc/schema.graphqls +++ b/app/code/Magento/CatalogGraphQl/etc/schema.graphqls @@ -381,6 +381,14 @@ interface CategoryInterface @typeResolver(class: "Magento\\CatalogGraphQl\\Model currentPage: Int = 1 @doc(description: "Specifies which page of results to return. The default value is 1."), sort: ProductSortInput @doc(description: "Specifies which attribute to sort on, and whether to return the results in ascending or descending order.") ): CategoryProducts @doc(description: "The list of products assigned to the category") @resolver(class: "Magento\\CatalogGraphQl\\Model\\Resolver\\Category\\Products") + breadcrumbs: [Breadcrumb] @doc(description: "Breadcrumbs, parent categories info") @resolver(class: "Magento\\CatalogGraphQl\\Model\\Resolver\\Category\\Breadcrumbs") +} + +type Breadcrumb @doc(description: "Breadcrumb item"){ + category_id: Int @doc(description: "Category ID") + category_name: String @doc(description: "Category name") + category_level: Int @doc(description: "Category level") + category_url_key: String @doc(description: "Category URL key") } type CustomizableRadioOption implements CustomizableOptionInterface @doc(description: "CustomizableRadioOption contains information about a set of radio buttons that are defined as part of a customizable option") {