Save.php 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  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\Stock;
  8. use Exception;
  9. use Magento\Backend\App\Action;
  10. use Magento\Backend\App\Action\Context;
  11. use Magento\Framework\App\RequestInterface;
  12. use Magento\Framework\Controller\Result\Redirect;
  13. use Magento\Framework\Controller\ResultInterface;
  14. use Magento\Framework\Exception\CouldNotSaveException;
  15. use Magento\Framework\Exception\InputException;
  16. use Magento\Framework\Exception\NoSuchEntityException;
  17. use Magento\Framework\Validation\ValidationException;
  18. use Magento\InventoryApi\Api\Data\StockInterface;
  19. use Magento\InventoryAdminUi\Model\Stock\StockSaveProcessor;
  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::stock';
  30. /**
  31. * @var StockSaveProcessor
  32. */
  33. private $stockSaveProcessor;
  34. /**
  35. * @param Context $context
  36. * @param StockSaveProcessor $stockSaveProcessor
  37. */
  38. public function __construct(
  39. Context $context,
  40. StockSaveProcessor $stockSaveProcessor
  41. ) {
  42. parent::__construct($context);
  43. $this->stockSaveProcessor = $stockSaveProcessor;
  44. }
  45. /**
  46. * @inheritdoc
  47. */
  48. public function execute(): ResultInterface
  49. {
  50. $resultRedirect = $this->resultRedirectFactory->create();
  51. $request = $this->getRequest();
  52. $requestData = $request->getParams();
  53. if (!$request->isPost() || empty($requestData['general'])) {
  54. $this->messageManager->addErrorMessage(__('Wrong request.'));
  55. $this->processRedirectAfterFailureSave($resultRedirect);
  56. return $resultRedirect;
  57. }
  58. return $this->processSave($requestData, $request, $resultRedirect);
  59. }
  60. /**
  61. * @param array $requestData
  62. * @param RequestInterface $request
  63. * @param Redirect $resultRedirect
  64. * @return ResultInterface
  65. */
  66. private function processSave(
  67. array $requestData,
  68. RequestInterface $request,
  69. Redirect $resultRedirect
  70. ): ResultInterface {
  71. try {
  72. $stockId = isset($requestData['general'][StockInterface::STOCK_ID])
  73. ? (int)$requestData['general'][StockInterface::STOCK_ID]
  74. : null;
  75. $stockId = $this->stockSaveProcessor->process($stockId, $request);
  76. $this->messageManager->addSuccessMessage(__('The Stock has been saved.'));
  77. $this->processRedirectAfterSuccessSave($resultRedirect, $stockId);
  78. } catch (NoSuchEntityException $e) {
  79. $this->messageManager->addErrorMessage(__('The Stock does not exist.'));
  80. $this->processRedirectAfterFailureSave($resultRedirect);
  81. } catch (ValidationException $e) {
  82. foreach ($e->getErrors() as $localizedError) {
  83. $this->messageManager->addErrorMessage($localizedError->getMessage());
  84. }
  85. $this->processRedirectAfterFailureSave($resultRedirect, $stockId);
  86. } catch (CouldNotSaveException $e) {
  87. $this->messageManager->addErrorMessage($e->getMessage());
  88. $this->processRedirectAfterFailureSave($resultRedirect, $stockId);
  89. } catch (InputException $e) {
  90. $this->messageManager->addErrorMessage($e->getMessage());
  91. $this->processRedirectAfterFailureSave($resultRedirect, $stockId);
  92. } catch (Exception $e) {
  93. $this->messageManager->addErrorMessage(__('Could not save Stock.'));
  94. $this->processRedirectAfterFailureSave($resultRedirect, $stockId ?? null);
  95. }
  96. return $resultRedirect;
  97. }
  98. /**
  99. * @param Redirect $resultRedirect
  100. * @param int $stockId
  101. *
  102. * @return void
  103. */
  104. private function processRedirectAfterSuccessSave(Redirect $resultRedirect, int $stockId)
  105. {
  106. if ($this->getRequest()->getParam('back')) {
  107. $resultRedirect->setPath('*/*/edit', [
  108. StockInterface::STOCK_ID => $stockId,
  109. '_current' => true,
  110. ]);
  111. } elseif ($this->getRequest()->getParam('redirect_to_new')) {
  112. $resultRedirect->setPath('*/*/new', [
  113. '_current' => true,
  114. ]);
  115. } else {
  116. $resultRedirect->setPath('*/*/');
  117. }
  118. }
  119. /**
  120. * @param Redirect $resultRedirect
  121. * @param int|null $stockId
  122. *
  123. * @return void
  124. */
  125. private function processRedirectAfterFailureSave(Redirect $resultRedirect, int $stockId = null)
  126. {
  127. if (null === $stockId) {
  128. $resultRedirect->setPath('*/*/new');
  129. } else {
  130. $resultRedirect->setPath('*/*/edit', [
  131. StockInterface::STOCK_ID => $stockId,
  132. '_current' => true,
  133. ]);
  134. }
  135. }
  136. }