Save.php 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Sitemap\Controller\Adminhtml\Sitemap;
  7. use Magento\Backend\App\Action;
  8. use Magento\Framework\App\Action\HttpPostActionInterface;
  9. use Magento\Framework\App\Filesystem\DirectoryList;
  10. use Magento\Framework\Controller;
  11. /**
  12. * Controller class Save. Represents requests flow logic for save action
  13. */
  14. class Save extends \Magento\Sitemap\Controller\Adminhtml\Sitemap implements HttpPostActionInterface
  15. {
  16. /**
  17. * Validate path for generation
  18. *
  19. * @param array $data
  20. * @return bool
  21. * @throws \Exception
  22. */
  23. protected function validatePath(array $data)
  24. {
  25. if (!empty($data['sitemap_filename']) && !empty($data['sitemap_path'])) {
  26. $data['sitemap_path'] = '/' . ltrim($data['sitemap_path'], '/');
  27. $path = rtrim($data['sitemap_path'], '\\/') . '/' . $data['sitemap_filename'];
  28. /** @var $validator \Magento\MediaStorage\Model\File\Validator\AvailablePath */
  29. $validator = $this->_objectManager->create(\Magento\MediaStorage\Model\File\Validator\AvailablePath::class);
  30. /** @var $helper \Magento\Sitemap\Helper\Data */
  31. $helper = $this->_objectManager->get(\Magento\Sitemap\Helper\Data::class);
  32. $validator->setPaths($helper->getValidPaths());
  33. if (!$validator->isValid($path)) {
  34. foreach ($validator->getMessages() as $message) {
  35. $this->messageManager->addErrorMessage($message);
  36. }
  37. // save data in session
  38. $this->_objectManager->get(\Magento\Backend\Model\Session::class)->setFormData($data);
  39. // redirect to edit form
  40. return false;
  41. }
  42. }
  43. return true;
  44. }
  45. /**
  46. * Clear sitemap
  47. *
  48. * @param \Magento\Sitemap\Model\Sitemap $model
  49. * @return void
  50. */
  51. protected function clearSiteMap(\Magento\Sitemap\Model\Sitemap $model)
  52. {
  53. /** @var \Magento\Framework\Filesystem\Directory\Write $directory */
  54. $directory = $this->_objectManager->get(\Magento\Framework\Filesystem::class)
  55. ->getDirectoryWrite(DirectoryList::ROOT);
  56. if ($this->getRequest()->getParam('sitemap_id')) {
  57. $model->load($this->getRequest()->getParam('sitemap_id'));
  58. $fileName = $model->getSitemapFilename();
  59. $path = $model->getSitemapPath() . '/' . $fileName;
  60. if ($fileName && $directory->isFile($path)) {
  61. $directory->delete($path);
  62. }
  63. }
  64. }
  65. /**
  66. * Save data
  67. *
  68. * @param array $data
  69. * @return string|bool
  70. */
  71. protected function saveData($data)
  72. {
  73. // init model and set data
  74. /** @var \Magento\Sitemap\Model\Sitemap $model */
  75. $model = $this->_objectManager->create(\Magento\Sitemap\Model\Sitemap::class);
  76. $this->clearSiteMap($model);
  77. $model->setData($data);
  78. // try to save it
  79. try {
  80. // save the data
  81. $model->save();
  82. // display success message
  83. $this->messageManager->addSuccessMessage(__('You saved the sitemap.'));
  84. // clear previously saved data from session
  85. $this->_objectManager->get(\Magento\Backend\Model\Session::class)->setFormData(false);
  86. return $model->getId();
  87. } catch (\Exception $e) {
  88. // display error message
  89. $this->messageManager->addErrorMessage($e->getMessage());
  90. // save data in session
  91. $this->_objectManager->get(\Magento\Backend\Model\Session::class)->setFormData($data);
  92. }
  93. return false;
  94. }
  95. /**
  96. * Get result after saving data
  97. *
  98. * @param string|bool $id
  99. * @return \Magento\Framework\Controller\ResultInterface
  100. */
  101. protected function getResult($id)
  102. {
  103. /** @var \Magento\Backend\Model\View\Result\Redirect $resultRedirect */
  104. $resultRedirect = $this->resultFactory->create(Controller\ResultFactory::TYPE_REDIRECT);
  105. if ($id) {
  106. // check if 'Save and Continue'
  107. if ($this->getRequest()->getParam('back')) {
  108. $resultRedirect->setPath('adminhtml/*/edit', ['sitemap_id' => $id]);
  109. return $resultRedirect;
  110. }
  111. // go to grid or forward to generate action
  112. if ($this->getRequest()->getParam('generate')) {
  113. $this->getRequest()->setParam('sitemap_id', $id);
  114. return $this->resultFactory->create(Controller\ResultFactory::TYPE_FORWARD)
  115. ->forward('generate');
  116. }
  117. $resultRedirect->setPath('adminhtml/*/');
  118. return $resultRedirect;
  119. }
  120. $resultRedirect->setPath(
  121. 'adminhtml/*/edit',
  122. ['sitemap_id' => $this->getRequest()->getParam('sitemap_id')]
  123. );
  124. return $resultRedirect;
  125. }
  126. /**
  127. * Save action
  128. *
  129. * @return \Magento\Backend\Model\View\Result\Redirect
  130. */
  131. public function execute()
  132. {
  133. // check if data sent
  134. $data = $this->getRequest()->getPostValue();
  135. /** @var \Magento\Backend\Model\View\Result\Redirect $resultRedirect */
  136. $resultRedirect = $this->resultFactory->create(Controller\ResultFactory::TYPE_REDIRECT);
  137. if ($data) {
  138. if (!$this->validatePath($data)) {
  139. $resultRedirect->setPath(
  140. 'adminhtml/*/edit',
  141. ['sitemap_id' => $this->getRequest()->getParam('sitemap_id')]
  142. );
  143. return $resultRedirect;
  144. }
  145. return $this->getResult($this->saveData($data));
  146. }
  147. $resultRedirect->setPath('adminhtml/*/');
  148. return $resultRedirect;
  149. }
  150. }