Form.php 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Config\Block\System\Config;
  7. use Magento\Config\App\Config\Type\System;
  8. use Magento\Config\Model\Config\Reader\Source\Deployed\SettingChecker;
  9. use Magento\Config\Model\Config\Structure\ElementVisibilityInterface;
  10. use Magento\Framework\App\Config\Data\ProcessorInterface;
  11. use Magento\Framework\App\Config\ScopeConfigInterface;
  12. use Magento\Framework\App\DeploymentConfig;
  13. use Magento\Framework\App\ObjectManager;
  14. use Magento\Framework\DataObject;
  15. /**
  16. * System config form block
  17. *
  18. * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  19. * @SuppressWarnings(PHPMD.DepthOfInheritance)
  20. * @api
  21. * @since 100.0.2
  22. */
  23. class Form extends \Magento\Backend\Block\Widget\Form\Generic
  24. {
  25. const SCOPE_DEFAULT = 'default';
  26. const SCOPE_WEBSITES = 'websites';
  27. const SCOPE_STORES = 'stores';
  28. /**
  29. * Config data array
  30. *
  31. * @var array
  32. */
  33. protected $_configData;
  34. /**
  35. * Backend config data instance
  36. *
  37. * @var \Magento\Config\Model\Config
  38. */
  39. protected $_configDataObject;
  40. /**
  41. * Default fieldset rendering block
  42. *
  43. * @var \Magento\Config\Block\System\Config\Form\Fieldset
  44. */
  45. protected $_fieldsetRenderer;
  46. /**
  47. * Default field rendering block
  48. *
  49. * @var \Magento\Config\Block\System\Config\Form\Field
  50. */
  51. protected $_fieldRenderer;
  52. /**
  53. * List of fieldset
  54. *
  55. * @var array
  56. */
  57. protected $_fieldsets = [];
  58. /**
  59. * Translated scope labels
  60. *
  61. * @var array
  62. */
  63. protected $_scopeLabels = [];
  64. /**
  65. * Backend Config model factory
  66. *
  67. * @var \Magento\Config\Model\Config\Factory
  68. */
  69. protected $_configFactory;
  70. /**
  71. * Magento\Framework\Data\FormFactory
  72. *
  73. * @var \Magento\Framework\Data\FormFactory
  74. */
  75. protected $_formFactory;
  76. /**
  77. * System config structure
  78. *
  79. * @var \Magento\Config\Model\Config\Structure
  80. */
  81. protected $_configStructure;
  82. /**
  83. * Form fieldset factory
  84. *
  85. * @var \Magento\Config\Block\System\Config\Form\Fieldset\Factory
  86. */
  87. protected $_fieldsetFactory;
  88. /**
  89. * Form field factory
  90. *
  91. * @var \Magento\Config\Block\System\Config\Form\Field\Factory
  92. */
  93. protected $_fieldFactory;
  94. /**
  95. * @var SettingChecker
  96. */
  97. private $settingChecker;
  98. /**
  99. * @var DeploymentConfig
  100. */
  101. private $appConfig;
  102. /**
  103. * Checks visibility status of form elements on Stores > Settings > Configuration page in Admin Panel
  104. * by their paths in the system.xml structure.
  105. *
  106. * @var ElementVisibilityInterface
  107. */
  108. private $elementVisibility;
  109. /**
  110. * @param \Magento\Backend\Block\Template\Context $context
  111. * @param \Magento\Framework\Registry $registry
  112. * @param \Magento\Framework\Data\FormFactory $formFactory
  113. * @param \Magento\Config\Model\Config\Factory $configFactory
  114. * @param \Magento\Config\Model\Config\Structure $configStructure
  115. * @param \Magento\Config\Block\System\Config\Form\Fieldset\Factory $fieldsetFactory
  116. * @param \Magento\Config\Block\System\Config\Form\Field\Factory $fieldFactory
  117. * @param array $data
  118. * @param SettingChecker|null $settingChecker
  119. */
  120. public function __construct(
  121. \Magento\Backend\Block\Template\Context $context,
  122. \Magento\Framework\Registry $registry,
  123. \Magento\Framework\Data\FormFactory $formFactory,
  124. \Magento\Config\Model\Config\Factory $configFactory,
  125. \Magento\Config\Model\Config\Structure $configStructure,
  126. \Magento\Config\Block\System\Config\Form\Fieldset\Factory $fieldsetFactory,
  127. \Magento\Config\Block\System\Config\Form\Field\Factory $fieldFactory,
  128. array $data = [],
  129. SettingChecker $settingChecker = null
  130. ) {
  131. parent::__construct($context, $registry, $formFactory, $data);
  132. $this->_configFactory = $configFactory;
  133. $this->_configStructure = $configStructure;
  134. $this->_fieldsetFactory = $fieldsetFactory;
  135. $this->_fieldFactory = $fieldFactory;
  136. $this->settingChecker = $settingChecker ?: ObjectManager::getInstance()->get(SettingChecker::class);
  137. $this->_scopeLabels = [
  138. self::SCOPE_DEFAULT => __('[GLOBAL]'),
  139. self::SCOPE_WEBSITES => __('[WEBSITE]'),
  140. self::SCOPE_STORES => __('[STORE VIEW]'),
  141. ];
  142. }
  143. /**
  144. * Initialize objects required to render config form
  145. *
  146. * @return $this
  147. */
  148. protected function _initObjects()
  149. {
  150. $this->_configDataObject = $this->_configFactory->create(
  151. [
  152. 'data' => [
  153. 'section' => $this->getSectionCode(),
  154. 'website' => $this->getWebsiteCode(),
  155. 'store' => $this->getStoreCode(),
  156. ],
  157. ]
  158. );
  159. $this->_configData = $this->_configDataObject->load();
  160. $this->_fieldsetRenderer = $this->_fieldsetFactory->create();
  161. $this->_fieldRenderer = $this->_fieldFactory->create();
  162. return $this;
  163. }
  164. /**
  165. * Initialize form
  166. *
  167. * @return $this
  168. */
  169. public function initForm()
  170. {
  171. $this->_initObjects();
  172. /** @var \Magento\Framework\Data\Form $form */
  173. $form = $this->_formFactory->create();
  174. /** @var $section \Magento\Config\Model\Config\Structure\Element\Section */
  175. $section = $this->_configStructure->getElement($this->getSectionCode());
  176. if ($section && $section->isVisible($this->getWebsiteCode(), $this->getStoreCode())) {
  177. foreach ($section->getChildren() as $group) {
  178. $this->_initGroup($group, $section, $form);
  179. }
  180. }
  181. $this->setForm($form);
  182. return $this;
  183. }
  184. /**
  185. * Initialize config field group
  186. *
  187. * @param \Magento\Config\Model\Config\Structure\Element\Group $group
  188. * @param \Magento\Config\Model\Config\Structure\Element\Section $section
  189. * @param \Magento\Framework\Data\Form\AbstractForm $form
  190. * @return void
  191. */
  192. protected function _initGroup(
  193. \Magento\Config\Model\Config\Structure\Element\Group $group,
  194. \Magento\Config\Model\Config\Structure\Element\Section $section,
  195. \Magento\Framework\Data\Form\AbstractForm $form
  196. ) {
  197. $frontendModelClass = $group->getFrontendModel();
  198. $fieldsetRenderer = $frontendModelClass ? $this->_layout->getBlockSingleton(
  199. $frontendModelClass
  200. ) : $this->_fieldsetRenderer;
  201. $fieldsetRenderer->setForm($this);
  202. $fieldsetRenderer->setConfigData($this->_configData);
  203. $fieldsetRenderer->setGroup($group);
  204. $fieldsetConfig = [
  205. 'legend' => $group->getLabel(),
  206. 'comment' => $group->getComment(),
  207. 'expanded' => $group->isExpanded(),
  208. 'group' => $group->getData(),
  209. ];
  210. $fieldset = $form->addFieldset($this->_generateElementId($group->getPath()), $fieldsetConfig);
  211. $fieldset->setRenderer($fieldsetRenderer);
  212. $group->populateFieldset($fieldset);
  213. $this->_addElementTypes($fieldset);
  214. $dependencies = $group->getDependencies($this->getStoreCode());
  215. $elementName = $this->_generateElementName($group->getPath());
  216. $elementId = $this->_generateElementId($group->getPath());
  217. $this->_populateDependenciesBlock($dependencies, $elementId, $elementName);
  218. if ($group->shouldCloneFields()) {
  219. $cloneModel = $group->getCloneModel();
  220. foreach ($cloneModel->getPrefixes() as $prefix) {
  221. $this->initFields($fieldset, $group, $section, $prefix['field'], $prefix['label']);
  222. }
  223. } else {
  224. $this->initFields($fieldset, $group, $section);
  225. }
  226. $this->_fieldsets[$group->getId()] = $fieldset;
  227. }
  228. /**
  229. * Return dependency block object
  230. *
  231. * @return \Magento\Backend\Block\Widget\Form\Element\Dependence
  232. */
  233. protected function _getDependence()
  234. {
  235. if (!$this->getChildBlock('element_dependence')) {
  236. $this->addChild('element_dependence', \Magento\Backend\Block\Widget\Form\Element\Dependence::class);
  237. }
  238. return $this->getChildBlock('element_dependence');
  239. }
  240. /**
  241. * Initialize config group fields
  242. *
  243. * @param \Magento\Framework\Data\Form\Element\Fieldset $fieldset
  244. * @param \Magento\Config\Model\Config\Structure\Element\Group $group
  245. * @param \Magento\Config\Model\Config\Structure\Element\Section $section
  246. * @param string $fieldPrefix
  247. * @param string $labelPrefix
  248. * @return $this
  249. */
  250. public function initFields(
  251. \Magento\Framework\Data\Form\Element\Fieldset $fieldset,
  252. \Magento\Config\Model\Config\Structure\Element\Group $group,
  253. \Magento\Config\Model\Config\Structure\Element\Section $section,
  254. $fieldPrefix = '',
  255. $labelPrefix = ''
  256. ) {
  257. if (!$this->_configDataObject) {
  258. $this->_initObjects();
  259. }
  260. // Extends for config data
  261. $extraConfigGroups = [];
  262. /** @var $element \Magento\Config\Model\Config\Structure\Element\Field */
  263. foreach ($group->getChildren() as $element) {
  264. if ($element instanceof \Magento\Config\Model\Config\Structure\Element\Group) {
  265. $this->_initGroup($element, $section, $fieldset);
  266. } else {
  267. $path = $element->getConfigPath() ?: $element->getPath($fieldPrefix);
  268. if ($element->getSectionId() != $section->getId()) {
  269. $groupPath = $element->getGroupPath();
  270. if (!isset($extraConfigGroups[$groupPath])) {
  271. $this->_configData = $this->_configDataObject->extendConfig(
  272. $groupPath,
  273. false,
  274. $this->_configData
  275. );
  276. $extraConfigGroups[$groupPath] = true;
  277. }
  278. }
  279. $this->_initElement($element, $fieldset, $path, $fieldPrefix, $labelPrefix);
  280. }
  281. }
  282. return $this;
  283. }
  284. /**
  285. * Initialize form element
  286. *
  287. * @param \Magento\Config\Model\Config\Structure\Element\Field $field
  288. * @param \Magento\Framework\Data\Form\Element\Fieldset $fieldset
  289. * @param string $path
  290. * @param string $fieldPrefix
  291. * @param string $labelPrefix
  292. * @return void
  293. */
  294. protected function _initElement(
  295. \Magento\Config\Model\Config\Structure\Element\Field $field,
  296. \Magento\Framework\Data\Form\Element\Fieldset $fieldset,
  297. $path,
  298. $fieldPrefix = '',
  299. $labelPrefix = ''
  300. ) {
  301. $inherit = !array_key_exists($path, $this->_configData);
  302. $data = $this->getFieldData($field, $path);
  303. $fieldRendererClass = $field->getFrontendModel();
  304. if ($fieldRendererClass) {
  305. $fieldRenderer = $this->_layout->getBlockSingleton($fieldRendererClass);
  306. } else {
  307. $fieldRenderer = $this->_fieldRenderer;
  308. }
  309. $fieldRenderer->setForm($this);
  310. $fieldRenderer->setConfigData($this->_configData);
  311. $elementName = $this->_generateElementName($field->getPath(), $fieldPrefix);
  312. $elementId = $this->_generateElementId($field->getPath($fieldPrefix));
  313. $dependencies = $field->getDependencies($fieldPrefix, $this->getStoreCode());
  314. $this->_populateDependenciesBlock($dependencies, $elementId, $elementName);
  315. $sharedClass = $this->_getSharedCssClass($field);
  316. $requiresClass = $this->_getRequiresCssClass($field, $fieldPrefix);
  317. $isReadOnly = $this->isReadOnly($field, $path);
  318. $formField = $fieldset->addField(
  319. $elementId,
  320. $field->getType(),
  321. [
  322. 'name' => $elementName,
  323. 'label' => $field->getLabel($labelPrefix),
  324. 'comment' => $field->getComment($data),
  325. 'tooltip' => $field->getTooltip(),
  326. 'hint' => $field->getHint(),
  327. 'value' => $data,
  328. 'inherit' => $inherit,
  329. 'class' => $field->getFrontendClass() . $sharedClass . $requiresClass,
  330. 'field_config' => $field->getData(),
  331. 'scope' => $this->getScope(),
  332. 'scope_id' => $this->getScopeId(),
  333. 'scope_label' => $this->getScopeLabel($field),
  334. 'can_use_default_value' => $this->canUseDefaultValue($field->showInDefault()),
  335. 'can_use_website_value' => $this->canUseWebsiteValue($field->showInWebsite()),
  336. 'can_restore_to_default' => $this->isCanRestoreToDefault($field->canRestore()),
  337. 'disabled' => $isReadOnly,
  338. 'is_disable_inheritance' => $isReadOnly
  339. ]
  340. );
  341. $field->populateInput($formField);
  342. if ($field->hasValidation()) {
  343. $formField->addClass($field->getValidation());
  344. }
  345. if ($field->getType() == 'multiselect') {
  346. $formField->setCanBeEmpty($field->canBeEmpty());
  347. }
  348. if ($field->hasOptions()) {
  349. $formField->setValues($field->getOptions());
  350. }
  351. $formField->setRenderer($fieldRenderer);
  352. }
  353. /**
  354. * Get data of field by path
  355. *
  356. * @param \Magento\Config\Model\Config\Structure\Element\Field $field
  357. * @param string $path
  358. * @return mixed|null|string
  359. */
  360. private function getFieldData(\Magento\Config\Model\Config\Structure\Element\Field $field, $path)
  361. {
  362. $data = $this->getAppConfigDataValue($path);
  363. $placeholderValue = $this->settingChecker->getPlaceholderValue(
  364. $path,
  365. $this->getScope(),
  366. $this->getStringScopeCode()
  367. );
  368. if ($placeholderValue) {
  369. $data = $placeholderValue;
  370. }
  371. if ($data === null) {
  372. $path = $field->getConfigPath() !== null ? $field->getConfigPath() : $path;
  373. $data = $this->getConfigValue($path);
  374. if ($field->hasBackendModel()) {
  375. $backendModel = $field->getBackendModel();
  376. // Backend models which implement ProcessorInterface are processed by ScopeConfigInterface
  377. if (!$backendModel instanceof ProcessorInterface) {
  378. $backendModel->setPath($path)
  379. ->setValue($data)
  380. ->setWebsite($this->getWebsiteCode())
  381. ->setStore($this->getStoreCode())
  382. ->afterLoad();
  383. $data = $backendModel->getValue();
  384. }
  385. }
  386. }
  387. return $data;
  388. }
  389. /**
  390. * Retrieve Scope string code
  391. *
  392. * @return string
  393. */
  394. private function getStringScopeCode()
  395. {
  396. $scopeCode = $this->getData('scope_string_code');
  397. if (null === $scopeCode) {
  398. if ($this->getStoreCode()) {
  399. $scopeCode = $this->_storeManager->getStore($this->getStoreCode())->getCode();
  400. } elseif ($this->getWebsiteCode()) {
  401. $scopeCode = $this->_storeManager->getWebsite($this->getWebsiteCode())->getCode();
  402. } else {
  403. $scopeCode = '';
  404. }
  405. $this->setData('scope_string_code', $scopeCode);
  406. }
  407. return $scopeCode;
  408. }
  409. /**
  410. * Populate dependencies block
  411. *
  412. * @param array $dependencies
  413. * @param string $elementId
  414. * @param string $elementName
  415. * @return void
  416. */
  417. protected function _populateDependenciesBlock(array $dependencies, $elementId, $elementName)
  418. {
  419. foreach ($dependencies as $dependentField) {
  420. /** @var $dependentField \Magento\Config\Model\Config\Structure\Element\Dependency\Field */
  421. $fieldNameFrom = $this->_generateElementName($dependentField->getId(), null, '_');
  422. $this->_getDependence()->addFieldMap(
  423. $elementId,
  424. $elementName
  425. )->addFieldMap(
  426. $this->_generateElementId($dependentField->getId()),
  427. $fieldNameFrom
  428. )->addFieldDependence(
  429. $elementName,
  430. $fieldNameFrom,
  431. $dependentField
  432. );
  433. }
  434. }
  435. /**
  436. * Generate element name
  437. *
  438. * @param string $elementPath
  439. * @param string $fieldPrefix
  440. * @param string $separator
  441. * @return string
  442. */
  443. protected function _generateElementName($elementPath, $fieldPrefix = '', $separator = '/')
  444. {
  445. $part = explode($separator, $elementPath);
  446. array_shift($part);
  447. //shift section name
  448. $fieldId = array_pop($part);
  449. //shift filed id
  450. $groupName = implode('][groups][', $part);
  451. $name = 'groups[' . $groupName . '][fields][' . $fieldPrefix . $fieldId . '][value]';
  452. return $name;
  453. }
  454. /**
  455. * Generate element id
  456. *
  457. * @param string $path
  458. * @return string
  459. */
  460. protected function _generateElementId($path)
  461. {
  462. return str_replace('/', '_', $path);
  463. }
  464. /**
  465. * Get config value
  466. *
  467. * @param string $path
  468. * @return mixed
  469. */
  470. public function getConfigValue($path)
  471. {
  472. return $this->_scopeConfig->getValue($path, $this->getScope(), $this->getScopeCode());
  473. }
  474. /**
  475. * @inheritdoc
  476. */
  477. protected function _beforeToHtml()
  478. {
  479. $this->initForm();
  480. return parent::_beforeToHtml();
  481. }
  482. /**
  483. * Append dependence block at then end of form block
  484. *
  485. * @param string $html
  486. * @return string
  487. */
  488. protected function _afterToHtml($html)
  489. {
  490. if ($this->_getDependence()) {
  491. $html .= $this->_getDependence()->toHtml();
  492. }
  493. $html = parent::_afterToHtml($html);
  494. return $html;
  495. }
  496. /**
  497. * Check if can use default value
  498. *
  499. * @param int $fieldValue
  500. * @return boolean
  501. */
  502. public function canUseDefaultValue($fieldValue)
  503. {
  504. if ($this->getScope() == self::SCOPE_STORES && $fieldValue) {
  505. return true;
  506. }
  507. if ($this->getScope() == self::SCOPE_WEBSITES && $fieldValue) {
  508. return true;
  509. }
  510. return false;
  511. }
  512. /**
  513. * Check if can use website value
  514. *
  515. * @param int $fieldValue
  516. * @return boolean
  517. */
  518. public function canUseWebsiteValue($fieldValue)
  519. {
  520. if ($this->getScope() == self::SCOPE_STORES && $fieldValue) {
  521. return true;
  522. }
  523. return false;
  524. }
  525. /**
  526. * Check if can use restore value
  527. *
  528. * @param int $fieldValue
  529. * @return bool
  530. * @since 100.1.0
  531. */
  532. public function isCanRestoreToDefault($fieldValue)
  533. {
  534. if ($this->getScope() == self::SCOPE_DEFAULT && $fieldValue) {
  535. return true;
  536. }
  537. return false;
  538. }
  539. /**
  540. * Retrieve current scope
  541. *
  542. * @return string
  543. */
  544. public function getScope()
  545. {
  546. $scope = $this->getData('scope');
  547. if ($scope === null) {
  548. if ($this->getStoreCode()) {
  549. $scope = self::SCOPE_STORES;
  550. } elseif ($this->getWebsiteCode()) {
  551. $scope = self::SCOPE_WEBSITES;
  552. } else {
  553. $scope = self::SCOPE_DEFAULT;
  554. }
  555. $this->setScope($scope);
  556. }
  557. return $scope;
  558. }
  559. /**
  560. * Retrieve label for scope
  561. *
  562. * @param \Magento\Config\Model\Config\Structure\Element\Field $field
  563. * @return string
  564. */
  565. public function getScopeLabel(\Magento\Config\Model\Config\Structure\Element\Field $field)
  566. {
  567. $showInStore = $field->showInStore();
  568. $showInWebsite = $field->showInWebsite();
  569. if ($showInStore == 1) {
  570. return $this->_scopeLabels[self::SCOPE_STORES];
  571. } elseif ($showInWebsite == 1) {
  572. return $this->_scopeLabels[self::SCOPE_WEBSITES];
  573. }
  574. return $this->_scopeLabels[self::SCOPE_DEFAULT];
  575. }
  576. /**
  577. * Get current scope code
  578. *
  579. * @return string
  580. */
  581. public function getScopeCode()
  582. {
  583. $scopeCode = $this->getData('scope_code');
  584. if ($scopeCode === null) {
  585. if ($this->getStoreCode()) {
  586. $scopeCode = $this->getStoreCode();
  587. } elseif ($this->getWebsiteCode()) {
  588. $scopeCode = $this->getWebsiteCode();
  589. } else {
  590. $scopeCode = '';
  591. }
  592. $this->setScopeCode($scopeCode);
  593. }
  594. return $scopeCode;
  595. }
  596. /**
  597. * Get current scope code
  598. *
  599. * @return int|string
  600. */
  601. public function getScopeId()
  602. {
  603. $scopeId = $this->getData('scope_id');
  604. if ($scopeId === null) {
  605. if ($this->getStoreCode()) {
  606. $scopeId = $this->_storeManager->getStore($this->getStoreCode())->getId();
  607. } elseif ($this->getWebsiteCode()) {
  608. $scopeId = $this->_storeManager->getWebsite($this->getWebsiteCode())->getId();
  609. } else {
  610. $scopeId = '';
  611. }
  612. $this->setScopeId($scopeId);
  613. }
  614. return $scopeId;
  615. }
  616. /**
  617. * Get additional element types
  618. *
  619. * @return array
  620. */
  621. protected function _getAdditionalElementTypes()
  622. {
  623. return [
  624. 'allowspecific' => \Magento\Config\Block\System\Config\Form\Field\Select\Allowspecific::class,
  625. 'image' => \Magento\Config\Block\System\Config\Form\Field\Image::class,
  626. 'file' => \Magento\Config\Block\System\Config\Form\Field\File::class
  627. ];
  628. }
  629. /**
  630. * Temporary moved those $this->getRequest()->getParam('blabla') from the code across this block
  631. * to getBlala() methods to be later set from controller with setters
  632. */
  633. /**
  634. * Enter description here...
  635. *
  636. * @TODO delete this methods when {^see above^} is done
  637. * @return string
  638. * @SuppressWarnings(PHPMD.RequestAwareBlockMethod)
  639. */
  640. public function getSectionCode()
  641. {
  642. return $this->getRequest()->getParam('section', '');
  643. }
  644. /**
  645. * Enter description here...
  646. *
  647. * @TODO delete this methods when {^see above^} is done
  648. * @return string
  649. * @SuppressWarnings(PHPMD.RequestAwareBlockMethod)
  650. */
  651. public function getWebsiteCode()
  652. {
  653. return $this->getRequest()->getParam('website', '');
  654. }
  655. /**
  656. * Enter description here...
  657. *
  658. * @TODO delete this methods when {^see above^} is done
  659. * @return string
  660. * @SuppressWarnings(PHPMD.RequestAwareBlockMethod)
  661. */
  662. public function getStoreCode()
  663. {
  664. return $this->getRequest()->getParam('store', '');
  665. }
  666. /**
  667. * Get css class for "shared" functionality
  668. *
  669. * @param \Magento\Config\Model\Config\Structure\Element\Field $field
  670. * @return string
  671. */
  672. protected function _getSharedCssClass(\Magento\Config\Model\Config\Structure\Element\Field $field)
  673. {
  674. $sharedClass = '';
  675. if ($field->getAttribute('shared') && $field->getConfigPath()) {
  676. $sharedClass = ' shared shared-' . str_replace('/', '-', $field->getConfigPath());
  677. return $sharedClass;
  678. }
  679. return $sharedClass;
  680. }
  681. /**
  682. * Get css class for "requires" functionality
  683. *
  684. * @param \Magento\Config\Model\Config\Structure\Element\Field $field
  685. * @param string $fieldPrefix
  686. * @return string
  687. */
  688. protected function _getRequiresCssClass(\Magento\Config\Model\Config\Structure\Element\Field $field, $fieldPrefix)
  689. {
  690. $requiresClass = '';
  691. $requiredPaths = array_merge($field->getRequiredFields($fieldPrefix), $field->getRequiredGroups($fieldPrefix));
  692. if (!empty($requiredPaths)) {
  693. $requiresClass = ' requires';
  694. foreach ($requiredPaths as $requiredPath) {
  695. $requiresClass .= ' requires-' . $this->_generateElementId($requiredPath);
  696. }
  697. return $requiresClass;
  698. }
  699. return $requiresClass;
  700. }
  701. /**
  702. * Retrieve Deployment Configuration object.
  703. *
  704. * @deprecated 100.1.2
  705. * @return DeploymentConfig
  706. */
  707. private function getAppConfig()
  708. {
  709. if ($this->appConfig === null) {
  710. $this->appConfig = ObjectManager::getInstance()->get(DeploymentConfig::class);
  711. }
  712. return $this->appConfig;
  713. }
  714. /**
  715. * Check Path is Readonly
  716. *
  717. * @param \Magento\Config\Model\Config\Structure\Element\Field $field
  718. * @param string $path
  719. * @return boolean
  720. */
  721. private function isReadOnly(\Magento\Config\Model\Config\Structure\Element\Field $field, $path)
  722. {
  723. $isReadOnly = $this->settingChecker->isReadOnly(
  724. $path,
  725. ScopeConfigInterface::SCOPE_TYPE_DEFAULT
  726. );
  727. if (!$isReadOnly) {
  728. $isReadOnly = $this->getElementVisibility()->isDisabled($field->getPath())
  729. ?: $this->settingChecker->isReadOnly($path, $this->getScope(), $this->getStringScopeCode());
  730. }
  731. return $isReadOnly;
  732. }
  733. /**
  734. * Retrieve deployment config data value by path
  735. *
  736. * @param string $path
  737. * @return null|string
  738. */
  739. private function getAppConfigDataValue($path)
  740. {
  741. $appConfig = $this->getAppConfig()->get(System::CONFIG_TYPE);
  742. $scope = $this->getScope();
  743. $scopeCode = $this->getStringScopeCode();
  744. if ($scope === ScopeConfigInterface::SCOPE_TYPE_DEFAULT) {
  745. $data = new DataObject(isset($appConfig[$scope]) ? $appConfig[$scope] : []);
  746. } else {
  747. $data = new DataObject(isset($appConfig[$scope][$scopeCode]) ? $appConfig[$scope][$scopeCode] : []);
  748. }
  749. return $data->getData($path);
  750. }
  751. /**
  752. * Gets instance of ElementVisibilityInterface.
  753. *
  754. * @return ElementVisibilityInterface
  755. * @deprecated 101.0.0 Added to not break backward compatibility of the constructor signature
  756. * by injecting the new dependency directly.
  757. * The method can be removed in a future major release, when constructor signature can be changed.
  758. * @since 101.0.0
  759. */
  760. public function getElementVisibility()
  761. {
  762. if (null === $this->elementVisibility) {
  763. $this->elementVisibility = ObjectManager::getInstance()->get(ElementVisibilityInterface::class);
  764. }
  765. return $this->elementVisibility;
  766. }
  767. }