PopulateWithWebsiteSalesChannelsObserver.php 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. declare(strict_types=1);
  7. namespace Magento\InventorySales\Observer\Stock;
  8. use Magento\Framework\App\RequestInterface;
  9. use Magento\Framework\Event\ObserverInterface;
  10. use Magento\Framework\Event\Observer as EventObserver;
  11. use Magento\InventoryApi\Api\Data\StockInterface;
  12. use Magento\InventorySalesApi\Api\Data\SalesChannelInterface;
  13. use Magento\InventorySalesApi\Api\Data\SalesChannelInterfaceFactory;
  14. /**
  15. * Populate stock with sales channels during saving via controller
  16. *
  17. * This needs to be handled in dedicated observer, because there is no pre-defined way of making several API calls for
  18. * Form submission handling
  19. */
  20. class PopulateWithWebsiteSalesChannelsObserver implements ObserverInterface
  21. {
  22. /**
  23. * @var SalesChannelInterfaceFactory
  24. */
  25. private $salesChannelFactory;
  26. /**
  27. * @param SalesChannelInterfaceFactory $salesChannelFactory
  28. */
  29. public function __construct(SalesChannelInterfaceFactory $salesChannelFactory)
  30. {
  31. $this->salesChannelFactory = $salesChannelFactory;
  32. }
  33. /**
  34. * Populate stock with sales channels during saving via controller
  35. *
  36. * @param EventObserver $observer
  37. * @return void
  38. */
  39. public function execute(EventObserver $observer)
  40. {
  41. /** @var StockInterface $stock */
  42. $stock = $observer->getEvent()->getStock();
  43. /** @var RequestInterface $request */
  44. $request = $observer->getEvent()->getRequest();
  45. $requestData = $request->getParams();
  46. $extensionAttributes = $stock->getExtensionAttributes();
  47. $assignedSalesChannels = $extensionAttributes->getSalesChannels();
  48. if (null !== $assignedSalesChannels) {
  49. foreach ($assignedSalesChannels as $key => $assignedSalesChannel) {
  50. if ($assignedSalesChannel->getType() === SalesChannelInterface::TYPE_WEBSITE) {
  51. unset($assignedSalesChannels[$key]);
  52. }
  53. }
  54. }
  55. if (isset($requestData['sales_channels'][SalesChannelInterface::TYPE_WEBSITE])
  56. && is_array($requestData['sales_channels'][SalesChannelInterface::TYPE_WEBSITE])
  57. ) {
  58. foreach ($requestData['sales_channels'][SalesChannelInterface::TYPE_WEBSITE] as $websiteCode) {
  59. $assignedSalesChannels[] = $this->createSalesChannelByWebsiteCode($websiteCode);
  60. }
  61. }
  62. $extensionAttributes->setSalesChannels($assignedSalesChannels);
  63. }
  64. /**
  65. * Create the sales channel by given website code
  66. *
  67. * @param string $websiteCode
  68. * @return SalesChannelInterface
  69. */
  70. private function createSalesChannelByWebsiteCode(string $websiteCode): SalesChannelInterface
  71. {
  72. $salesChannel = $this->salesChannelFactory->create();
  73. $salesChannel->setCode($websiteCode);
  74. $salesChannel->setType(SalesChannelInterface::TYPE_WEBSITE);
  75. return $salesChannel;
  76. }
  77. }