Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
ProcessSourceItemsObserver.php
Go to the documentation of this file.
1 <?php
6 declare(strict_types=1);
7 
9 
14 use Magento\Framework\Api\SearchCriteriaBuilderFactory;
22 
30 {
34  private $isSourceItemManagementAllowedForProductType;
35 
39  private $sourceItemsProcessor;
40 
44  private $isSingleSourceMode;
45 
49  private $defaultSourceProvider;
50 
54  private $searchCriteriaBuilderFactory;
55 
59  private $sourceItemRepository;
60 
69  public function __construct(
70  IsSourceItemManagementAllowedForProductTypeInterface $isSourceItemManagementAllowedForProductType,
71  SourceItemsProcessor $sourceItemsProcessor,
72  IsSingleSourceModeInterface $isSingleSourceMode,
73  DefaultSourceProviderInterface $defaultSourceProvider,
74  SearchCriteriaBuilderFactory $searchCriteriaBuilderFactory,
75  SourceItemRepositoryInterface $sourceItemRepository
76  ) {
77  $this->isSourceItemManagementAllowedForProductType = $isSourceItemManagementAllowedForProductType;
78  $this->sourceItemsProcessor = $sourceItemsProcessor;
79  $this->isSingleSourceMode = $isSingleSourceMode;
80  $this->defaultSourceProvider = $defaultSourceProvider;
81  $this->searchCriteriaBuilderFactory = $searchCriteriaBuilderFactory;
82  $this->sourceItemRepository = $sourceItemRepository;
83  }
84 
91  public function execute(EventObserver $observer)
92  {
94  $product = $observer->getEvent()->getProduct();
95  if ($this->isSourceItemManagementAllowedForProductType->execute($product->getTypeId()) === false) {
96  return;
97  }
99  $controller = $observer->getEvent()->getController();
100  $productData = $controller->getRequest()->getParam('product', []);
101  $singleSourceData = $productData['quantity_and_stock_status'] ?? [];
102 
103  if (!$this->isSingleSourceMode->execute()) {
104  $sources = $controller->getRequest()->getParam('sources', []);
105  $assignedSources = $sources['assigned_sources'] ?? [];
106  $this->sourceItemsProcessor->process($productData['sku'], $assignedSources);
107  } elseif (!empty($singleSourceData)) {
109  $stockItem = $product->getExtensionAttributes()->getStockItem();
110  $qty = $singleSourceData['qty'] ?? (empty($stockItem) ? 0 : $stockItem->getQty());
111  $isInStock = $singleSourceData['is_in_stock'] ?? (empty($stockItem) ? 1 : (int)$stockItem->getIsInStock());
112  $defaultSourceData = [
114  SourceItemInterface::SOURCE_CODE => $this->defaultSourceProvider->getCode(),
116  SourceItemInterface::STATUS => $isInStock
117  ];
118  $sourceItems = $this->getSourceItemsWithoutDefault($productData['sku']);
119  $sourceItems[] = $defaultSourceData;
120  $this->sourceItemsProcessor->process($productData['sku'], $sourceItems);
121  }
122  }
123 
130  private function getSourceItemsWithoutDefault(string $sku): array
131  {
133  $searchCriteriaBuilder = $this->searchCriteriaBuilderFactory->create();
135  ->addFilter(SourceItemInterface::SKU, $sku)
136  ->addFilter(SourceItemInterface::SOURCE_CODE, $this->defaultSourceProvider->getCode(), 'neq')
137  ->create();
138  $sourceItems = $this->sourceItemRepository->getList($searchCriteria)->getItems();
139 
140  $sourceItemData = [];
141  if ($sourceItems) {
142  foreach ($sourceItems as $sourceItem) {
143  $sourceItemData[] = [
145  SourceItemInterface::SOURCE_CODE => $sourceItem->getSourceCode(),
146  SourceItemInterface::QUANTITY => $sourceItem->getQuantity(),
148  ];
149  }
150  }
151  return $sourceItemData;
152  }
153 }
elseif(isset( $params[ 'redirect_parent']))
Definition: iframe.phtml:17
$searchCriteria
$sourceItems
$productData
$searchCriteriaBuilder
__construct(IsSourceItemManagementAllowedForProductTypeInterface $isSourceItemManagementAllowedForProductType, SourceItemsProcessor $sourceItemsProcessor, IsSingleSourceModeInterface $isSingleSourceMode, DefaultSourceProviderInterface $defaultSourceProvider, SearchCriteriaBuilderFactory $searchCriteriaBuilderFactory, SourceItemRepositoryInterface $sourceItemRepository)
$controller
Definition: info.phtml:14
$sourceItemRepository