ReindexQuoteInventoryObserver.php 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\CatalogInventory\Observer;
  7. use Magento\Framework\Event\Observer as EventObserver;
  8. use Magento\Framework\Event\ObserverInterface;
  9. class ReindexQuoteInventoryObserver implements ObserverInterface
  10. {
  11. /**
  12. * @var \Magento\CatalogInventory\Model\Indexer\Stock\Processor
  13. */
  14. protected $stockIndexerProcessor;
  15. /**
  16. * @var \Magento\Catalog\Model\Indexer\Product\Price\Processor
  17. */
  18. protected $priceIndexer;
  19. /**
  20. * @var \Magento\CatalogInventory\Observer\ItemsForReindex
  21. */
  22. protected $itemsForReindex;
  23. /**
  24. * @param \Magento\CatalogInventory\Model\Indexer\Stock\Processor $stockIndexerProcessor
  25. * @param \Magento\Catalog\Model\Indexer\Product\Price\Processor $priceIndexer
  26. * @param ItemsForReindex $itemsForReindex
  27. */
  28. public function __construct(
  29. \Magento\CatalogInventory\Model\Indexer\Stock\Processor $stockIndexerProcessor,
  30. \Magento\Catalog\Model\Indexer\Product\Price\Processor $priceIndexer,
  31. ItemsForReindex $itemsForReindex
  32. ) {
  33. $this->stockIndexerProcessor = $stockIndexerProcessor;
  34. $this->priceIndexer = $priceIndexer;
  35. $this->itemsForReindex = $itemsForReindex;
  36. }
  37. /**
  38. * Refresh stock index for specific stock items after successful order placement
  39. *
  40. * @param EventObserver $observer
  41. * @return void
  42. */
  43. public function execute(EventObserver $observer)
  44. {
  45. // Reindex quote ids
  46. $quote = $observer->getEvent()->getQuote();
  47. $productIds = [];
  48. foreach ($quote->getAllItems() as $item) {
  49. $productIds[$item->getProductId()] = $item->getProductId();
  50. $children = $item->getChildrenItems();
  51. if ($children) {
  52. foreach ($children as $childItem) {
  53. $productIds[$childItem->getProductId()] = $childItem->getProductId();
  54. }
  55. }
  56. }
  57. if ($productIds) {
  58. $this->stockIndexerProcessor->reindexList($productIds);
  59. }
  60. // Reindex previously remembered items
  61. $productIds = [];
  62. foreach ($this->itemsForReindex->getItems() as $item) {
  63. $item->save();
  64. $productIds[] = $item->getProductId();
  65. }
  66. if (!empty($productIds)) {
  67. $this->priceIndexer->reindexList($productIds);
  68. }
  69. $this->itemsForReindex->clear();
  70. // Clear list of remembered items - we don't need it anymore
  71. }
  72. }