PostDataProcessor.php 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. <?php
  2. /**
  3. *
  4. * Copyright © Magento, Inc. All rights reserved.
  5. * See COPYING.txt for license details.
  6. */
  7. namespace Magento\Cms\Controller\Adminhtml\Page;
  8. use Magento\Cms\Model\Page\DomValidationState;
  9. use Magento\Framework\App\ObjectManager;
  10. use Magento\Framework\Config\Dom\ValidationException;
  11. use Magento\Framework\Config\Dom\ValidationSchemaException;
  12. /**
  13. * Class PostDataProcessor
  14. * @package Magento\Cms\Controller\Adminhtml\Page
  15. */
  16. class PostDataProcessor
  17. {
  18. /**
  19. * @var \Magento\Framework\Stdlib\DateTime\Filter\Date
  20. */
  21. protected $dateFilter;
  22. /**
  23. * @var \Magento\Framework\View\Model\Layout\Update\ValidatorFactory
  24. */
  25. protected $validatorFactory;
  26. /**
  27. * @var \Magento\Framework\Message\ManagerInterface
  28. */
  29. protected $messageManager;
  30. /**
  31. * @var DomValidationState
  32. */
  33. private $validationState;
  34. /**
  35. * @param \Magento\Framework\Stdlib\DateTime\Filter\Date $dateFilter
  36. * @param \Magento\Framework\Message\ManagerInterface $messageManager
  37. * @param \Magento\Framework\View\Model\Layout\Update\ValidatorFactory $validatorFactory
  38. * @param DomValidationState $validationState
  39. */
  40. public function __construct(
  41. \Magento\Framework\Stdlib\DateTime\Filter\Date $dateFilter,
  42. \Magento\Framework\Message\ManagerInterface $messageManager,
  43. \Magento\Framework\View\Model\Layout\Update\ValidatorFactory $validatorFactory,
  44. DomValidationState $validationState = null
  45. ) {
  46. $this->dateFilter = $dateFilter;
  47. $this->messageManager = $messageManager;
  48. $this->validatorFactory = $validatorFactory;
  49. $this->validationState = $validationState
  50. ?: ObjectManager::getInstance()->get(DomValidationState::class);
  51. }
  52. /**
  53. * Filtering posted data. Converting localized data if needed
  54. *
  55. * @param array $data
  56. * @return array
  57. */
  58. public function filter($data)
  59. {
  60. $filterRules = [];
  61. foreach (['custom_theme_from', 'custom_theme_to'] as $dateField) {
  62. if (!empty($data[$dateField])) {
  63. $filterRules[$dateField] = $this->dateFilter;
  64. }
  65. }
  66. return (new \Zend_Filter_Input($filterRules, [], $data))->getUnescaped();
  67. }
  68. /**
  69. * Validate post data
  70. *
  71. * @param array $data
  72. * @return bool Return FALSE if some item is invalid
  73. */
  74. public function validate($data)
  75. {
  76. if (!empty($data['layout_update_xml']) || !empty($data['custom_layout_update_xml'])) {
  77. /** @var $layoutXmlValidator \Magento\Framework\View\Model\Layout\Update\Validator */
  78. $layoutXmlValidator = $this->validatorFactory->create(
  79. [
  80. 'validationState' => $this->validationState,
  81. ]
  82. );
  83. if (!$this->validateData($data, $layoutXmlValidator)) {
  84. $validatorMessages = $layoutXmlValidator->getMessages();
  85. foreach ($validatorMessages as $message) {
  86. $this->messageManager->addErrorMessage($message);
  87. }
  88. return false;
  89. }
  90. }
  91. return true;
  92. }
  93. /**
  94. * Check if required fields is not empty
  95. *
  96. * @param array $data
  97. * @return bool
  98. */
  99. public function validateRequireEntry(array $data)
  100. {
  101. $requiredFields = [
  102. 'title' => __('Page Title'),
  103. 'stores' => __('Store View'),
  104. 'is_active' => __('Status')
  105. ];
  106. $errorNo = true;
  107. foreach ($data as $field => $value) {
  108. if (in_array($field, array_keys($requiredFields)) && $value == '') {
  109. $errorNo = false;
  110. $this->messageManager->addErrorMessage(
  111. __('To apply changes you should fill in hidden required "%1" field', $requiredFields[$field])
  112. );
  113. }
  114. }
  115. return $errorNo;
  116. }
  117. /**
  118. * Validate data, avoid cyclomatic complexity
  119. *
  120. * @param array $data
  121. * @param \Magento\Framework\View\Model\Layout\Update\Validator $layoutXmlValidator
  122. * @return bool
  123. */
  124. private function validateData($data, $layoutXmlValidator)
  125. {
  126. try {
  127. if (!empty($data['layout_update_xml']) && !$layoutXmlValidator->isValid($data['layout_update_xml'])) {
  128. return false;
  129. }
  130. if (!empty($data['custom_layout_update_xml']) &&
  131. !$layoutXmlValidator->isValid($data['custom_layout_update_xml'])
  132. ) {
  133. return false;
  134. }
  135. } catch (ValidationException $e) {
  136. return false;
  137. } catch (ValidationSchemaException $e) {
  138. return false;
  139. } catch (\Exception $e) {
  140. $this->messageManager->addExceptionMessage($e);
  141. return false;
  142. }
  143. return true;
  144. }
  145. }