Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
ProductScopeRewriteGenerator.php
Go to the documentation of this file.
1 <?php
7 
19 use Magento\UrlRewrite\Model\MergeDataProviderFactory;
20 
26 {
30  private $storeViewService;
31 
35  private $storeManager;
36 
40  private $objectRegistryFactory;
41 
45  private $anchorUrlRewriteGenerator;
46 
50  private $currentUrlRewritesRegenerator;
51 
55  private $categoriesUrlRewriteGenerator;
56 
60  private $canonicalUrlRewriteGenerator;
61 
65  private $mergeDataProviderPrototype;
66 
70  private $categoryRepository;
71 
83  public function __construct(
84  StoreViewService $storeViewService,
85  StoreManagerInterface $storeManager,
86  ObjectRegistryFactory $objectRegistryFactory,
87  CanonicalUrlRewriteGenerator $canonicalUrlRewriteGenerator,
88  CategoriesUrlRewriteGenerator $categoriesUrlRewriteGenerator,
89  CurrentUrlRewritesRegenerator $currentUrlRewritesRegenerator,
90  AnchorUrlRewriteGenerator $anchorUrlRewriteGenerator,
91  MergeDataProviderFactory $mergeDataProviderFactory = null,
92  CategoryRepositoryInterface $categoryRepository = null
93  ) {
94  $this->storeViewService = $storeViewService;
95  $this->storeManager = $storeManager;
96  $this->objectRegistryFactory = $objectRegistryFactory;
97  $this->canonicalUrlRewriteGenerator = $canonicalUrlRewriteGenerator;
98  $this->categoriesUrlRewriteGenerator = $categoriesUrlRewriteGenerator;
99  $this->currentUrlRewritesRegenerator = $currentUrlRewritesRegenerator;
100  $this->anchorUrlRewriteGenerator = $anchorUrlRewriteGenerator;
101  if (!isset($mergeDataProviderFactory)) {
102  $mergeDataProviderFactory = ObjectManager::getInstance()->get(MergeDataProviderFactory::class);
103  }
104  $this->mergeDataProviderPrototype = $mergeDataProviderFactory->create();
105  $this->categoryRepository = $categoryRepository ?:
106  ObjectManager::getInstance()->get(CategoryRepositoryInterface::class);
107  }
108 
115  public function isGlobalScope($storeId)
116  {
117  return null === $storeId || $storeId == Store::DEFAULT_STORE_ID;
118  }
119 
128  public function generateForGlobalScope($productCategories, Product $product, $rootCategoryId = null)
129  {
130  $productId = $product->getEntityId();
131  $mergeDataProvider = clone $this->mergeDataProviderPrototype;
132 
133  foreach ($product->getStoreIds() as $id) {
134  if (!$this->isGlobalScope($id) &&
135  !$this->storeViewService->doesEntityHaveOverriddenUrlKeyForStore(
136  $id,
137  $productId,
139  )) {
140  $mergeDataProvider->merge(
141  $this->generateForSpecificStoreView($id, $productCategories, $product, $rootCategoryId)
142  );
143  }
144  }
145 
146  return $mergeDataProvider->getData();
147  }
148 
158  public function generateForSpecificStoreView($storeId, $productCategories, Product $product, $rootCategoryId = null)
159  {
160  $mergeDataProvider = clone $this->mergeDataProviderPrototype;
161  $categories = [];
162  foreach ($productCategories as $category) {
163  if (!$this->isCategoryProperForGenerating($category, $storeId)) {
164  continue;
165  }
166 
167  // category should be loaded per appropriate store if category's URL key has been changed
168  $categories[] = $this->getCategoryWithOverriddenUrlKey($storeId, $category);
169  }
170 
171  $productCategories = $this->objectRegistryFactory->create(['entities' => $categories]);
172 
173  $mergeDataProvider->merge(
174  $this->canonicalUrlRewriteGenerator->generate($storeId, $product)
175  );
176  $mergeDataProvider->merge(
177  $this->categoriesUrlRewriteGenerator->generate($storeId, $product, $productCategories)
178  );
179  $mergeDataProvider->merge(
180  $this->currentUrlRewritesRegenerator->generate(
181  $storeId,
182  $product,
183  $productCategories,
185  )
186  );
187  $mergeDataProvider->merge(
188  $this->anchorUrlRewriteGenerator->generate($storeId, $product, $productCategories)
189  );
190  $mergeDataProvider->merge(
191  $this->currentUrlRewritesRegenerator->generateAnchor(
192  $storeId,
193  $product,
194  $productCategories,
196  )
197  );
198  return $mergeDataProvider->getData();
199  }
200 
209  {
210  $parentIds = $category->getParentIds();
211  if (is_array($parentIds) && count($parentIds) >= 2) {
212  $rootCategoryId = $parentIds[1];
213  return $rootCategoryId == $this->storeManager->getStore($storeId)->getRootCategoryId();
214  }
215  return false;
216  }
217 
226  private function getCategoryWithOverriddenUrlKey($storeId, Category $category)
227  {
228  $isUrlKeyOverridden = $this->storeViewService->doesEntityHaveOverriddenUrlKeyForStore(
229  $storeId,
230  $category->getEntityId(),
232  );
233 
234  if (!$isUrlKeyOverridden) {
235  return $category;
236  }
237  return $this->categoryRepository->get($category->getEntityId(), $storeId);
238  }
239 }
$id
Definition: fieldset.phtml:14
generateForGlobalScope($productCategories, Product $product, $rootCategoryId=null)
$storeManager
generateForSpecificStoreView($storeId, $productCategories, Product $product, $rootCategoryId=null)
$categories
__construct(StoreViewService $storeViewService, StoreManagerInterface $storeManager, ObjectRegistryFactory $objectRegistryFactory, CanonicalUrlRewriteGenerator $canonicalUrlRewriteGenerator, CategoriesUrlRewriteGenerator $categoriesUrlRewriteGenerator, CurrentUrlRewritesRegenerator $currentUrlRewritesRegenerator, AnchorUrlRewriteGenerator $anchorUrlRewriteGenerator, MergeDataProviderFactory $mergeDataProviderFactory=null, CategoryRepositoryInterface $categoryRepository=null)