|
8 | 8 | namespace Magento\CatalogUrlRewrite\Observer;
|
9 | 9 |
|
10 | 10 | use Magento\Catalog\Api\Data\ProductInterface;
|
11 |
| -use Magento\Catalog\Model\Product\Visibility; |
12 |
| -use Magento\CatalogUrlRewrite\Model\ProductUrlPathGenerator; |
13 |
| -use Magento\CatalogUrlRewrite\Model\ProductUrlRewriteGenerator; |
14 |
| -use Magento\UrlRewrite\Model\Exception\UrlAlreadyExistsException; |
15 |
| -use Magento\UrlRewrite\Model\UrlPersistInterface; |
16 |
| -use Magento\UrlRewrite\Service\V1\Data\UrlRewrite; |
17 |
| -use Magento\Catalog\Model\ResourceModel\Product\CollectionFactory; |
| 11 | +use Magento\CatalogUrlRewrite\Model\Products\AdaptUrlRewritesToVisibilityAttribute; |
18 | 12 | use Magento\Framework\Event\Observer;
|
19 | 13 | use Magento\Framework\Event\ObserverInterface;
|
| 14 | +use Magento\UrlRewrite\Model\Exception\UrlAlreadyExistsException; |
20 | 15 |
|
21 | 16 | /**
|
22 |
| - * Class ProductProcessUrlRewriteSavingObserver |
| 17 | + * Consider URL rewrites on change product visibility via mass action |
23 | 18 | */
|
24 | 19 | class ProcessUrlRewriteOnChangeProductVisibilityObserver implements ObserverInterface
|
25 | 20 | {
|
26 | 21 | /**
|
27 |
| - * @var CollectionFactory |
28 |
| - */ |
29 |
| - private $productCollectionFactory; |
30 |
| - |
31 |
| - /** |
32 |
| - * @var ProductUrlRewriteGenerator |
33 |
| - */ |
34 |
| - private $urlRewriteGenerator; |
35 |
| - |
36 |
| - /** |
37 |
| - * @var UrlPersistInterface |
| 22 | + * @var AdaptUrlRewritesToVisibilityAttribute |
38 | 23 | */
|
39 |
| - private $urlPersist; |
| 24 | + private $adaptUrlRewritesToVisibility; |
40 | 25 |
|
41 | 26 | /**
|
42 |
| - * @var ProductUrlPathGenerator |
| 27 | + * @param AdaptUrlRewritesToVisibilityAttribute $adaptUrlRewritesToVisibility |
43 | 28 | */
|
44 |
| - private $urlPathGenerator; |
45 |
| - |
46 |
| - /** |
47 |
| - * @param CollectionFactory $collectionFactory |
48 |
| - * @param ProductUrlRewriteGenerator $urlRewriteGenerator |
49 |
| - * @param UrlPersistInterface $urlPersist |
50 |
| - * @param ProductUrlPathGenerator|null $urlPathGenerator |
51 |
| - */ |
52 |
| - public function __construct( |
53 |
| - CollectionFactory $collectionFactory, |
54 |
| - ProductUrlRewriteGenerator $urlRewriteGenerator, |
55 |
| - UrlPersistInterface $urlPersist, |
56 |
| - ProductUrlPathGenerator $urlPathGenerator |
57 |
| - ) { |
58 |
| - $this->productCollectionFactory = $collectionFactory; |
59 |
| - $this->urlRewriteGenerator = $urlRewriteGenerator; |
60 |
| - $this->urlPersist = $urlPersist; |
61 |
| - $this->urlPathGenerator = $urlPathGenerator; |
| 29 | + public function __construct(AdaptUrlRewritesToVisibilityAttribute $adaptUrlRewritesToVisibility) |
| 30 | + { |
| 31 | + $this->adaptUrlRewritesToVisibility = $adaptUrlRewritesToVisibility; |
62 | 32 | }
|
63 | 33 |
|
64 | 34 | /**
|
65 | 35 | * Generate urls for UrlRewrites and save it in storage
|
66 | 36 | *
|
67 | 37 | * @param Observer $observer
|
68 |
| - * @return array |
| 38 | + * @return void |
69 | 39 | * @throws UrlAlreadyExistsException
|
70 | 40 | */
|
71 | 41 | public function execute(Observer $observer)
|
72 | 42 | {
|
73 | 43 | $event = $observer->getEvent();
|
74 | 44 | $attrData = $event->getAttributesData();
|
75 | 45 | $productIds = $event->getProductIds();
|
76 |
| - $storeId = $event->getStoreId(); |
77 |
| - $visibility = $attrData[ProductInterface::VISIBILITY] ?? null; |
78 |
| - |
79 |
| - if (!$visibility) { |
80 |
| - return [$attrData, $productIds, $storeId]; |
81 |
| - } |
82 |
| - |
83 |
| - $productCollection = $this->productCollectionFactory->create(); |
84 |
| - $productCollection->addAttributeToSelect(ProductInterface::VISIBILITY); |
85 |
| - $productCollection->addAttributeToSelect('url_key'); |
86 |
| - $productCollection->addFieldToFilter( |
87 |
| - 'entity_id', |
88 |
| - ['in' => array_unique($productIds)] |
89 |
| - ); |
| 46 | + $visibility = $attrData[ProductInterface::VISIBILITY] ?? 0; |
90 | 47 |
|
91 |
| - foreach ($productCollection as $product) { |
92 |
| - if ($visibility == Visibility::VISIBILITY_NOT_VISIBLE) { |
93 |
| - $this->urlPersist->deleteByData( |
94 |
| - [ |
95 |
| - UrlRewrite::ENTITY_ID => $product->getId(), |
96 |
| - UrlRewrite::ENTITY_TYPE => ProductUrlRewriteGenerator::ENTITY_TYPE, |
97 |
| - ] |
98 |
| - ); |
99 |
| - } elseif ($visibility !== Visibility::VISIBILITY_NOT_VISIBLE) { |
100 |
| - $product->setVisibility($visibility); |
101 |
| - $productUrlPath = $this->urlPathGenerator->getUrlPath($product); |
102 |
| - $productUrlRewrite = $this->urlRewriteGenerator->generate($product); |
103 |
| - $product->unsUrlPath(); |
104 |
| - $product->setUrlPath($productUrlPath); |
105 |
| - $this->urlPersist->replace($productUrlRewrite); |
106 |
| - } |
| 48 | + if (!$visibility || !$productIds) { |
| 49 | + return; |
107 | 50 | }
|
108 | 51 |
|
109 |
| - return [$attrData, $productIds, $storeId]; |
| 52 | + $this->adaptUrlRewritesToVisibility->execute($productIds, $visibility); |
110 | 53 | }
|
111 | 54 | }
|
0 commit comments