Skip to content

Commit 87b7cba

Browse files
🔃 [Magento Community Engineering] Community Contributions - 2.4-develop
Accepted Community Pull Requests: - #26999: Fixed URL Rewrite addition/removal on product website add/remove (by @gwharton)
2 parents c23f73a + 548a3ed commit 87b7cba

File tree

48 files changed

+236
-1534
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+236
-1534
lines changed

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

Lines changed: 11 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -5,26 +5,15 @@
55
*/
66
namespace Magento\CatalogUrlRewrite\Observer;
77

8-
use Magento\Catalog\Api\Data\ProductInterface;
98
use Magento\Catalog\Model\Product;
10-
use Magento\Catalog\Model\Product\Visibility;
11-
use Magento\Catalog\Model\ResourceModel\Product\CollectionFactory;
12-
use Magento\CatalogUrlRewrite\Model\ProductScopeRewriteGenerator;
139
use Magento\CatalogUrlRewrite\Model\ProductUrlPathGenerator;
1410
use Magento\CatalogUrlRewrite\Model\ProductUrlRewriteGenerator;
15-
use Magento\Framework\Event\Observer;
16-
use Magento\UrlRewrite\Model\Exception\UrlAlreadyExistsException;
17-
use Magento\UrlRewrite\Model\Storage\DeleteEntitiesFromStores;
11+
use Magento\Framework\App\ObjectManager;
1812
use Magento\UrlRewrite\Model\UrlPersistInterface;
1913
use Magento\Framework\Event\ObserverInterface;
20-
use Magento\Store\Model\StoreManagerInterface;
2114

