Save.php 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  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\InventoryAdminUi\Controller\Adminhtml\Source;
  8. use Exception;
  9. use Magento\Backend\App\Action;
  10. use Magento\Backend\App\Action\Context;
  11. use Magento\Framework\Controller\Result\Redirect;
  12. use Magento\Framework\Controller\ResultInterface;
  13. use Magento\Framework\Exception\CouldNotSaveException;
  14. use Magento\Framework\Exception\NoSuchEntityException;
  15. use Magento\Framework\Validation\ValidationException;
  16. use Magento\InventoryApi\Api\Data\SourceInterface;
  17. use Magento\InventoryApi\Api\Data\SourceInterfaceFactory;
  18. use Magento\InventoryApi\Api\SourceRepositoryInterface;
  19. use Magento\InventoryAdminUi\Model\Source\SourceHydrator;
  20. use Magento\Framework\App\Action\HttpPostActionInterface;
  21. /**
  22. * Save Controller
  23. */
  24. class Save extends Action implements HttpPostActionInterface
  25. {
  26. /**
  27. * @see _isAllowed()
  28. */
  29. const ADMIN_RESOURCE = 'Magento_InventoryApi::source';
  30. /**
  31. * @var SourceInterfaceFactory
  32. */
  33. private $sourceFactory;
  34. /**
  35. * @var SourceRepositoryInterface
  36. */
  37. private $sourceRepository;
  38. /**
  39. * @var SourceHydrator
  40. */
  41. private $sourceHydrator;
  42. /**
  43. * @param Context $context
  44. * @param SourceInterfaceFactory $sourceFactory
  45. * @param SourceRepositoryInterface $sourceRepository
  46. * @param SourceHydrator $sourceHydrator
  47. */
  48. public function __construct(
  49. Context $context,
  50. SourceInterfaceFactory $sourceFactory,
  51. SourceRepositoryInterface $sourceRepository,
  52. SourceHydrator $sourceHydrator
  53. ) {
  54. parent::__construct($context);
  55. $this->sourceFactory = $sourceFactory;
  56. $this->sourceRepository = $sourceRepository;
  57. $this->sourceHydrator = $sourceHydrator;
  58. }
  59. /**
  60. * @inheritdoc
  61. */
  62. public function execute(): ResultInterface
  63. {
  64. $resultRedirect = $this->resultRedirectFactory->create();
  65. $request = $this->getRequest();
  66. $requestData = $request->getPost()->toArray();
  67. if (!$request->isPost() || empty($requestData['general'])) {
  68. $this->messageManager->addErrorMessage(__('Wrong request.'));
  69. $this->processRedirectAfterFailureSave($resultRedirect);
  70. return $resultRedirect;
  71. }
  72. $sourceCodeQueryParam = $request->getQuery(SourceInterface::SOURCE_CODE);
  73. try {
  74. $source = (null !== $sourceCodeQueryParam)
  75. ? $this->sourceRepository->get($sourceCodeQueryParam)
  76. : $this->sourceFactory->create();
  77. $this->processSave($source, $requestData);
  78. $this->messageManager->addSuccessMessage(__('The Source has been saved.'));
  79. $this->processRedirectAfterSuccessSave($resultRedirect, $source->getSourceCode());
  80. } catch (NoSuchEntityException $e) {
  81. $this->messageManager->addErrorMessage(__('The Source does not exist.'));
  82. $this->processRedirectAfterFailureSave($resultRedirect);
  83. } catch (ValidationException $e) {
  84. foreach ($e->getErrors() as $localizedError) {
  85. $this->messageManager->addErrorMessage($localizedError->getMessage());
  86. }
  87. $this->_session->setSourceFormData($requestData);
  88. $this->processRedirectAfterFailureSave($resultRedirect, $sourceCodeQueryParam ?? $sourceCodeQueryParam);
  89. } catch (CouldNotSaveException $e) {
  90. $this->messageManager->addErrorMessage($e->getMessage());
  91. $this->_session->setSourceFormData($requestData);
  92. $this->processRedirectAfterFailureSave($resultRedirect, $sourceCodeQueryParam ?? $sourceCodeQueryParam);
  93. } catch (Exception $e) {
  94. $this->messageManager->addErrorMessage(__('Could not save Source.'));
  95. $this->_session->setSourceFormData($requestData);
  96. $this->processRedirectAfterFailureSave($resultRedirect, $sourceCodeQueryParam ?? $sourceCodeQueryParam);
  97. }
  98. return $resultRedirect;
  99. }
  100. /**
  101. * @param SourceInterface $source
  102. * @param array $requestData
  103. * @return void
  104. */
  105. private function processSave(SourceInterface $source, array $requestData)
  106. {
  107. $source = $this->sourceHydrator->hydrate($source, $requestData);
  108. $this->_eventManager->dispatch(
  109. 'controller_action_inventory_populate_source_with_data',
  110. [
  111. 'request' => $this->getRequest(),
  112. 'source' => $source,
  113. ]
  114. );
  115. $this->sourceRepository->save($source);
  116. $this->_eventManager->dispatch(
  117. 'controller_action_inventory_source_save_after',
  118. [
  119. 'request' => $this->getRequest(),
  120. 'source' => $source,
  121. ]
  122. );
  123. }
  124. /**
  125. * @param Redirect $resultRedirect
  126. * @param string $sourceCode
  127. * @return void
  128. */
  129. private function processRedirectAfterSuccessSave(Redirect $resultRedirect, string $sourceCode)
  130. {
  131. if ($this->getRequest()->getParam('back')) {
  132. $resultRedirect->setPath('*/*/edit', [
  133. SourceInterface::SOURCE_CODE => $sourceCode,
  134. '_current' => true,
  135. ]);
  136. } elseif ($this->getRequest()->getParam('redirect_to_new')) {
  137. $resultRedirect->setPath('*/*/new', [
  138. '_current' => true,
  139. ]);
  140. } else {
  141. $resultRedirect->setPath('*/*/');
  142. }
  143. }
  144. /**
  145. * @param Redirect $resultRedirect
  146. * @param string|null $sourceCode
  147. * @return void
  148. */
  149. private function processRedirectAfterFailureSave(Redirect $resultRedirect, string $sourceCode = null)
  150. {
  151. if (null === $sourceCode) {
  152. $resultRedirect->setPath('*/*/new');
  153. } else {
  154. $resultRedirect->setPath('*/*/edit', [
  155. SourceInterface::SOURCE_CODE => $sourceCode,
  156. '_current' => true,
  157. ]);
  158. }
  159. }
  160. }