44 private $productFactory;
49 private $categoryCollectionFactory;
54 private $urlRewriteFactory;
59 private $storeCollectionFactory;
64 private $categories = [];
69 private $storesPerWebsite = [];
74 private $entityGeneratorFactory;
79 private $storeManager;
84 private $productTemplateGeneratorFactory;
89 private $productUrlSuffix = [];
99 private $customTableMap;
113 \
Magento\Catalog\Model\ProductFactory $productFactory,
117 EntityGeneratorFactory $entityGeneratorFactory,
124 $this->categoryCollectionFactory = $categoryCollectionFactory;
125 $this->urlRewriteFactory = $urlRewriteFactory;
126 $this->storeCollectionFactory = $storeCollectionFactory;
127 $this->entityGeneratorFactory = $entityGeneratorFactory;
129 $this->productTemplateGeneratorFactory = $productTemplateGeneratorFactory;
130 $this->scopeConfig = $scopeConfig;
131 $this->customTableMap = $customTableMap;
143 $this->initializeFixtureDefaultValues($fixtureMap);
146 for ($productNumber = 1; $productNumber <=
$products; $productNumber++) {
147 $attributeSetId = $this->getFixtureValue(
'attribute_set_id', $productNumber, $productNumber, $fixtureMap);
156 'entity_id_field' =>
'entity_id',
157 'handler' =>
function (
$productId, $entityNumber, $fixture) {
158 return $this->urlRewriteHandler(
$productId, $entityNumber, $fixture);
161 'catalog_category_product' => [
163 'category_id' =>
'category_ids',
166 'catalog_product_entity' => [
168 'attribute_set_id' =>
'attribute_set_id',
173 $websiteIdsFixtures = $fixtureMap[
'website_ids'](1, 0);
174 if (is_array($websiteIdsFixtures) && count($websiteIdsFixtures) === 1) {
176 $customTableMap[
'catalog_product_website'] = [
178 'website_id' =>
'website_ids',
182 $generator = $this->entityGeneratorFactory->create(
184 'entityType' => ProductInterface::class,
185 'customTableMap' => array_merge($customTableMap, $this->customTableMap)
189 $fixtureMap = array_merge($fixtureMap, [
'attribute_set_id' =>
$attributeSetId]);
191 $this->productTemplateGeneratorFactory->create($fixtureMap),
193 function ($productNumber, $entityNumber) use (
$attributeSetId, $fixtureMap) {
197 $fixtureMap[
'additional_attributes'](
$attributeSetId, $productNumber, $entityNumber)
208 private function initializeFixtureDefaultValues(array &$fixture)
211 'attribute_set_id' =>
function () {
212 return $this->productFactory->create()->getDefaultAttributeSetId();
214 'additional_attributes' =>
function () {
217 'url_key' =>
function (
$productId, $entityNumber) use ($fixture) {
218 return strtolower(str_replace(
' ',
'-', $fixture[
'sku'](
$productId, $entityNumber)));
220 'website_ids' =>
function () {
221 return $this->storeManager->getDefaultStoreView()->getWebsiteId();
225 foreach ($defaultValues as $fixtureKey =>
$value) {
226 if (!isset($fixture[$fixtureKey])) {
227 $fixture[$fixtureKey] =
$value;
239 private function getFixtureValue($fixtureKey,
$productId, $entityNumber, $fixtureMap)
241 $fixtureValue = isset($fixtureMap[$fixtureKey]) ? $fixtureMap[$fixtureKey] :
null;
242 return $fixtureValue ? $this->getBindValue($fixtureValue,
$productId, $entityNumber) :
'';
251 private function getBindValue($fixtureValue,
$productId, $entityNumber)
253 return is_callable($fixtureValue)
266 private function urlRewriteHandler(
$productId, $entityNumber, $fixtureMap)
273 $requestPath = $this->getFixtureValue(
'url_key',
$productId, $entityNumber, $fixtureMap);
274 $targetPath =
'catalog/product/view/id/' .
$productId;
275 $urlRewrite = $this->urlRewriteFactory
277 ->setRequestPath($requestPath)
278 ->setTargetPath($targetPath)
280 ->setEntityType(
'product');
281 $binds[] = $urlRewrite->toArray();
283 if (isset($fixtureMap[
'category_ids'])) {
284 $categoryId = $fixtureMap[
'category_ids'](
$productId, $entityNumber);
285 if (!isset($this->categories[$categoryId])) {
286 $this->categories[$categoryId] = $this->categoryCollectionFactory
288 ->addIdFilter($categoryId)
289 ->addAttributeToSelect(
'url_path')
293 $urlRewrite->setMetadata([
'category_id' => $categoryId])
294 ->setRequestPath($this->categories[$categoryId] .
'/' . $requestPath)
295 ->setTargetPath($targetPath .
'/category/' . $categoryId);
296 $binds[] = $urlRewrite->toArray();
300 if (!isset($this->storesPerWebsite[
$websiteId])) {
301 $this->storesPerWebsite[
$websiteId] = $this->storeCollectionFactory
306 foreach ($binds as $bind) {
308 $bindWithStore = $bind;
309 $bindWithStore[
'store_id'] =
$storeId;
310 $bindWithStore[
'request_path'] .= $this->getUrlSuffix(
$storeId);
311 $bindPerStore[] = $bindWithStore;
316 return $bindPerStore;
325 private function getUrlSuffix(
$storeId)
327 if (!isset($this->productUrlSuffix[
$storeId])) {
328 $this->productUrlSuffix[
$storeId] = $this->scopeConfig->getValue(
334 return $this->productUrlSuffix[
$storeId];
call_user_func($callable, $param)
const XML_PATH_PRODUCT_URL_SUFFIX
generate($products, $fixtureMap)
__construct(\Magento\Catalog\Model\ProductFactory $productFactory, \Magento\Catalog\Model\ResourceModel\Category\CollectionFactory $categoryCollectionFactory, \Magento\UrlRewrite\Service\V1\Data\UrlRewriteFactory $urlRewriteFactory, \Magento\Store\Model\ResourceModel\Store\CollectionFactory $storeCollectionFactory, EntityGeneratorFactory $entityGeneratorFactory, \Magento\Store\Model\StoreManagerInterface $storeManager, ProductTemplateGeneratorFactory $productTemplateGeneratorFactory, \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig, $customTableMap=[])