diff --git a/Model/GraphQl/Resolver/DataProvider/Node.php b/Model/GraphQl/Resolver/DataProvider/Node.php index 56e10070..04e52500 100644 --- a/Model/GraphQl/Resolver/DataProvider/Node.php +++ b/Model/GraphQl/Resolver/DataProvider/Node.php @@ -21,6 +21,7 @@ class Node const URL_KEY = 'url_key'; const NODE_TYPE_CUSTOM_URL = 'custom_url'; + const NODE_TYPE_CMS_BLOCK = 'cms_block'; /** * @var NodeRepositoryInterface @@ -74,7 +75,7 @@ public function getNodesByMenuIdentifier(string $identifier, int $storeId): arra ); } - $nodes = $this->nodeRepository->getByIdentifier($identifier); + $nodes = $this->nodeRepository->getByMenu((int) $menu->getId()); $this->loadModels($nodes, $storeId); foreach ($nodes as $node) { if ($node->getIsActive()) { @@ -96,7 +97,7 @@ private function convertData(NodeInterface $node): array NodeInterface::NODE_ID => (int) $node->getId(), NodeInterface::MENU_ID => (int) $node->getMenuId(), NodeInterface::TYPE => $node->getType(), - NodeInterface::CONTENT => $node->getContent(), + NodeInterface::CONTENT => $this->getContent($node), NodeInterface::CLASSES => $node->getClasses(), NodeInterface::PARENT_ID => (int) $node->getParentId(), NodeInterface::POSITION => (int) $node->getPosition(), @@ -118,6 +119,22 @@ private function convertData(NodeInterface $node): array ]; } + /** + * @param NodeInterface $node + * @return string|null + */ + private function getContent(NodeInterface $node): ?string + { + if ( + $node->getType() === self::NODE_TYPE_CMS_BLOCK + && isset($this->loadedModels[$node->getType()][$node->getContent()]) + ) { + return $this->loadedModels[$node->getType()][$node->getContent()]; + } + + return $node->getContent(); + } + /** * @param $nodes * @param $storeId @@ -156,7 +173,10 @@ private function loadModels($nodes, $storeId): void */ private function getUrlKey(NodeInterface $node): ?string { - if (in_array($node->getType(), TypeModel::TYPES)) { + if ( + in_array($node->getType(), TypeModel::TYPES) + && $node->getType() !== self::NODE_TYPE_CMS_BLOCK + ) { if (!isset($this->loadedModels[$node->getType()][$node->getContent()])) { return null; } diff --git a/Model/GraphQl/Resolver/DataProvider/Node/TypeModel.php b/Model/GraphQl/Resolver/DataProvider/Node/TypeModel.php index b96ecedb..7e5be019 100644 --- a/Model/GraphQl/Resolver/DataProvider/Node/TypeModel.php +++ b/Model/GraphQl/Resolver/DataProvider/Node/TypeModel.php @@ -6,31 +6,70 @@ use Magento\Catalog\Api\Data\CategoryInterface; use Magento\Catalog\Api\Data\ProductInterface; use Magento\Cms\Api\Data\PageInterface; +use Magento\Cms\Model\Template\FilterProvider; class TypeModel { - const TYPES = ["category", "product", "cms_page"]; + const TYPES = ["category", "product", "cms_page", "cms_block"]; + + const TYPE_CMS_BLOCK = 'cms_block'; /** * @var \Snowdog\Menu\Model\ResourceModel\NodeType\AbstractNode[] */ private $typeModels = []; + /** + * @var FilterProvider + */ + private $filterProvider; + public function __construct( + FilterProvider $filterProvider, array $typeModels = [] ) { + $this->filterProvider = $filterProvider; $this->typeModels = $typeModels; } public function getModels($type, $modelIds, $storeId) { if (isset($this->typeModels[$type])) { - return $this->typeModels[$type]->fetchData($storeId, $modelIds); + $models = $this->typeModels[$type]->fetchData($storeId, $modelIds); + + if ($type === self::TYPE_CMS_BLOCK) { + return $this->prepareCmsBlockModels($models, (int) $storeId); + } + + return $models; } return []; } + /** + * @param array $models + * @param int $storeId + * @return array + */ + private function prepareCmsBlockModels(array $models, int $storeId): array + { + $preparedModels = []; + + foreach ($models as $model) { + if (!isset($model['identifier'])) { + continue; + } + + $preparedModels[$model['identifier']] = $this->filterProvider + ->getBlockFilter() + ->setStoreId($storeId) + ->filter($model['content'] ?? ''); + } + + return $preparedModels; + } + public function getModelUrlKey($type, $model): ?string { switch ($type) { diff --git a/etc/graphql/di.xml b/etc/graphql/di.xml index db193345..8f40bcd0 100644 --- a/etc/graphql/di.xml +++ b/etc/graphql/di.xml @@ -23,6 +23,7 @@ Snowdog\Menu\Model\ResourceModel\NodeType\Product Snowdog\Menu\Model\ResourceModel\NodeType\Category + Snowdog\Menu\Model\ResourceModel\NodeType\CmsBlock Snowdog\Menu\Model\ResourceModel\NodeType\CmsPage