Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
Save.php
Go to the documentation of this file.
1 <?php
6 declare(strict_types=1);
7 
9 
10 use Exception;
19 use Magento\InventoryApi\Api\Data\SourceInterfaceFactory;
23 
27 class Save extends Action implements HttpPostActionInterface
28 {
32  const ADMIN_RESOURCE = 'Magento_InventoryApi::source';
33 
37  private $sourceFactory;
38 
42  private $sourceRepository;
43 
47  private $sourceHydrator;
48 
55  public function __construct(
56  Context $context,
57  SourceInterfaceFactory $sourceFactory,
58  SourceRepositoryInterface $sourceRepository,
59  SourceHydrator $sourceHydrator
60  ) {
61  parent::__construct($context);
62  $this->sourceFactory = $sourceFactory;
63  $this->sourceRepository = $sourceRepository;
64  $this->sourceHydrator = $sourceHydrator;
65  }
66 
70  public function execute(): ResultInterface
71  {
72  $resultRedirect = $this->resultRedirectFactory->create();
73  $request = $this->getRequest();
74  $requestData = $request->getPost()->toArray();
75 
76  if (!$request->isPost() || empty($requestData['general'])) {
77  $this->messageManager->addErrorMessage(__('Wrong request.'));
78  $this->processRedirectAfterFailureSave($resultRedirect);
79  return $resultRedirect;
80  }
81 
82  $sourceCodeQueryParam = $request->getQuery(SourceInterface::SOURCE_CODE);
83  try {
84  $source = (null !== $sourceCodeQueryParam)
85  ? $this->sourceRepository->get($sourceCodeQueryParam)
86  : $this->sourceFactory->create();
87 
88  $this->processSave($source, $requestData);
89 
90  $this->messageManager->addSuccessMessage(__('The Source has been saved.'));
91  $this->processRedirectAfterSuccessSave($resultRedirect, $source->getSourceCode());
92  } catch (NoSuchEntityException $e) {
93  $this->messageManager->addErrorMessage(__('The Source does not exist.'));
94  $this->processRedirectAfterFailureSave($resultRedirect);
95  } catch (ValidationException $e) {
96  foreach ($e->getErrors() as $localizedError) {
97  $this->messageManager->addErrorMessage($localizedError->getMessage());
98  }
99  $this->_session->setSourceFormData($requestData);
100  $this->processRedirectAfterFailureSave($resultRedirect, $sourceCodeQueryParam ?? $sourceCodeQueryParam);
101  } catch (CouldNotSaveException $e) {
102  $this->messageManager->addErrorMessage($e->getMessage());
103  $this->_session->setSourceFormData($requestData);
104  $this->processRedirectAfterFailureSave($resultRedirect, $sourceCodeQueryParam ?? $sourceCodeQueryParam);
105  } catch (Exception $e) {
106  $this->messageManager->addErrorMessage(__('Could not save Source.'));
107  $this->_session->setSourceFormData($requestData);
108  $this->processRedirectAfterFailureSave($resultRedirect, $sourceCodeQueryParam ?? $sourceCodeQueryParam);
109  }
110  return $resultRedirect;
111  }
112 
118  private function processSave(SourceInterface $source, array $requestData)
119  {
120  $source = $this->sourceHydrator->hydrate($source, $requestData);
121 
122  $this->_eventManager->dispatch(
123  'controller_action_inventory_populate_source_with_data',
124  [
125  'request' => $this->getRequest(),
126  'source' => $source,
127  ]
128  );
129 
130  $this->sourceRepository->save($source);
131 
132  $this->_eventManager->dispatch(
133  'controller_action_inventory_source_save_after',
134  [
135  'request' => $this->getRequest(),
136  'source' => $source,
137  ]
138  );
139  }
140 
146  private function processRedirectAfterSuccessSave(Redirect $resultRedirect, string $sourceCode)
147  {
148  if ($this->getRequest()->getParam('back')) {
149  $resultRedirect->setPath('*/*/edit', [
151  '_current' => true,
152  ]);
153  } elseif ($this->getRequest()->getParam('redirect_to_new')) {
154  $resultRedirect->setPath('*/*/new', [
155  '_current' => true,
156  ]);
157  } else {
158  $resultRedirect->setPath('*/*/');
159  }
160  }
161 
167  private function processRedirectAfterFailureSave(Redirect $resultRedirect, string $sourceCode = null)
168  {
169  if (null === $sourceCode) {
170  $resultRedirect->setPath('*/*/new');
171  } else {
172  $resultRedirect->setPath('*/*/edit', [
174  '_current' => true,
175  ]);
176  }
177  }
178 }
elseif(isset( $params[ 'redirect_parent']))
Definition: iframe.phtml:17
$source
Definition: source.php:23
__()
Definition: __.php:13
__construct(Context $context, SourceInterfaceFactory $sourceFactory, SourceRepositoryInterface $sourceRepository, SourceHydrator $sourceHydrator)
Definition: Save.php:55
$sourceCode
Definition: inventory.phtml:11
$sourceRepository
Definition: source.php:20
$sourceFactory
Definition: source.php:16