Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
CategoryUrlRewriteGenerator.php
Go to the documentation of this file.
1 <?php
7 
16 use Magento\UrlRewrite\Model\MergeDataProviderFactory;
17 
19 {
21  const ENTITY_TYPE = 'category';
22 
26  protected $storeViewService;
27 
32  protected $category;
33 
38 
43 
48 
52  private $mergeDataProviderPrototype;
53 
57  protected $overrideStoreUrls;
58 
67  public function __construct(
73  MergeDataProviderFactory $mergeDataProviderFactory = null
74  ) {
75  $this->storeViewService = $storeViewService;
76  $this->canonicalUrlRewriteGenerator = $canonicalUrlRewriteGenerator;
77  $this->childrenUrlRewriteGenerator = $childrenUrlRewriteGenerator;
78  $this->currentUrlRewritesRegenerator = $currentUrlRewritesRegenerator;
79  $this->categoryRepository = $categoryRepository;
80  if (!isset($mergeDataProviderFactory)) {
81  $mergeDataProviderFactory = ObjectManager::getInstance()->get(MergeDataProviderFactory::class);
82  }
83  $this->mergeDataProviderPrototype = $mergeDataProviderFactory->create();
84  }
85 
92  public function generate($category, $overrideStoreUrls = false, $rootCategoryId = null)
93  {
94  if ($rootCategoryId === null) {
95  $rootCategoryId = $category->getEntityId();
96  }
97 
98  $storeId = $category->getStoreId();
99  $urls = $this->isGlobalScope($storeId)
102 
103  return $urls;
104  }
105 
114  protected function generateForGlobalScope(
115  Category $category = null,
116  $overrideStoreUrls = false,
117  $rootCategoryId = null
118  ) {
119  $mergeDataProvider = clone $this->mergeDataProviderPrototype;
120  $categoryId = $category->getId();
121  foreach ($category->getStoreIds() as $storeId) {
122  if (!$this->isGlobalScope($storeId)
123  && $this->isOverrideUrlsForStore($storeId, $categoryId, $overrideStoreUrls)
124  ) {
126  $mergeDataProvider->merge($this->generateForSpecificStoreView($storeId, $category, $rootCategoryId));
127  }
128  }
129  $result = $mergeDataProvider->getData();
130  return $result;
131  }
132 
139  protected function isOverrideUrlsForStore($storeId, $categoryId, $overrideStoreUrls = false)
140  {
141  return $overrideStoreUrls || !$this->storeViewService->doesEntityHaveOverriddenUrlKeyForStore(
142  $storeId,
143  $categoryId,
145  );
146  }
147 
156  {
157  $categoryFromRepository = $this->categoryRepository->get($category->getId(), $storeId);
158  $category->addData(
159  [
160  'url_key' => $categoryFromRepository->getUrlKey(),
161  'url_path' => $categoryFromRepository->getUrlPath()
162  ]
163  );
164  }
165 
172  protected function isGlobalScope($storeId)
173  {
174  return null === $storeId || $storeId == Store::DEFAULT_STORE_ID;
175  }
176 
186  {
187  $mergeDataProvider = clone $this->mergeDataProviderPrototype;
188  $mergeDataProvider->merge(
189  $this->canonicalUrlRewriteGenerator->generate($storeId, $category)
190  );
191  $mergeDataProvider->merge(
192  $this->childrenUrlRewriteGenerator->generate($storeId, $category, $rootCategoryId)
193  );
194  $mergeDataProvider->merge(
195  $this->currentUrlRewritesRegenerator->generate($storeId, $category, $rootCategoryId)
196  );
197  return $mergeDataProvider->getData();
198  }
199 }
__construct(CanonicalUrlRewriteGenerator $canonicalUrlRewriteGenerator, CurrentUrlRewritesRegenerator $currentUrlRewritesRegenerator, ChildrenUrlRewriteGenerator $childrenUrlRewriteGenerator, StoreViewService $storeViewService, CategoryRepositoryInterface $categoryRepository, MergeDataProviderFactory $mergeDataProviderFactory=null)
generateForGlobalScope(Category $category=null, $overrideStoreUrls=false, $rootCategoryId=null)
generate($category, $overrideStoreUrls=false, $rootCategoryId=null)
isOverrideUrlsForStore($storeId, $categoryId, $overrideStoreUrls=false)
generateForSpecificStoreView($storeId, Category $category=null, $rootCategoryId=null)