123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 |
- <?php
- /**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
- namespace Magento\CatalogUrlRewrite\Model\Map;
- use Magento\Catalog\Model\Product;
- use Magento\UrlRewrite\Model\UrlFinderInterface;
- use Magento\UrlRewrite\Service\V1\Data\UrlRewrite;
- use Magento\UrlRewrite\Service\V1\Data\UrlRewriteFactory;
- /**
- * Finds specific queried url rewrites identified by specific fields
- *
- * A group of identifiers specifies a query consumed by the client to retrieve existing url rewrites from the database
- * Clients will query a map of DatabaseMapInterface type through this class resulting into a set of url rewrites results
- * Each map type will fallback to a UrlFinderInterface by identifiers for unmapped values
- */
- class UrlRewriteFinder
- {
- const ENTITY_TYPE_CATEGORY = 'category';
- const ENTITY_TYPE_PRODUCT = 'product';
- /**
- * @var \Magento\CatalogUrlRewrite\Model\Map\DatabaseMapPool
- */
- private $databaseMapPool;
- /**
- * @var \Magento\UrlRewrite\Model\UrlFinderInterface
- */
- private $urlFinder;
- /**
- * @var \Magento\UrlRewrite\Service\V1\Data\UrlRewrite
- */
- private $urlRewritePrototype;
- /**
- * @var array
- */
- private $urlRewriteClassNames = [];
- /**
- * @param DatabaseMapPool $databaseMapPool
- * @param UrlFinderInterface $urlFinder
- * @param UrlRewriteFactory $urlRewriteFactory
- * @param string[] $urlRewriteClassNames
- */
- public function __construct(
- DatabaseMapPool $databaseMapPool,
- UrlFinderInterface $urlFinder,
- UrlRewriteFactory $urlRewriteFactory,
- array $urlRewriteClassNames = []
- ) {
- $this->databaseMapPool = $databaseMapPool;
- $this->urlFinder = $urlFinder;
- $this->urlRewriteClassNames = $urlRewriteClassNames;
- $this->urlRewritePrototype = $urlRewriteFactory->create();
- }
- /**
- * Retrieves existing url rewrites filtered by identifiers from prebuild database maps
- * This method will fall-back to by using UrlFinderInterface when map type is not found in configured list
- *
- * @param int $entityId
- * @param int $storeId
- * @param string $entityType
- * @param int|null $rootCategoryId
- * @return \Magento\UrlRewrite\Service\V1\Data\UrlRewrite[]
- */
- public function findAllByData($entityId, $storeId, $entityType, $rootCategoryId = null)
- {
- if ($rootCategoryId
- && is_numeric($entityId)
- && is_numeric($storeId)
- && is_string($entityType)
- && isset($this->urlRewriteClassNames[$entityType])
- ) {
- $map = $this->databaseMapPool->getDataMap($this->urlRewriteClassNames[$entityType], $rootCategoryId);
- if ($map) {
- $key = $storeId . '_' . $entityId;
- return $this->arrayToUrlRewriteObject($map->getData($rootCategoryId, $key));
- }
- }
- return $this->urlFinder->findAllByData(
- [
- UrlRewrite::STORE_ID => $storeId,
- UrlRewrite::ENTITY_ID => $entityId,
- UrlRewrite::ENTITY_TYPE => $entityType
- ]
- );
- }
- /**
- * Transfers an array values to url rewrite object values
- *
- * @param array $data
- * @return UrlRewrite[]
- */
- private function arrayToUrlRewriteObject(array $data)
- {
- foreach ($data as $key => $array) {
- $data[$key] = $this->createUrlRewrite($array);
- }
- return $data;
- }
- /**
- * Creates url rewrite object and sets $data to its properties by key->value
- *
- * @param array $data
- * @return UrlRewrite
- */
- private function createUrlRewrite(array $data)
- {
- $dataObject = clone $this->urlRewritePrototype;
- $dataObject->setUrlRewriteId($data['url_rewrite_id']);
- $dataObject->setEntityType($data['entity_type']);
- $dataObject->setEntityId($data['entity_id']);
- $dataObject->setRequestPath($data['request_path']);
- $dataObject->setTargetPath($data['target_path']);
- $dataObject->setRedirectType($data['redirect_type']);
- $dataObject->setStoreId($data['store_id']);
- $dataObject->setDescription($data['description']);
- $dataObject->setIsAutogenerated($data['is_autogenerated']);
- $dataObject->setMetadata($data['metadata']);
- return $dataObject;
- }
- }
|