Skip to content

Commit f21f638

Browse files
ENGCOM-8996: Make sure all 301 url redirects get generated when importing more the… #32640
- Merge Pull Request #32640 from hostep/magento2:fix-for-issue-29520 - Merged commits: 1. 7ac4da7 2. e792abc 3. b6bfb66
2 parents d7b0245 + b6bfb66 commit f21f638

File tree

3 files changed

+85
-3
lines changed

3 files changed

+85
-3
lines changed

app/code/Magento/CatalogUrlRewrite/Observer/AfterImportDataObserver.php

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -475,17 +475,18 @@ private function currentUrlRewritesRegenerate()
475475
]
476476
);
477477

478-
$urlRewrites = [];
478+
$mergeDataProvider = clone $this->mergeDataProviderPrototype;
479479
foreach ($currentUrlRewrites as $currentUrlRewrite) {
480480
$category = $this->retrieveCategoryFromMetadata($currentUrlRewrite);
481481
if ($category === false) {
482482
continue;
483483
}
484-
$url = $currentUrlRewrite->getIsAutogenerated()
484+
$urls = $currentUrlRewrite->getIsAutogenerated()
485485
? $this->generateForAutogenerated($currentUrlRewrite, $category)
486486
: $this->generateForCustom($currentUrlRewrite, $category);
487-
$urlRewrites = $url + $urlRewrites;
487+
$mergeDataProvider->merge($urls);
488488
}
489+
$urlRewrites = $mergeDataProvider->getData();
489490

490491
$this->product = null;
491492
$this->productCategories = null;

dev/tests/integration/testsuite/Magento/CatalogUrlRewrite/Model/ProductUrlRewriteTest.php

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,16 @@
1313
use Magento\Catalog\Model\Product\Visibility;
1414
use Magento\Catalog\Model\ProductFactory;
1515
use Magento\Catalog\Model\ResourceModel\Product as ProductResource;
16+
use Magento\CatalogImportExport\Model\Import\Product;
1617
use Magento\CatalogUrlRewrite\Model\Map\DataProductUrlRewriteDatabaseMap;
18+
use Magento\Framework\App\Filesystem\DirectoryList;
19+
use Magento\Framework\Filesystem;
20+
use Magento\ImportExport\Model\Import;
21+
use Magento\ImportExport\Model\Import\Source\Csv;
1722
use Magento\Store\Model\ScopeInterface;
1823
use Magento\UrlRewrite\Model\Exception\UrlAlreadyExistsException;
1924
use Magento\UrlRewrite\Model\OptionProvider;
25+
use Psr\Log\LoggerInterface;
2026

2127
/**
2228
* Class for product url rewrites tests
@@ -275,6 +281,77 @@ public function testProductUrlRewritePerStoreViews(): void
275281
}
276282
}
277283

284+
/**
285+
* Check if redirects are generated correctly while product urls are changed during import process.
286+
*
287+
* @magentoDataFixture Magento/Catalog/_files/multiple_products.php
288+
* @magentoAppIsolation enabled
289+
* @magentoDbIsolation enabled
290+
*/
291+
public function testImportProductRewrites()
292+
{
293+
$data = [
294+
['sku' => 'simple1', 'request_path' => 'simple-product1', 'target_path' => 'product-1-updated'],
295+
['sku' => 'simple2', 'request_path' => 'simple-product2', 'target_path' => 'product-2-updated'],
296+
['sku' => 'simple3', 'request_path' => 'simple-product3', 'target_path' => 'product-3-updated'],
297+
];
298+
299+
$logger = $this->getMockBuilder(LoggerInterface::class)
300+
->disableOriginalConstructor()
301+
->getMockForAbstractClass();
302+
$productImport = $this->objectManager->create(
303+
Product::class,
304+
['logger' => $logger]
305+
);
306+
$filesystem = $this->objectManager->get(Filesystem::class);
307+
308+
foreach ($data as $datum) {
309+
$this->assertEquals(
310+
$datum['request_path'],
311+
$this->productRepository->get($datum['sku'], false, null, true)->getUrlKey()
312+
);
313+
}
314+
315+
$directory = $filesystem->getDirectoryWrite(DirectoryList::ROOT);
316+
$source = $this->objectManager->create(
317+
Csv::class,
318+
[
319+
'file' => __DIR__ . '/../_files/products_to_import_with_rewrites.csv',
320+
'directory' => $directory
321+
]
322+
);
323+
$errors = $productImport->setParameters(
324+
['behavior' => Import::BEHAVIOR_APPEND, 'entity' => 'catalog_product']
325+
)->setSource(
326+
$source
327+
)->validateData();
328+
$this->assertTrue($errors->getErrorsCount() === 0);
329+
$productImport->importData();
330+
331+
foreach ($data as $datum) {
332+
$product = $this->productRepository->get($datum['sku'], false, null, true);
333+
$this->assertEquals(
334+
$datum['target_path'],
335+
$product->getUrlKey()
336+
);
337+
338+
$productUrlRewriteCollection = $this->getEntityRewriteCollection($product->getId());
339+
$rewriteExists = false;
340+
foreach ($productUrlRewriteCollection as $item) {
341+
if (
342+
$item->getTargetPath() === $datum['target_path'] . $this->suffix &&
343+
$item->getRequestPath() === $datum['request_path'] . $this->suffix
344+
) {
345+
$rewriteExists = true;
346+
break;
347+
}
348+
349+
}
350+
351+
$this->assertTrue($rewriteExists);
352+
}
353+
}
354+
278355
/**
279356
* Save product with data using resource model directly
280357
*
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
sku,product_type,store_view_code,name,price,attribute_set_code,categories,product_websites,url_key,save_rewrites_history
2+
simple1,simple,,"simple 1",25,Default,"Default Category/Category 1",base,product-1-updated,1
3+
simple2,simple,,"simple 2",34,Default,"Default Category/Category 1",base,product-2-updated,1
4+
simple3,simple,,"simple 3",58,Default,"Default Category/Category 1",base,product-3-updated,1

0 commit comments

Comments
 (0)