| Current Path : /home/rtorresani/www/vendor/magento/module-catalog-url-rewrite/Model/Map/ |
| Current File : //home/rtorresani/www/vendor/magento/module-catalog-url-rewrite/Model/Map/UrlRewriteFinder.php |
<?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;
}
}