Skip to content

Commit c340802

Browse files
author
Graham Wharton
committed
Optimised code.
Processed review comments.
1 parent a4700f5 commit c340802

File tree

5 files changed

+323
-191
lines changed

5 files changed

+323
-191
lines changed

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

Lines changed: 36 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,19 @@
55
*/
66
namespace Magento\CatalogUrlRewrite\Observer;
77

8+
use Magento\Catalog\Api\Data\ProductInterface;
89
use Magento\Catalog\Model\Product;
9-
use Magento\Catalog\Model\ProductRepository;
10+
use Magento\Catalog\Model\Product\Visibility;
11+
use Magento\Catalog\Model\ResourceModel\Product\Collection;
1012
use Magento\CatalogUrlRewrite\Model\ProductScopeRewriteGenerator;
1113
use Magento\CatalogUrlRewrite\Model\ProductUrlPathGenerator;
1214
use Magento\CatalogUrlRewrite\Model\ProductUrlRewriteGenerator;
1315
use Magento\Framework\Event\Observer;
14-
use Magento\Framework\Exception\NoSuchEntityException;
1516
use Magento\UrlRewrite\Model\Exception\UrlAlreadyExistsException;
1617
use Magento\UrlRewrite\Model\Storage\DeleteEntitiesFromStores;
1718
use Magento\UrlRewrite\Model\UrlPersistInterface;
1819
use Magento\Framework\Event\ObserverInterface;
1920
use Magento\Store\Model\StoreManagerInterface;
20-
use Magento\Store\Api\StoreWebsiteRelationInterface;
2121

2222
/**
2323
* Class ProductProcessUrlRewriteSavingObserver
@@ -29,73 +29,65 @@
2929
class ProductProcessUrlRewriteSavingObserver implements ObserverInterface
3030
{
3131
/**
32-
* @var ProductUrlRewriteGenerator $productUrlRewriteGenerator
32+
* @var ProductUrlRewriteGenerator
3333
*/
3434
private $productUrlRewriteGenerator;
3535

3636
/**
37-
* @var UrlPersistInterface $urlPersist
37+
* @var UrlPersistInterface
3838
*/
3939
private $urlPersist;
4040

4141
/**
42-
* @var ProductUrlPathGenerator $productUrlPathGenerator
42+
* @var ProductUrlPathGenerator
4343
*/
4444
private $productUrlPathGenerator;
4545

4646
/**
47-
* @var StoreManagerInterface $storeManager
47+
* @var StoreManagerInterface
4848
*/
4949
private $storeManager;
5050

5151
/**
52-
* @var StoreWebsiteRelationInterface $storeWebsiteRelation
52+
* @var ProductScopeRewriteGenerator
5353
*/
54-
private $storeWebsiteRelation;
55-
56-
/**
57-
* @var ProductRepository $productRepository
58-
*/
59-
private $productRepository;
54+
private $productScopeRewriteGenerator;
6055

6156
/**
62-
* @var ProductScopeRewriteGenerator $productScopeRewriteGenerator
57+
* @var DeleteEntitiesFromStores
6358
*/
64-
private $productScopeRewriteGenerator;
59+
private $deleteEntitiesFromStores;
6560

6661
/**
67-
* @var DeleteEntitiesFromStores $deleteEntitiesFromStores
62+
* @var Collection
6863
*/
69-
private $deleteEntitiesFromStores;
64+
private $productCollection;
7065

7166
/**
7267
* @param ProductUrlRewriteGenerator $productUrlRewriteGenerator
7368
* @param UrlPersistInterface $urlPersist
7469
* @param ProductUrlPathGenerator $productUrlPathGenerator
7570
* @param StoreManagerInterface $storeManager
76-
* @param StoreWebsiteRelationInterface $storeWebsiteRelation
77-
* @param ProductRepository $productRepository
7871
* @param ProductScopeRewriteGenerator $productScopeRewriteGenerator
7972
* @param DeleteEntitiesFromStores $deleteEntitiesFromStores
73+
* @param Collection $productCollection
8074
*/
8175
public function __construct(
8276
ProductUrlRewriteGenerator $productUrlRewriteGenerator,
8377
UrlPersistInterface $urlPersist,
8478
ProductUrlPathGenerator $productUrlPathGenerator,
8579
StoreManagerInterface $storeManager,
86-
StoreWebsiteRelationInterface $storeWebsiteRelation,
87-
ProductRepository $productRepository,
8880
ProductScopeRewriteGenerator $productScopeRewriteGenerator,
89-
DeleteEntitiesFromStores $deleteEntitiesFromStores
81+
DeleteEntitiesFromStores $deleteEntitiesFromStores,
82+
Collection $productCollection
9083
) {
9184
$this->productUrlRewriteGenerator = $productUrlRewriteGenerator;
9285
$this->urlPersist = $urlPersist;
9386
$this->productUrlPathGenerator = $productUrlPathGenerator;
9487
$this->storeManager = $storeManager;
95-
$this->storeWebsiteRelation = $storeWebsiteRelation;
96-
$this->productRepository = $productRepository;
9788
$this->productScopeRewriteGenerator = $productScopeRewriteGenerator;
9889
$this->deleteEntitiesFromStores = $deleteEntitiesFromStores;
90+
$this->productCollection = $productCollection;
9991
}
10092

