Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
CurrentUrlRewritesRegenerator.php
Go to the documentation of this file.
1 <?php
7 
17 use Magento\UrlRewrite\Service\V1\Data\UrlRewriteFactory;
20 use Magento\UrlRewrite\Model\MergeDataProviderFactory;
21 
26 {
31  protected $product;
32 
37  protected $productCategories;
38 
43  protected $urlFinder;
44 
49 
53  protected $urlRewriteFactory;
54 
58  private $urlRewritePrototype;
59 
63  private $urlRewriteFinder;
64 
68  private $mergeDataProviderPrototype;
69 
73  private $categoryRepository;
74 
83  public function __construct(
86  UrlRewriteFactory $urlRewriteFactory,
87  UrlRewriteFinder $urlRewriteFinder = null,
88  MergeDataProviderFactory $mergeDataProviderFactory = null,
89  CategoryRepository $categoryRepository = null
90  ) {
91  $this->urlFinder = $urlFinder;
92  $this->productUrlPathGenerator = $productUrlPathGenerator;
93  $this->urlRewriteFactory = $urlRewriteFactory;
94  $this->urlRewritePrototype = $urlRewriteFactory->create();
95  $this->urlRewriteFinder = $urlRewriteFinder ?: ObjectManager::getInstance()->get(UrlRewriteFinder::class);
96  if (!isset($mergeDataProviderFactory)) {
97  $mergeDataProviderFactory = ObjectManager::getInstance()->get(MergeDataProviderFactory::class);
98  }
99  $this->categoryRepository = $categoryRepository ?: ObjectManager::getInstance()->get(CategoryRepository::class);
100  $this->mergeDataProviderPrototype = $mergeDataProviderFactory->create();
101  }
102 
113  {
114  $mergeDataProvider = clone $this->mergeDataProviderPrototype;
115  $currentUrlRewrites = $this->urlRewriteFinder->findAllByData(
116  $product->getEntityId(),
117  $storeId,
120  );
121 
122  foreach ($currentUrlRewrites as $currentUrlRewrite) {
123  $category = $this->retrieveCategoryFromMetadata($currentUrlRewrite, $productCategories);
124  if ($category === false) {
125  continue;
126  }
127  $mergeDataProvider->merge(
128  $currentUrlRewrite->getIsAutogenerated()
129  ? $this->generateForAutogenerated($currentUrlRewrite, $storeId, $category, $product)
130  : $this->generateForCustom($currentUrlRewrite, $storeId, $category, $product)
131  );
132  }
133 
134  return $mergeDataProvider->getData();
135  }
136 
146  public function generateAnchor(
147  $storeId,
150  $rootCategoryId = null
151  ) {
152  $anchorCategoryIds = [];
153  $mergeDataProvider = clone $this->mergeDataProviderPrototype;
154 
155  $currentUrlRewrites = $this->urlRewriteFinder->findAllByData(
156  $product->getEntityId(),
157  $storeId,
160  );
161 
162  foreach ($productCategories->getList() as $productCategory) {
163  $anchorCategoryIds = array_merge($productCategory->getAnchorsAbove(), $anchorCategoryIds);
164  }
165 
166  foreach ($currentUrlRewrites as $currentUrlRewrite) {
167  $metadata = $currentUrlRewrite->getMetadata();
168  if (isset($metadata['category_id']) && $metadata['category_id'] > 0) {
169  $category = $this->categoryRepository->get($metadata['category_id'], $storeId);
170  if (in_array($category->getId(), $anchorCategoryIds)) {
171  $mergeDataProvider->merge(
172  $currentUrlRewrite->getIsAutogenerated()
173  ? $this->generateForAutogenerated($currentUrlRewrite, $storeId, $category, $product)
174  : $this->generateForCustom($currentUrlRewrite, $storeId, $category, $product)
175  );
176  }
177  }
178  }
179 
180  return $mergeDataProvider->getData();
181  }
182 
191  {
192  if ($product->getData('save_rewrites_history')) {
193  $targetPath = $this->productUrlPathGenerator->getUrlPathWithSuffix($product, $storeId, $category);
194  if ($url->getRequestPath() !== $targetPath) {
195  $generatedUrl = clone $this->urlRewritePrototype;
196  $generatedUrl->setEntityType(ProductUrlRewriteGenerator::ENTITY_TYPE)
197  ->setEntityId($product->getEntityId())
198  ->setRequestPath($url->getRequestPath())
199  ->setTargetPath($targetPath)
200  ->setRedirectType(OptionProvider::PERMANENT)
201  ->setStoreId($storeId)
202  ->setDescription($url->getDescription())
203  ->setIsAutogenerated(0)
204  ->setMetadata($url->getMetadata());
205  return [$generatedUrl];
206  }
207  }
208  return [];
209  }
210 
218  protected function generateForCustom($url, $storeId, $category, $product = null)
219  {
220  $targetPath = $url->getRedirectType()
221  ? $this->productUrlPathGenerator->getUrlPathWithSuffix($product, $storeId, $category)
222  : $url->getTargetPath();
223  if ($url->getRequestPath() !== $targetPath) {
224  $generatedUrl = clone $this->urlRewritePrototype;
225  $generatedUrl->setEntityType(ProductUrlRewriteGenerator::ENTITY_TYPE)
226  ->setEntityId($product->getEntityId())
227  ->setRequestPath($url->getRequestPath())
228  ->setTargetPath($targetPath)
229  ->setRedirectType($url->getRedirectType())
231  ->setDescription($url->getDescription())
232  ->setIsAutogenerated(0)
233  ->setMetadata($url->getMetadata());
234  return [$generatedUrl];
235  }
236  return [];
237  }
238 
245  {
246  $metadata = $url->getMetadata();
247  if (isset($metadata['category_id'])) {
248  $category = $productCategories->get($metadata['category_id']);
249  return $category === null ? false : $category;
250  }
251  return null;
252  }
253 }
return false
Definition: gallery.phtml:36
__construct(UrlFinderInterface $urlFinder, ProductUrlPathGenerator $productUrlPathGenerator, UrlRewriteFactory $urlRewriteFactory, UrlRewriteFinder $urlRewriteFinder=null, MergeDataProviderFactory $mergeDataProviderFactory=null, CategoryRepository $categoryRepository=null)
generateAnchor( $storeId, Product $product, ObjectRegistry $productCategories, $rootCategoryId=null)
generate($storeId, Product $product, ObjectRegistry $productCategories, $rootCategoryId=null)