DataProvider.php 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Theme\Model\Design\Config;
  7. use Magento\Framework\App\Config\ScopeCodeResolver;
  8. use Magento\Framework\App\ObjectManager;
  9. use Magento\Theme\Model\ResourceModel\Design\Config\Collection;
  10. use Magento\Theme\Model\ResourceModel\Design\Config\CollectionFactory;
  11. use Magento\Ui\DataProvider\AbstractDataProvider;
  12. use Magento\Config\Model\Config\Reader\Source\Deployed\SettingChecker;
  13. use Magento\Framework\App\RequestInterface;
  14. class DataProvider extends AbstractDataProvider
  15. {
  16. /**
  17. * @var array
  18. */
  19. protected $loadedData;
  20. /**
  21. * @var Collection
  22. */
  23. protected $collection;
  24. /**
  25. * @var DataProvider\DataLoader
  26. */
  27. protected $dataLoader;
  28. /**
  29. * @var DataProvider\MetadataLoader
  30. */
  31. private $metadataLoader;
  32. /**
  33. * @var SettingChecker
  34. */
  35. private $settingChecker;
  36. /**
  37. * @var RequestInterface
  38. */
  39. private $request;
  40. /**
  41. * @var ScopeCodeResolver
  42. */
  43. private $scopeCodeResolver;
  44. /**
  45. * @param string $name
  46. * @param string $primaryFieldName
  47. * @param string $requestFieldName
  48. * @param DataProvider\DataLoader $dataLoader
  49. * @param DataProvider\MetadataLoader $metadataLoader
  50. * @param CollectionFactory $configCollectionFactory
  51. * @param array $meta
  52. * @param array $data
  53. */
  54. public function __construct(
  55. $name,
  56. $primaryFieldName,
  57. $requestFieldName,
  58. DataProvider\DataLoader $dataLoader,
  59. DataProvider\MetadataLoader $metadataLoader,
  60. CollectionFactory $configCollectionFactory,
  61. array $meta = [],
  62. array $data = []
  63. ) {
  64. parent::__construct(
  65. $name,
  66. $primaryFieldName,
  67. $requestFieldName,
  68. $meta,
  69. $data
  70. );
  71. $this->dataLoader = $dataLoader;
  72. $this->metadataLoader = $metadataLoader;
  73. $this->collection = $configCollectionFactory->create();
  74. $this->meta = array_merge($this->meta, $this->metadataLoader->getData());
  75. }
  76. /**
  77. * {@inheritdoc}
  78. */
  79. public function getData()
  80. {
  81. if (isset($this->loadedData)) {
  82. return $this->loadedData;
  83. }
  84. $this->loadedData = $this->dataLoader->getData();
  85. return $this->loadedData;
  86. }
  87. /**
  88. * {@inheritdoc}
  89. */
  90. public function getMeta()
  91. {
  92. $meta = parent::getMeta();
  93. if (!isset($meta['other_settings']['children'])) {
  94. return $meta;
  95. }
  96. $request = $this->getRequest()->getParams();
  97. if (!isset($request['scope'])) {
  98. return $meta;
  99. }
  100. $scope = $request['scope'];
  101. $scopeCode = $this->getScopeCodeResolver()->resolve(
  102. $scope,
  103. isset($request['scope_id']) ? $request['scope_id'] : null
  104. );
  105. foreach ($meta['other_settings']['children'] as $settingGroupName => &$settingGroup) {
  106. foreach ($settingGroup['children'] as $fieldName => &$field) {
  107. $path = sprintf(
  108. 'design/%s/%s',
  109. $settingGroupName,
  110. preg_replace('/^' . $settingGroupName . '_/', '', $fieldName)
  111. );
  112. $isReadOnly = $this->getSettingChecker()->isReadOnly(
  113. $path,
  114. $scope,
  115. $scopeCode
  116. );
  117. if ($isReadOnly) {
  118. $field['arguments']['data']['config']['disabled'] = true;
  119. $field['arguments']['data']['config']['is_disable_inheritance'] = true;
  120. }
  121. }
  122. }
  123. if (isset($meta['other_settings']['children']['search_engine_robots']['children'])) {
  124. $meta['other_settings']['children']['search_engine_robots']['children'] = array_merge(
  125. $meta['other_settings']['children']['search_engine_robots']['children'],
  126. $this->getSearchEngineRobotsMetadata(
  127. $scope,
  128. $meta['other_settings']['children']['search_engine_robots']['children']
  129. )
  130. );
  131. }
  132. return $meta;
  133. }
  134. /**
  135. * Retrieve modified Search Engine Robots metadata
  136. *
  137. * Disable Search Engine Robots fields in case when current scope is 'stores'.
  138. *
  139. * @param string $scope
  140. * @param array $fields
  141. * @return array
  142. */
  143. private function getSearchEngineRobotsMetadata($scope, array $fields = [])
  144. {
  145. if ($scope == \Magento\Store\Model\ScopeInterface::SCOPE_STORES) {
  146. $resetToDefaultsData = [
  147. 'arguments' => [
  148. 'data' => [
  149. 'config' => [
  150. 'disabled' => true,
  151. 'is_disable_inheritance' => true,
  152. ],
  153. ],
  154. ],
  155. ];
  156. $fields = array_merge($fields, ['reset_to_defaults' => $resetToDefaultsData]);
  157. foreach ($fields as &$field) {
  158. $field['arguments']['data']['config']['disabled'] = true;
  159. $field['arguments']['data']['config']['is_disable_inheritance'] = true;
  160. }
  161. }
  162. return $fields;
  163. }
  164. /**
  165. * @deprecated 100.1.3
  166. * @return ScopeCodeResolver
  167. */
  168. private function getScopeCodeResolver()
  169. {
  170. if ($this->scopeCodeResolver === null) {
  171. $this->scopeCodeResolver = ObjectManager::getInstance()->get(ScopeCodeResolver::class);
  172. }
  173. return $this->scopeCodeResolver;
  174. }
  175. /**
  176. * @deprecated 100.1.3
  177. * @return SettingChecker
  178. */
  179. private function getSettingChecker()
  180. {
  181. if ($this->settingChecker === null) {
  182. $this->settingChecker = ObjectManager::getInstance()->get(SettingChecker::class);
  183. }
  184. return $this->settingChecker;
  185. }
  186. /**
  187. * @deprecated 100.1.3
  188. * @return RequestInterface
  189. */
  190. private function getRequest()
  191. {
  192. if ($this->request === null) {
  193. $this->request = ObjectManager::getInstance()->get(RequestInterface::class);
  194. }
  195. return $this->request;
  196. }
  197. }