diff --git a/app/code/Magento/Catalog/Model/Product/Copier.php b/app/code/Magento/Catalog/Model/Product/Copier.php index 44ebdf0f1f283..9bb5551bf2bae 100644 --- a/app/code/Magento/Catalog/Model/Product/Copier.php +++ b/app/code/Magento/Catalog/Model/Product/Copier.php @@ -40,13 +40,24 @@ class Copier /** * @param CopyConstructorInterface $copyConstructor * @param \Magento\Catalog\Model\ProductFactory $productFactory + * @param \Magento\Catalog\Model\Product\Action $productAction = null + * @param \Magento\UrlRewrite\Model\UrlPersistInterface $urlPersist = null, + * @param \Magento\CatalogUrlRewrite\Model\ProductUrlRewriteGenerator $productUrlRewriteGenerator = null */ public function __construct( CopyConstructorInterface $copyConstructor, - \Magento\Catalog\Model\ProductFactory $productFactory + \Magento\Catalog\Model\ProductFactory $productFactory, + \Magento\Catalog\Model\Product\Action $productAction = null, + \Magento\UrlRewrite\Model\UrlPersistInterface $urlPersist = null, + \Magento\CatalogUrlRewrite\Model\ProductUrlRewriteGenerator $productUrlRewriteGenerator = null ) { $this->productFactory = $productFactory; $this->copyConstructor = $copyConstructor; + $this->productAction = $productAction ?: \Magento\Framework\App\ObjectManager::getInstance()->get(\Magento\Catalog\Model\Product\Action::class); + $this->urlPersist = $urlPersist ?: \Magento\Framework\App\ObjectManager::getInstance() + ->get(\Magento\UrlRewrite\Model\UrlPersistInterface::class); + $this->productUrlRewriteGenerator = $productUrlRewriteGenerator ?: \Magento\Framework\App\ObjectManager::getInstance() + ->get(\Magento\CatalogUrlRewrite\Model\ProductUrlRewriteGenerator::class); } /** @@ -136,10 +147,15 @@ private function setStoresUrl(Product $product, Product $duplicate) : void } do { $urlKey = $this->modifyUrl($urlKey); - $duplicate->setUrlKey($urlKey); - $duplicate->setData('url_path', null); + $productIds = [$duplicate->getId()]; + $attributesData = [ + 'url_key' => $urlKey, + 'url_path' => null + ]; try { - $duplicate->save(); + $this->productAction->updateAttributes($productIds, $attributesData, $storeId); + $duplicate = $duplicate->setStoreId($storeId)->load($duplicate->getId()); + $this->urlPersist->replace($this->productUrlRewriteGenerator->generate($duplicate)); $isDuplicateSaved = true; // phpcs:ignore Magento2.CodeAnalysis.EmptyBlock } catch (\Magento\Framework\Exception\AlreadyExistsException $e) { diff --git a/app/code/Magento/Catalog/Test/Unit/Model/Product/CopierTest.php b/app/code/Magento/Catalog/Test/Unit/Model/Product/CopierTest.php index 80b6db2a516bd..965fc1e0fb217 100644 --- a/app/code/Magento/Catalog/Test/Unit/Model/Product/CopierTest.php +++ b/app/code/Magento/Catalog/Test/Unit/Model/Product/CopierTest.php @@ -53,6 +53,12 @@ protected function setUp() \Magento\Catalog\Model\ProductFactory::class, ['create'] ); + $this->productActionMock = $this->createMock(\Magento\Catalog\Model\Product\Action::class); + $this->urlPersist = $this->createMock(\Magento\UrlRewrite\Model\UrlPersistInterface::class); + $this->productUrlRewriteGenerator = $this->createPartialMock( + \Magento\CatalogUrlRewrite\Model\ProductUrlRewriteGenerator::class, + ['generate'] + ); $this->optionRepositoryMock = $this->createMock( \Magento\Catalog\Model\Product\Option\Repository::class ); @@ -69,7 +75,10 @@ protected function setUp() $metadataPool->expects($this->any())->method('getMetadata')->willReturn($this->metadata); $this->_model = new Copier( $this->copyConstructorMock, - $this->productFactoryMock + $this->productFactoryMock, + $this->productActionMock, + $this->urlPersist, + $this->productUrlRewriteGenerator ); $this->setProperties($this->_model, [ @@ -161,8 +170,6 @@ public function testCopy() 'setUpdatedAt', 'setId', 'getEntityId', - 'save', - 'setUrlKey', 'setStoreId', 'getStoreIds', ] @@ -186,9 +193,14 @@ public function testCopy() $duplicateMock->expects($this->atLeastOnce())->method('getStoreIds')->willReturn([]); $duplicateMock->expects($this->atLeastOnce())->method('setData')->willReturn($duplicateMock); $this->copyConstructorMock->expects($this->once())->method('build')->with($this->productMock, $duplicateMock); - $duplicateMock->expects($this->once())->method('setUrlKey')->with('urk-key-2')->willReturn($duplicateMock); - $duplicateMock->expects($this->once())->method('save'); + $this->productActionMock->expects($this->once()) + ->method('updateAttributes') + ->with([3], ['url_key' => 'urk-key-2'], 2); + $this->urlPersist->expects($this->exactly(1)) + ->method('replace') + ->with([3 => 'rewrite']); + $this->metadata->expects($this->any())->method('getLinkField')->willReturn('linkField'); $duplicateMock->expects($this->any())->method('getData')->willReturnMap([