/** * Generate urls for UrlRewrite and save it in storage * * @param \Magento\Framework\Event\Observer $observer * @return void */ public function execute(\Magento\Framework\Event\Observer $observer) { foreach ($observer->getEvent()->getProducts() as $productId) { $product = $this->productRepository->getById($productId, false, $this->request->getParam('store_id', Store::DEFAULT_STORE_ID)); $this->urlPersist->deleteByData([UrlRewrite::ENTITY_ID => $product->getId(), UrlRewrite::ENTITY_TYPE => ProductUrlRewriteGenerator::ENTITY_TYPE]); $this->urlPersist->replace($this->productUrlRewriteGenerator->generate($product)); } }
/** * Generate urls for UrlRewrite and save it in storage * @param \Magento\Framework\Event\Observer $observer * @return void */ public function execute(\Magento\Framework\Event\Observer $observer) { /** @var Product $product */ $product = $observer->getEvent()->getProduct(); if ($product->dataHasChangedFor('url_key') || $product->getIsChangedCategories() || $product->getIsChangedWebsites() || $product->dataHasChangedFor('visibility')) { $this->urlPersist->deleteByData([UrlRewrite::ENTITY_ID => $product->getId(), UrlRewrite::ENTITY_TYPE => ProductUrlRewriteGenerator::ENTITY_TYPE, UrlRewrite::REDIRECT_TYPE => 0, UrlRewrite::STORE_ID => $product->getStoreId()]); if ($product->isVisibleInSiteVisibility()) { $this->urlPersist->replace($this->productUrlRewriteGenerator->generate($product)); } } }
/** * Generate urls for UrlRewrite and save it in storage * * @param \Magento\Framework\Event\Observer $observer * @return void */ public function execute(\Magento\Framework\Event\Observer $observer) { /** @var \Magento\Catalog\Model\Product $product */ $product = $observer->getEvent()->getProduct(); $isChangedWebsites = $product->getIsChangedWebsites(); if ($product->dataHasChangedFor('url_key') || $product->getIsChangedCategories() || $isChangedWebsites) { if ($isChangedWebsites) { $this->urlPersist->deleteByData([UrlRewrite::ENTITY_ID => $product->getId(), UrlRewrite::ENTITY_TYPE => ProductUrlRewriteGenerator::ENTITY_TYPE]); } $this->urlPersist->replace($this->productUrlRewriteGenerator->generate($product)); } }
/** * Generate url rewrites for products assigned to website * * @param int $websiteId * @param int $originWebsiteId * @param int $storeId * @return array */ protected function generateProductUrls($websiteId, $originWebsiteId, $storeId) { $urls = []; $websiteIds = $websiteId != $originWebsiteId && $originWebsiteId !== null ? [$websiteId, $originWebsiteId] : [$websiteId]; $collection = $this->productFactory->create()->getCollection()->addCategoryIds()->addAttributeToSelect(['name', 'url_path', 'url_key'])->addWebsiteFilter($websiteIds); foreach ($collection as $product) { $product->setStoreId($storeId); /** @var \Magento\Catalog\Model\Product $product */ $urls = array_merge($urls, $this->productUrlRewriteGenerator->generate($product)); } return $urls; }
/** * Set up */ protected function setUp() { $this->urlPersist = $this->getMock(\Magento\UrlRewrite\Model\UrlPersistInterface::class, [], [], '', false); $this->product = $this->getMock(\Magento\Catalog\Model\Product::class, ['getId', 'dataHasChangedFor', 'isVisibleInSiteVisibility', 'getIsChangedWebsites', 'getIsChangedCategories', 'getStoreId'], [], '', false); $this->product->expects($this->any())->method('getId')->will($this->returnValue(3)); $this->event = $this->getMock(\Magento\Framework\Event::class, ['getProduct'], [], '', false); $this->event->expects($this->any())->method('getProduct')->willReturn($this->product); $this->observer = $this->getMock(\Magento\Framework\Event\Observer::class, ['getEvent'], [], '', false); $this->observer->expects($this->any())->method('getEvent')->willReturn($this->event); $this->productUrlRewriteGenerator = $this->getMock(\Magento\CatalogUrlRewrite\Model\ProductUrlRewriteGenerator::class, ['generate'], [], '', false); $this->productUrlRewriteGenerator->expects($this->any())->method('generate')->will($this->returnValue([3 => 'rewrite'])); $this->objectManager = new ObjectManager($this); $this->model = $this->objectManager->getObject(\Magento\CatalogUrlRewrite\Observer\ProductProcessUrlRewriteSavingObserver::class, ['productUrlRewriteGenerator' => $this->productUrlRewriteGenerator, 'urlPersist' => $this->urlPersist]); }
/** * Action after data import. * Save new url rewrites and remove old if exist. * * @param Observer $observer * * @return void */ public function afterImportData(Observer $observer) { $import = $observer->getEvent()->getAdapter(); if ($products = $observer->getEvent()->getBunch()) { $productUrls = []; foreach ($products as $product) { $productObject = $import->_populateToUrlGeneration($product); $productUrls = array_merge($productUrls, $this->productUrlRewriteGenerator->generate($productObject)); } if ($productUrls) { $this->urlPersist->replace($productUrls); } } }
/** * @param ImportProduct $import * @param bool $result * @return bool */ public function afterImportData(ImportProduct $import, $result) { if ($import->getAffectedEntityIds()) { foreach ($import->getAffectedEntityIds() as $productId) { $product = $this->productRepository->getById($productId); $productUrls = $this->productUrlRewriteGenerator->generate($product); if ($productUrls) { $this->urlPersist->replace($productUrls); } } } elseif (ImportExport::BEHAVIOR_DELETE == $import->getBehavior()) { $this->clearProductUrls($import); } return $result; }
/** * @param Category $category * @param int $storeId * @param bool $saveRewriteHistory * @return UrlRewrite[] */ public function getCategoryProductsUrlRewrites(Category $category, $storeId, $saveRewriteHistory) { /** @var \Magento\Catalog\Model\ResourceModel\Product\Collection $productCollection */ $productCollection = $category->getProductCollection()->addAttributeToSelect('name')->addAttributeToSelect('url_key')->addAttributeToSelect('url_path'); $productUrls = []; foreach ($productCollection as $product) { if (in_array($product->getId(), $this->isSkippedProduct)) { continue; } $this->isSkippedProduct[] = $product->getId(); $product->setStoreId($storeId); $product->setData('save_rewrites_history', $saveRewriteHistory); $productUrls = array_merge($productUrls, $this->productUrlRewriteGenerator->generate($product)); } return $productUrls; }
/** * Test method */ public function testSkipGenerationForGlobalScope() { $this->product->expects($this->any())->method('getStoreIds')->will($this->returnValue([1, 2])); $this->storeViewService->expects($this->exactly(2))->method('doesEntityHaveOverriddenUrlKeyForStore')->will($this->returnValue(true)); $this->assertEquals([], $this->productUrlRewriteGenerator->generate($this->product)); }
/** * Test for afterImportData() */ public function testAfterImportData() { $this->productUrlRewriteGenerator->expects($this->any())->method('generate')->willReturn(['url1', 'url2']); $this->import->afterImportData($this->observer); }