2215
/**
2316
* Class ProductProcessUrlRewriteSavingObserver
24-
*
25-
* Observer to update the Rewrite URLs for a product.
26-
* This observer is triggered on the save function when making changes
27-
* to the products website on the Product Edit page.
2817
*/
2918
class ProductProcessUrlRewriteSavingObserver implements ObserverInterface
3019
{
@@ -43,62 +32,30 @@ class ProductProcessUrlRewriteSavingObserver implements ObserverInterface
4332
*/
4433
private $productUrlPathGenerator;
4534

46-
/**
47-
* @var StoreManagerInterface
48-
*/
49-
private $storeManager;
50-
51-
/**
52-
* @var ProductScopeRewriteGenerator
53-
*/
54-
private $productScopeRewriteGenerator;
55-
56-
/**
57-
* @var DeleteEntitiesFromStores
58-
*/
59-
private $deleteEntitiesFromStores;
60-
61-
/**
62-
* @var CollectionFactory
63-
*/
64-
private $collectionFactory;
65-
6635
/**
6736
* @param ProductUrlRewriteGenerator $productUrlRewriteGenerator
6837
* @param UrlPersistInterface $urlPersist
69-
* @param ProductUrlPathGenerator $productUrlPathGenerator
70-
* @param StoreManagerInterface $storeManager
71-
* @param ProductScopeRewriteGenerator $productScopeRewriteGenerator
72-
* @param DeleteEntitiesFromStores $deleteEntitiesFromStores
73-
* @param CollectionFactory $collectionFactory
38+
* @param ProductUrlPathGenerator|null $productUrlPathGenerator
7439
*/
7540
public function __construct(
7641
ProductUrlRewriteGenerator $productUrlRewriteGenerator,
7742
UrlPersistInterface $urlPersist,
78-
ProductUrlPathGenerator $productUrlPathGenerator,
79-
StoreManagerInterface $storeManager,
80-
ProductScopeRewriteGenerator $productScopeRewriteGenerator,
81-
DeleteEntitiesFromStores $deleteEntitiesFromStores,
82-
CollectionFactory $collectionFactory
43+
ProductUrlPathGenerator $productUrlPathGenerator = null
8344
) {
8445
$this->productUrlRewriteGenerator = $productUrlRewriteGenerator;
8546
$this->urlPersist = $urlPersist;
86-
$this->productUrlPathGenerator = $productUrlPathGenerator;
87-
$this->storeManager = $storeManager;
88-
$this->productScopeRewriteGenerator = $productScopeRewriteGenerator;
89-
$this->deleteEntitiesFromStores = $deleteEntitiesFromStores;
90-
$this->collectionFactory = $collectionFactory;
47+
$this->productUrlPathGenerator = $productUrlPathGenerator ?: ObjectManager::getInstance()
48+
->get(ProductUrlPathGenerator::class);
9149
}
9250

9351
/**
9452
* Generate urls for UrlRewrite and save it in storage
9553
*
96-
* @param Observer $observer
54+
* @param \Magento\Framework\Event\Observer $observer
9755
* @return void
98-
* @throws UrlAlreadyExistsException
99-
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
56+
* @throws \Magento\UrlRewrite\Model\Exception\UrlAlreadyExistsException
10057
*/
101-
public function execute(Observer $observer)
58+
public function execute(\Magento\Framework\Event\Observer $observer)
10259
{
10360
/** @var Product $product */
10461
$product = $observer->getEvent()->getProduct();
@@ -108,49 +65,11 @@ public function execute(Observer $observer)
10865
|| $product->getIsChangedWebsites()
10966
|| $product->dataHasChangedFor('visibility')
11067
) {
111-
//Refresh rewrite urls
112-
$product->unsUrlPath();
113-
$product->setUrlPath($this->productUrlPathGenerator->getUrlPath($product));
114-
if (!empty($this->productUrlRewriteGenerator->generate($product))) {
68+
if ($product->isVisibleInSiteVisibility()) {
69+
$product->unsUrlPath();
70+
$product->setUrlPath($this->productUrlPathGenerator->getUrlPath($product));
11571
$this->urlPersist->replace($this->productUrlRewriteGenerator->generate($product));
11672
}
117-
118-
$storeIdsToRemove = [];
119-
$productWebsiteMap = array_flip($product->getWebsiteIds());
120-
$storeVisibilities = $this->collectionFactory->create()
121-
->getAllAttributeValues(ProductInterface::VISIBILITY);
122-
if ($this->productScopeRewriteGenerator->isGlobalScope($product->getStoreId())) {
123-
//Remove any rewrite URLs for websites the product is not in, or is not visible in. Global Scope.
124-
foreach ($this->storeManager->getStores() as $store) {
125-
$websiteId = $store->getWebsiteId();
126-
$storeId = $store->getStoreId();
127-
if (!isset($productWebsiteMap[$websiteId])) {
128-
$storeIdsToRemove[] = $storeId;
129-
continue;
130-
}
131-
//Check the visibility of the product in each store.
132-
if (isset($storeVisibilities[$product->getId()][$storeId])
133-
&& ($storeVisibilities[$product->getId()][$storeId] === Visibility::VISIBILITY_NOT_VISIBLE)) {
134-
$storeIdsToRemove[] = $storeId;
135-
}
136-
}
137-
} else {
138-
//Only remove rewrite for current scope
139-
$websiteId = $product->getStore()->getWebsiteId();
140-
$storeId = $product->getStoreId();
141-
if (!isset($productWebsiteMap[$websiteId]) ||
142-
(isset($storeVisibilities[$product->getId()][$storeId])
143-
&& ($storeVisibilities[$product->getId()][$storeId] === Visibility::VISIBILITY_NOT_VISIBLE))) {
144-
$storeIdsToRemove[] = $storeId;
145-
}
146-
}
147-
if (count($storeIdsToRemove)) {
148-
$this->deleteEntitiesFromStores->execute(
149-
$storeIdsToRemove,
150-
[$product->getId()],
151-
ProductUrlRewriteGenerator::ENTITY_TYPE
152-
);
153-
}
15473
}
15574
}
15675
}
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
namespace Magento\CatalogUrlRewrite\Observer;
7+
8+
use Magento\Catalog\Api\ProductRepositoryInterface;
9+
use Magento\Catalog\Model\Product\Visibility;
10+
use Magento\CatalogUrlRewrite\Model\ProductUrlRewriteGenerator;
11+
use Magento\Framework\App\RequestInterface;
12+
use Magento\Framework\Event\ObserverInterface;
13+
use Magento\Store\Model\Store;
14+
use Magento\UrlRewrite\Model\UrlPersistInterface;
15+
use Magento\UrlRewrite\Service\V1\Data\UrlRewrite;
16+
use Magento\Store\Api\StoreWebsiteRelationInterface;
17+
use Magento\Framework\App\ObjectManager;
18+
19+
/**
20+
* Observer to assign the products to website
21+
*/
22+
class ProductToWebsiteChangeObserver implements ObserverInterface
23+
{
24+
/**
25+
* @var ProductUrlRewriteGenerator
26+
*/
27+
protected $productUrlRewriteGenerator;
28+
29+
/**
30+
* @var UrlPersistInterface
31+
*/
32+
protected $urlPersist;
33+
34+
/**
35+
* @var ProductRepositoryInterface
36+
*/
37+
protected $productRepository;
38+
39+
/**
40+
* @var RequestInterface
41+
*/
42+
protected $request;
43+
44+
/**
45+
* @var StoreWebsiteRelationInterface
46+
*/
47+
private $storeWebsiteRelation;
48+
49+
/**
50+
* @param ProductUrlRewriteGenerator $productUrlRewriteGenerator
51+
* @param UrlPersistInterface $urlPersist
52+
* @param ProductRepositoryInterface $productRepository
53+
* @param RequestInterface $request
54+
* @param StoreWebsiteRelationInterface $storeWebsiteRelation
55+
*/
56+
public function __construct(
57+
ProductUrlRewriteGenerator $productUrlRewriteGenerator,
58+
UrlPersistInterface $urlPersist,
59+
ProductRepositoryInterface $productRepository,
60+
RequestInterface $request,
61+
StoreWebsiteRelationInterface $storeWebsiteRelation = null
62+
) {
63+
$this->productUrlRewriteGenerator = $productUrlRewriteGenerator;
64+
$this->urlPersist = $urlPersist;
65+
$this->productRepository = $productRepository;
66+
$this->request = $request;
67+
$this->storeWebsiteRelation = $storeWebsiteRelation ?:
68+
ObjectManager::getInstance()->get(StoreWebsiteRelationInterface::class);
69+
}
70+
71+
/**
72+
* Generate urls for UrlRewrite and save it in storage
73+
*
74+
* @param \Magento\Framework\Event\Observer $observer
75+
* @return void
76+
*/
77+
public function execute(\Magento\Framework\Event\Observer $observer)
78+
{
79+
foreach ($observer->getEvent()->getProducts() as $productId) {
80+
$product = $this->productRepository->getById(
81+
$productId,
82+
false,
83+
$this->request->getParam('store_id', Store::DEFAULT_STORE_ID)
84+
);
85+
86+
if (!empty($this->productUrlRewriteGenerator->generate($product))) {
87+
if ($this->request->getParam('remove_website_ids')) {
88+
foreach ($this->request->getParam('remove_website_ids') as $webId) {
89+
foreach ($this->storeWebsiteRelation->getStoreByWebsiteId($webId) as $storeId) {
90+
$this->urlPersist->deleteByData([
91+
UrlRewrite::ENTITY_ID => $product->getId(),
92+
UrlRewrite::ENTITY_TYPE => ProductUrlRewriteGenerator::ENTITY_TYPE,
93+
UrlRewrite::STORE_ID => $storeId
94+
]);
95+
}
96+
}
97+
}
98+
if ($product->getVisibility() != Visibility::VISIBILITY_NOT_VISIBLE) {
99+
$this->urlPersist->replace($this->productUrlRewriteGenerator->generate($product));
100+
}
101+
}
102+
}
103+
}
104+
}

app/code/Magento/CatalogUrlRewrite/Plugin/ProductProcessUrlRewriteRemovingPlugin.php

Lines changed: 0 additions & 128 deletions
This file was deleted.

app/code/Magento/CatalogUrlRewrite/Test/Mftf/Test/AdminCategoryWithRestrictedUrlKeyNotCreatedTest.xml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
<testCaseId value="MC-17515"/>
1818
<useCaseId value="MAGETWO-69825"/>
1919
<group value="CatalogUrlRewrite"/>
20-
<group value="urlRewrite"/>
2120
</annotations>
2221
<before>
2322
<actionGroup ref="AdminLoginActionGroup" stepKey="loginAsAdmin"/>

0 commit comments

Comments
 (0)