5
5
*/
6
6
namespace Magento \CatalogUrlRewrite \Observer ;
7
7
8
+ use Magento \Catalog \Api \Data \ProductInterface ;
8
9
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 ;
10
12
use Magento \CatalogUrlRewrite \Model \ProductScopeRewriteGenerator ;
11
13
use Magento \CatalogUrlRewrite \Model \ProductUrlPathGenerator ;
12
14
use Magento \CatalogUrlRewrite \Model \ProductUrlRewriteGenerator ;
13
15
use Magento \Framework \Event \Observer ;
14
- use Magento \Framework \Exception \NoSuchEntityException ;
15
16
use Magento \UrlRewrite \Model \Exception \UrlAlreadyExistsException ;
16
17
use Magento \UrlRewrite \Model \Storage \DeleteEntitiesFromStores ;
17
18
use Magento \UrlRewrite \Model \UrlPersistInterface ;
18
19
use Magento \Framework \Event \ObserverInterface ;
19
20
use Magento \Store \Model \StoreManagerInterface ;
20
- use Magento \Store \Api \StoreWebsiteRelationInterface ;
21
21
22
22
/**
23
23
* Class ProductProcessUrlRewriteSavingObserver
29
29
class ProductProcessUrlRewriteSavingObserver implements ObserverInterface
30
30
{
31
31
/**
32
- * @var ProductUrlRewriteGenerator $productUrlRewriteGenerator
32
+ * @var ProductUrlRewriteGenerator
33
33
*/
34
34
private $ productUrlRewriteGenerator ;
35
35
36
36
/**
37
- * @var UrlPersistInterface $urlPersist
37
+ * @var UrlPersistInterface
38
38
*/
39
39
private $ urlPersist ;
40
40
41
41
/**
42
- * @var ProductUrlPathGenerator $productUrlPathGenerator
42
+ * @var ProductUrlPathGenerator
43
43
*/
44
44
private $ productUrlPathGenerator ;
45
45
46
46
/**
47
- * @var StoreManagerInterface $storeManager
47
+ * @var StoreManagerInterface
48
48
*/
49
49
private $ storeManager ;
50
50
51
51
/**
52
- * @var StoreWebsiteRelationInterface $storeWebsiteRelation
52
+ * @var ProductScopeRewriteGenerator
53
53
*/
54
- private $ storeWebsiteRelation ;
55
-
56
- /**
57
- * @var ProductRepository $productRepository
58
- */
59
- private $ productRepository ;
54
+ private $ productScopeRewriteGenerator ;
60
55
61
56
/**
62
- * @var ProductScopeRewriteGenerator $productScopeRewriteGenerator
57
+ * @var DeleteEntitiesFromStores
63
58
*/
64
- private $ productScopeRewriteGenerator ;
59
+ private $ deleteEntitiesFromStores ;
65
60
66
61
/**
67
- * @var DeleteEntitiesFromStores $deleteEntitiesFromStores
62
+ * @var Collection
68
63
*/
69
- private $ deleteEntitiesFromStores ;
64
+ private $ productCollection ;
70
65
71
66
/**
72
67
* @param ProductUrlRewriteGenerator $productUrlRewriteGenerator
73
68
* @param UrlPersistInterface $urlPersist
74
69
* @param ProductUrlPathGenerator $productUrlPathGenerator
75
70
* @param StoreManagerInterface $storeManager
76
- * @param StoreWebsiteRelationInterface $storeWebsiteRelation
77
- * @param ProductRepository $productRepository
78
71
* @param ProductScopeRewriteGenerator $productScopeRewriteGenerator
79
72
* @param DeleteEntitiesFromStores $deleteEntitiesFromStores
73
+ * @param Collection $productCollection
80
74
*/
81
75
public function __construct (
82
76
ProductUrlRewriteGenerator $ productUrlRewriteGenerator ,
83
77
UrlPersistInterface $ urlPersist ,
84
78
ProductUrlPathGenerator $ productUrlPathGenerator ,
85
79
StoreManagerInterface $ storeManager ,
86
- StoreWebsiteRelationInterface $ storeWebsiteRelation ,
87
- ProductRepository $ productRepository ,
88
80
ProductScopeRewriteGenerator $ productScopeRewriteGenerator ,
89
- DeleteEntitiesFromStores $ deleteEntitiesFromStores
81
+ DeleteEntitiesFromStores $ deleteEntitiesFromStores ,
82
+ Collection $ productCollection
90
83
) {
91
84
$ this ->productUrlRewriteGenerator = $ productUrlRewriteGenerator ;
92
85
$ this ->urlPersist = $ urlPersist ;
93
86
$ this ->productUrlPathGenerator = $ productUrlPathGenerator ;
94
87
$ this ->storeManager = $ storeManager ;
95
- $ this ->storeWebsiteRelation = $ storeWebsiteRelation ;
96
- $ this ->productRepository = $ productRepository ;
97
88
$ this ->productScopeRewriteGenerator = $ productScopeRewriteGenerator ;
98
89
$ this ->deleteEntitiesFromStores = $ deleteEntitiesFromStores ;
90
+ $ this ->productCollection = $ productCollection ;
99
91
}
100
92
101
93
/**
@@ -104,8 +96,6 @@ public function __construct(
104
96
* @param Observer $observer
105
97
* @return void
106
98
* @throws UrlAlreadyExistsException
107
- * @throws NoSuchEntityException
108
- * @SuppressWarnings(PHPMD.CyclomaticComplexity)
109
99
*/
110
100
public function execute (Observer $ observer )
111
101
{
@@ -125,29 +115,31 @@ public function execute(Observer $observer)
125
115
}
126
116
127
117
$ storeIdsToRemove = [];
118
+ $ productWebsiteMap = array_flip ($ product ->getWebsiteIds ());
119
+ $ storeVisibilities = $ this ->productCollection ->getAllAttributeValues (ProductInterface::VISIBILITY );
128
120
if ($ this ->productScopeRewriteGenerator ->isGlobalScope ($ product ->getStoreId ())) {
129
121
//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 ;
144
133
}
145
134
}
146
135
} else {
147
136
//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 ;
151
143
}
152
144
}
153
145
if (count ($ storeIdsToRemove )) {
0 commit comments