Validator.php 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Framework\View\Design\Theme;
  7. /**
  8. * Class Validator
  9. */
  10. class Validator
  11. {
  12. /**
  13. * Validators list by data key
  14. * array('dataKey' => array('validator_name' => [validators], ...), ...)
  15. *
  16. * @var array
  17. */
  18. protected $_dataValidators = [];
  19. /**
  20. * List of errors after validation process
  21. * array('dataKey' => 'Error message')
  22. *
  23. * @var array
  24. */
  25. protected $_errorMessages;
  26. /**
  27. * Initialize validators
  28. */
  29. public function __construct()
  30. {
  31. $this->_setTypeValidators();
  32. $this->_setTitleValidators();
  33. }
  34. /**
  35. * Set title validators
  36. *
  37. * @return $this
  38. */
  39. protected function _setTitleValidators()
  40. {
  41. $titleValidators = [
  42. [
  43. 'name' => 'not_empty',
  44. 'class' => 'Zend_Validate_NotEmpty',
  45. 'break' => true,
  46. 'options' => [],
  47. 'message' => (string)new \Magento\Framework\Phrase('Field title can\'t be empty'),
  48. ],
  49. ];
  50. $this->addDataValidators('theme_title', $titleValidators);
  51. return $this;
  52. }
  53. /**
  54. * Set theme type validators
  55. *
  56. * @return $this
  57. */
  58. protected function _setTypeValidators()
  59. {
  60. $typeValidators = [
  61. [
  62. 'name' => 'not_empty',
  63. 'class' => 'Zend_Validate_NotEmpty',
  64. 'break' => true,
  65. 'options' => [],
  66. 'message' => (string)new \Magento\Framework\Phrase('Theme type can\'t be empty'),
  67. ],
  68. [
  69. 'name' => 'available',
  70. 'class' => 'Zend_Validate_InArray',
  71. 'break' => true,
  72. 'options' => [
  73. 'haystack' => [
  74. \Magento\Framework\View\Design\ThemeInterface::TYPE_PHYSICAL,
  75. \Magento\Framework\View\Design\ThemeInterface::TYPE_VIRTUAL,
  76. \Magento\Framework\View\Design\ThemeInterface::TYPE_STAGING,
  77. ],
  78. ],
  79. 'message' => (string)new \Magento\Framework\Phrase('Theme type is invalid')
  80. ],
  81. ];
  82. $this->addDataValidators('type', $typeValidators);
  83. return $this;
  84. }
  85. /**
  86. * Add validators
  87. *
  88. * @param string $dataKey
  89. * @param array $validators
  90. * @return $this
  91. */
  92. public function addDataValidators($dataKey, $validators)
  93. {
  94. if (!isset($this->_dataValidators[$dataKey])) {
  95. $this->_dataValidators[$dataKey] = [];
  96. }
  97. foreach ($validators as $validator) {
  98. $this->_dataValidators[$dataKey][$validator['name']] = $validator;
  99. }
  100. return $this;
  101. }
  102. /**
  103. * Return error messages for items
  104. *
  105. * @param string|null $dataKey
  106. * @return array
  107. */
  108. public function getErrorMessages($dataKey = null)
  109. {
  110. if ($dataKey) {
  111. return $this->_errorMessages[$dataKey] ?? [];
  112. }
  113. return $this->_errorMessages;
  114. }
  115. /**
  116. * Instantiate class validator
  117. *
  118. * @param array &$validators
  119. * @return $this
  120. */
  121. protected function _instantiateValidators(array &$validators)
  122. {
  123. foreach ($validators as &$validator) {
  124. if (is_string($validator['class'])) {
  125. $validator['class'] = new $validator['class']($validator['options']);
  126. $validator['class']->setDisableTranslator(true);
  127. }
  128. }
  129. return $this;
  130. }
  131. /**
  132. * Validate one data item
  133. *
  134. * @param array $validator
  135. * @param string $dataKey
  136. * @param mixed $dataValue
  137. * @return bool
  138. */
  139. protected function _validateDataItem($validator, $dataKey, $dataValue)
  140. {
  141. if ($validator['class'] instanceof \Zend_Validate_NotEmpty && !$validator['class']->isValid(
  142. $dataValue
  143. ) || !empty($dataValue) && !$validator['class']->isValid(
  144. $dataValue
  145. )
  146. ) {
  147. $this->_errorMessages[$dataKey][] = $validator['message'];
  148. if ($validator['break']) {
  149. return false;
  150. }
  151. }
  152. return true;
  153. }
  154. /**
  155. * Validate all data items
  156. *
  157. * @param \Magento\Framework\DataObject $data
  158. * @return bool
  159. */
  160. public function validate(\Magento\Framework\DataObject $data)
  161. {
  162. $this->_errorMessages = [];
  163. foreach ($this->_dataValidators as $dataKey => $validators) {
  164. if (!isset($data[$dataKey])) {
  165. continue;
  166. }
  167. $this->_instantiateValidators($validators);
  168. foreach ($validators as $validator) {
  169. if (!$this->_validateDataItem($validator, $dataKey, $data[$dataKey])) {
  170. break;
  171. }
  172. }
  173. }
  174. return empty($this->_errorMessages);
  175. }
  176. }