ProductProcessUrlRewriteSavingObserver.php 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\CatalogUrlRewrite\Observer;
  7. use Magento\Catalog\Model\Product;
  8. use Magento\CatalogUrlRewrite\Model\ProductUrlPathGenerator;
  9. use Magento\CatalogUrlRewrite\Model\ProductUrlRewriteGenerator;
  10. use Magento\Framework\App\ObjectManager;
  11. use Magento\UrlRewrite\Model\UrlPersistInterface;
  12. use Magento\Framework\Event\ObserverInterface;
  13. /**
  14. * Class ProductProcessUrlRewriteSavingObserver
  15. */
  16. class ProductProcessUrlRewriteSavingObserver implements ObserverInterface
  17. {
  18. /**
  19. * @var ProductUrlRewriteGenerator
  20. */
  21. private $productUrlRewriteGenerator;
  22. /**
  23. * @var UrlPersistInterface
  24. */
  25. private $urlPersist;
  26. /**
  27. * @var ProductUrlPathGenerator
  28. */
  29. private $productUrlPathGenerator;
  30. /**
  31. * @param ProductUrlRewriteGenerator $productUrlRewriteGenerator
  32. * @param UrlPersistInterface $urlPersist
  33. * @param ProductUrlPathGenerator|null $productUrlPathGenerator
  34. */
  35. public function __construct(
  36. ProductUrlRewriteGenerator $productUrlRewriteGenerator,
  37. UrlPersistInterface $urlPersist,
  38. ProductUrlPathGenerator $productUrlPathGenerator = null
  39. ) {
  40. $this->productUrlRewriteGenerator = $productUrlRewriteGenerator;
  41. $this->urlPersist = $urlPersist;
  42. $this->productUrlPathGenerator = $productUrlPathGenerator ?: ObjectManager::getInstance()
  43. ->get(ProductUrlPathGenerator::class);
  44. }
  45. /**
  46. * Generate urls for UrlRewrite and save it in storage
  47. *
  48. * @param \Magento\Framework\Event\Observer $observer
  49. * @return void
  50. * @throws \Magento\UrlRewrite\Model\Exception\UrlAlreadyExistsException
  51. */
  52. public function execute(\Magento\Framework\Event\Observer $observer)
  53. {
  54. /** @var Product $product */
  55. $product = $observer->getEvent()->getProduct();
  56. if ($product->dataHasChangedFor('url_key')
  57. || $product->getIsChangedCategories()
  58. || $product->getIsChangedWebsites()
  59. || $product->dataHasChangedFor('visibility')
  60. ) {
  61. if ($product->isVisibleInSiteVisibility()) {
  62. $product->unsUrlPath();
  63. $product->setUrlPath($this->productUrlPathGenerator->getUrlPath($product));
  64. $this->urlPersist->replace($this->productUrlRewriteGenerator->generate($product));
  65. }
  66. }
  67. }
  68. }