10193
/**
@@ -104,8 +96,6 @@ public function __construct(
10496
* @param Observer $observer
10597
* @return void
10698
* @throws UrlAlreadyExistsException
107-
* @throws NoSuchEntityException
108-
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
10999
*/
110100
public function execute(Observer $observer)
111101
{
@@ -125,29 +115,31 @@ public function execute(Observer $observer)
125115
}
126116

127117
$storeIdsToRemove = [];
118+
$productWebsiteMap = array_flip($product->getWebsiteIds());
119+
$storeVisibilities = $this->productCollection->getAllAttributeValues(ProductInterface::VISIBILITY);
128120
if ($this->productScopeRewriteGenerator->isGlobalScope($product->getStoreId())) {
129121
//Remove any rewrite URLs for websites the product is not in, or is not visible in. Global Scope.
130-
foreach ($this->storeManager->getWebsites() as $website) {
131-
$websiteId = $website->getWebsiteId();
132-
foreach ($this->storeWebsiteRelation->getStoreByWebsiteId($websiteId) as $storeid) {
133-
//Load the product for the store we are processing so we can see if it is visible
134-
$storeProduct = $this->productRepository->getById(
135-
$product->getId(),
136-
false,
137-
$storeid,
138-
true
139-
);
140-
if (!$storeProduct->isVisibleInSiteVisibility() ||
141-
!in_array($websiteId, $product->getWebsiteIds())) {
142-
$storeIdsToRemove[] = $storeid;
143-
};
122+
foreach ($this->storeManager->getStores() as $store) {
123+
$websiteId = $store->getWebsiteId();
124+
$storeId = $store->getStoreId();
125+
if (!isset($productWebsiteMap[$websiteId])) {
126+
$storeIdsToRemove[] = $storeId;
127+
continue;
128+
}
129+
//Check the visibility of the product in each store.
130+
if (isset($storeVisibilities[$product->getId()][$storeId])
131+
&& ($storeVisibilities[$product->getId()][$storeId] === Visibility::VISIBILITY_NOT_VISIBLE)) {
132+
$storeIdsToRemove[] = $storeId;
144133
}
145134
}
146135
} else {
147136
//Only remove rewrite for current scope
148-
if (!$product->isVisibleInSiteVisibility() ||
149-
!in_array($product->getStoreId(), $product->getStoreIds())) {
150-
$storeIdsToRemove[] = $product->getStoreId();
137+
$websiteId = $product->getStore()->getWebsiteId();
138+
$storeId = $product->getStoreId();
139+
if (!isset($productWebsiteMap[$websiteId]) ||
140+
(isset($storeVisibilities[$product->getId()][$storeId])
141+
&& ($storeVisibilities[$product->getId()][$storeId] === Visibility::VISIBILITY_NOT_VISIBLE))) {
142+
$storeIdsToRemove[] = $storeId;
151143
}
152144
}
153145
if (count($storeIdsToRemove)) {

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

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,27 +26,27 @@
2626
class ProductProcessUrlRewriteRemovingPlugin
2727
{
2828
/**
29-
* @var ProductRepositoryInterface $productRepository
29+
* @var ProductRepositoryInterface
3030
*/
3131
private $productRepository;
3232

3333
/**
34-
* @var StoreWebsiteRelationInterface $storeWebsiteRelation
34+
* @var StoreWebsiteRelationInterface
3535
*/
3636
private $storeWebsiteRelation;
3737

3838
/**
39-
* @var UrlPersistInterface $urlPersist
39+
* @var UrlPersistInterface
4040
*/
4141
private $urlPersist;
4242

4343
/**
44-
* @var ProductUrlRewriteGenerator $productUrlRewriteGenerator
44+
* @var ProductUrlRewriteGenerator
4545
*/
4646
private $productUrlRewriteGenerator;
4747

4848
/**
49-
* @var DeleteEntitiesFromStores $deleteEntitiesFromStores
49+
* @var DeleteEntitiesFromStores
5050
*/
5151
private $deleteEntitiesFromStores;
5252

@@ -108,7 +108,8 @@ public function afterUpdateWebsites(
108108
}
109109

110110
$storeIdsToRemove = [];
111-
// Remove the URLs from websites this product no longer belongs to
111+
// Remove the URLs for products in $productIds array
112+
// from all stores that belong to websites in $websiteIds array
112113
if ($type === "remove" && $websiteIds && $productIds) {
113114
foreach ($websiteIds as $webId) {
114115
foreach ($this->storeWebsiteRelation->getStoreByWebsiteId($webId) as $storeid) {

0 commit comments

Comments
 (0)