PageRenderTime 41ms CodeModel.GetById 10ms RepoModel.GetById 1ms app.codeStats 0ms

/vendor/magento/module-config/Model/Config/Backend/Baseurl.php

https://gitlab.com/yousafsyed/easternglamor
PHP | 219 lines | 131 code | 11 blank | 77 comment | 15 complexity | dc0c1c7a03cdc9ad4707a9eefbb010d3 MD5 | raw file
  1. <?php
  2. /**
  3. * Copyright © 2016 Magento. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Config\Model\Config\Backend;
  7. class Baseurl extends \Magento\Framework\App\Config\Value
  8. {
  9. /**
  10. * @var \Magento\Framework\View\Asset\MergeService
  11. */
  12. protected $_mergeService;
  13. /**
  14. * @param \Magento\Framework\Model\Context $context
  15. * @param \Magento\Framework\Registry $registry
  16. * @param \Magento\Framework\App\Config\ScopeConfigInterface $config
  17. * @param \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList
  18. * @param \Magento\Framework\View\Asset\MergeService $mergeService
  19. * @param \Magento\Framework\Model\ResourceModel\AbstractResource $resource
  20. * @param \Magento\Framework\Data\Collection\AbstractDb $resourceCollection
  21. * @param array $data
  22. */
  23. public function __construct(
  24. \Magento\Framework\Model\Context $context,
  25. \Magento\Framework\Registry $registry,
  26. \Magento\Framework\App\Config\ScopeConfigInterface $config,
  27. \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList,
  28. \Magento\Framework\View\Asset\MergeService $mergeService,
  29. \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null,
  30. \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null,
  31. array $data = []
  32. ) {
  33. $this->_mergeService = $mergeService;
  34. parent::__construct($context, $registry, $config, $cacheTypeList, $resource, $resourceCollection, $data);
  35. }
  36. /**
  37. * Validate a base URL field value
  38. *
  39. * @return void
  40. * @throws \Magento\Framework\Exception\LocalizedException
  41. */
  42. public function beforeSave()
  43. {
  44. $value = $this->getValue();
  45. try {
  46. if (!$this->_validateUnsecure($value) && !$this->_validateSecure($value)) {
  47. $this->_validateFullyQualifiedUrl($value);
  48. }
  49. } catch (\Magento\Framework\Exception\LocalizedException $e) {
  50. $field = $this->getFieldConfig();
  51. $label = $field && is_array($field) ? $field['label'] : 'value';
  52. $msg = __('Invalid %1. %2', $label, $e->getMessage());
  53. $error = new \Magento\Framework\Exception\LocalizedException($msg, $e);
  54. throw $error;
  55. }
  56. }
  57. /**
  58. * Validation sub-routine for unsecure base URLs
  59. *
  60. * @param string $value
  61. * @return bool
  62. */
  63. private function _validateUnsecure($value)
  64. {
  65. $placeholders = ['{{unsecure_base_url}}'];
  66. switch ($this->getPath()) {
  67. case \Magento\Store\Model\Store::XML_PATH_UNSECURE_BASE_URL:
  68. $this->_assertValuesOrUrl(['{{base_url}}'], $value);
  69. break;
  70. case \Magento\Store\Model\Store::XML_PATH_UNSECURE_BASE_LINK_URL:
  71. $this->_assertStartsWithValuesOrUrl($placeholders, $value);
  72. break;
  73. case \Magento\Store\Model\Store::XML_PATH_UNSECURE_BASE_STATIC_URL:
  74. case \Magento\Store\Model\Store::XML_PATH_UNSECURE_BASE_MEDIA_URL:
  75. $this->_assertStartsWithValuesOrUrlOrEmpty($placeholders, $value);
  76. break;
  77. default:
  78. return false;
  79. }
  80. return true;
  81. }
  82. /**
  83. * Validation sub-routine for secure base URLs
  84. *
  85. * @param string $value
  86. * @return bool
  87. */
  88. private function _validateSecure($value)
  89. {
  90. $placeholders = ['{{unsecure_base_url}}', '{{secure_base_url}}'];
  91. switch ($this->getPath()) {
  92. case \Magento\Store\Model\Store::XML_PATH_SECURE_BASE_URL:
  93. $this->_assertValuesOrUrl(['{{base_url}}', '{{unsecure_base_url}}'], $value);
  94. break;
  95. case \Magento\Store\Model\Store::XML_PATH_SECURE_BASE_LINK_URL:
  96. $this->_assertStartsWithValuesOrUrl($placeholders, $value);
  97. break;
  98. case \Magento\Store\Model\Store::XML_PATH_SECURE_BASE_STATIC_URL:
  99. case \Magento\Store\Model\Store::XML_PATH_SECURE_BASE_MEDIA_URL:
  100. $this->_assertStartsWithValuesOrUrlOrEmpty($placeholders, $value);
  101. break;
  102. default:
  103. return false;
  104. }
  105. return true;
  106. }
  107. /**
  108. * Value equals to one of provided items or is a URL
  109. *
  110. * @param array $values
  111. * @param string $value
  112. * @return void
  113. * @throws \Magento\Framework\Exception\LocalizedException
  114. */
  115. private function _assertValuesOrUrl(array $values, $value)
  116. {
  117. if (!in_array($value, $values) && !$this->_isFullyQualifiedUrl($value)) {
  118. throw new \Magento\Framework\Exception\LocalizedException(
  119. __('Value must be a URL or one of placeholders: %1', implode(',', $values))
  120. );
  121. }
  122. }
  123. /**
  124. * Value starts with one of provided items or is a URL
  125. *
  126. * @param array $values
  127. * @param string $value
  128. * @return void
  129. * @throws \Magento\Framework\Exception\LocalizedException
  130. */
  131. private function _assertStartsWithValuesOrUrl(array $values, $value)
  132. {
  133. $quoted = array_map('preg_quote', $values, array_fill(0, count($values), '/'));
  134. if (!preg_match('/^(' . implode('|', $quoted) . ')(.+\/)?$/', $value) && !$this->_isFullyQualifiedUrl($value)
  135. ) {
  136. throw new \Magento\Framework\Exception\LocalizedException(
  137. __(
  138. 'Specify a URL or path that starts with placeholder(s): %1, and ends with "/".',
  139. implode(', ', $values)
  140. )
  141. );
  142. }
  143. }
  144. /**
  145. * Value starts with, empty or is a URL
  146. *
  147. * @param array $values
  148. * @param string $value
  149. * @return void
  150. * @throws \Magento\Framework\Exception\LocalizedException
  151. */
  152. private function _assertStartsWithValuesOrUrlOrEmpty(array $values, $value)
  153. {
  154. if (empty($value)) {
  155. return;
  156. }
  157. try {
  158. $this->_assertStartsWithValuesOrUrl($values, $value);
  159. } catch (\Magento\Framework\Exception\LocalizedException $e) {
  160. $msg = __('%1 An empty value is allowed as well.', $e->getMessage());
  161. $error = new \Magento\Framework\Exception\LocalizedException($msg, $e);
  162. throw $error;
  163. }
  164. }
  165. /**
  166. * Default validation of a URL
  167. *
  168. * @param string $value
  169. * @return void
  170. * @throws \Magento\Framework\Exception\LocalizedException
  171. */
  172. private function _validateFullyQualifiedUrl($value)
  173. {
  174. if (!$this->_isFullyQualifiedUrl($value)) {
  175. throw new \Magento\Framework\Exception\LocalizedException(__('Specify a fully qualified URL.'));
  176. }
  177. }
  178. /**
  179. * Whether the provided value can be considered as a fully qualified URL
  180. *
  181. * @param string $value
  182. * @return bool
  183. */
  184. private function _isFullyQualifiedUrl($value)
  185. {
  186. $url = parse_url($value);
  187. return isset($url['scheme']) && isset($url['host']) && preg_match('/\/$/', $value);
  188. }
  189. /**
  190. * Clean compiled JS/CSS when updating url configuration settings
  191. *
  192. * @return $this
  193. */
  194. public function afterSave()
  195. {
  196. if ($this->isValueChanged()) {
  197. switch ($this->getPath()) {
  198. case \Magento\Store\Model\Store::XML_PATH_UNSECURE_BASE_URL:
  199. case \Magento\Store\Model\Store::XML_PATH_UNSECURE_BASE_MEDIA_URL:
  200. case \Magento\Store\Model\Store::XML_PATH_SECURE_BASE_URL:
  201. case \Magento\Store\Model\Store::XML_PATH_SECURE_BASE_MEDIA_URL:
  202. $this->_mergeService->cleanMergedJsCss();
  203. break;
  204. }
  205. }
  206. return parent::afterSave();
  207. }
  208. }