5
5
*/
6
6
namespace Magento \CatalogUrlRewrite \Model ;
7
7
8
+ use Magento \Catalog \Api \CategoryRepositoryInterface ;
8
9
use Magento \Catalog \Model \Category ;
9
10
use Magento \Catalog \Model \Product ;
11
+ use Magento \CatalogUrlRewrite \Model \Product \AnchorUrlRewriteGenerator ;
10
12
use Magento \CatalogUrlRewrite \Model \Product \CanonicalUrlRewriteGenerator ;
11
13
use Magento \CatalogUrlRewrite \Model \Product \CategoriesUrlRewriteGenerator ;
12
14
use Magento \CatalogUrlRewrite \Model \Product \CurrentUrlRewritesRegenerator ;
13
- use Magento \CatalogUrlRewrite \Model \Product \AnchorUrlRewriteGenerator ;
14
15
use Magento \CatalogUrlRewrite \Service \V1 \StoreViewService ;
16
+ use Magento \Framework \App \ObjectManager ;
15
17
use Magento \Store \Model \Store ;
16
18
use Magento \Store \Model \StoreManagerInterface ;
17
19
use Magento \UrlRewrite \Model \MergeDataProviderFactory ;
18
- use Magento \Framework \App \ObjectManager ;
19
20
20
21
/**
21
22
* Class ProductScopeRewriteGenerator
@@ -63,6 +64,11 @@ class ProductScopeRewriteGenerator
63
64
*/
64
65
private $ mergeDataProviderPrototype ;
65
66
67
+ /**
68
+ * @var CategoryRepositoryInterface
69
+ */
70
+ private $ categoryRepository ;
71
+
66
72
/**
67
73
* @param StoreViewService $storeViewService
68
74
* @param StoreManagerInterface $storeManager
@@ -72,6 +78,7 @@ class ProductScopeRewriteGenerator
72
78
* @param CurrentUrlRewritesRegenerator $currentUrlRewritesRegenerator
73
79
* @param AnchorUrlRewriteGenerator $anchorUrlRewriteGenerator
74
80
* @param \Magento\UrlRewrite\Model\MergeDataProviderFactory|null $mergeDataProviderFactory
81
+ * @param CategoryRepositoryInterface|null $categoryRepository
75
82
*/
76
83
public function __construct (
77
84
StoreViewService $ storeViewService ,
@@ -81,7 +88,8 @@ public function __construct(
81
88
CategoriesUrlRewriteGenerator $ categoriesUrlRewriteGenerator ,
82
89
CurrentUrlRewritesRegenerator $ currentUrlRewritesRegenerator ,
83
90
AnchorUrlRewriteGenerator $ anchorUrlRewriteGenerator ,
84
- MergeDataProviderFactory $ mergeDataProviderFactory = null
91
+ MergeDataProviderFactory $ mergeDataProviderFactory = null ,
92
+ CategoryRepositoryInterface $ categoryRepository = null
85
93
) {
86
94
$ this ->storeViewService = $ storeViewService ;
87
95
$ this ->storeManager = $ storeManager ;
@@ -94,6 +102,8 @@ public function __construct(
94
102
$ mergeDataProviderFactory = ObjectManager::getInstance ()->get (MergeDataProviderFactory::class);
95
103
}
96
104
$ this ->mergeDataProviderPrototype = $ mergeDataProviderFactory ->create ();
105
+ $ this ->categoryRepository = $ categoryRepository ?:
106
+ ObjectManager::getInstance ()->get (CategoryRepositoryInterface::class);
97
107
}
98
108
99
109
/**
@@ -150,10 +160,14 @@ public function generateForSpecificStoreView($storeId, $productCategories, Produ
150
160
$ mergeDataProvider = clone $ this ->mergeDataProviderPrototype ;
151
161
$ categories = [];
152
162
foreach ($ productCategories as $ category ) {
153
- if ($ this ->isCategoryProperForGenerating ($ category , $ storeId )) {
154
- $ categories [] = $ category ;
163
+ if (! $ this ->isCategoryProperForGenerating ($ category , $ storeId )) {
164
+ continue ;
155
165
}
166
+
167
+ // category should be loaded per appropriate store if category's URL key has been changed
168
+ $ categories [] = $ this ->getCategoryWithOverriddenUrlKey ($ storeId , $ category );
156
169
}
170
+
157
171
$ productCategories = $ this ->objectRegistryFactory ->create (['entities ' => $ categories ]);
158
172
159
173
$ mergeDataProvider ->merge (
@@ -199,4 +213,26 @@ public function isCategoryProperForGenerating(Category $category, $storeId)
199
213
}
200
214
return false ;
201
215
}
216
+
217
+ /**
218
+ * Checks if URL key has been changed for provided category and returns reloaded category,
219
+ * in other case - returns provided category.
220
+ *
221
+ * @param $storeId
222
+ * @param Category $category
223
+ * @return Category
224
+ */
225
+ private function getCategoryWithOverriddenUrlKey ($ storeId , Category $ category )
226
+ {
227
+ $ isUrlKeyOverridden = $ this ->storeViewService ->doesEntityHaveOverriddenUrlKeyForStore (
228
+ $ storeId ,
229
+ $ category ->getEntityId (),
230
+ Category::ENTITY
231
+ );
232
+
233
+ if (!$ isUrlKeyOverridden ) {
234
+ return $ category ;
235
+ }
236
+ return $ this ->categoryRepository ->get ($ category ->getEntityId (), $ storeId );
237
+ }
202
238
}
0 commit comments