25 class Form extends \Magento\Backend\Block\Widget\Form\Generic
113 private $settingChecker;
126 private $elementVisibility;
141 \
Magento\Framework\Data\FormFactory $formFactory,
143 \
Magento\Config\Model\Config\Structure $configStructure,
150 $this->_configStructure = $configStructure;
151 $this->_fieldsetFactory = $fieldsetFactory;
152 $this->_fieldFactory = $fieldFactory;
154 $this->_scopeLabels = [
155 self::SCOPE_DEFAULT =>
__(
'[GLOBAL]'),
156 self::SCOPE_WEBSITES =>
__(
'[WEBSITE]'),
157 self::SCOPE_STORES =>
__(
'[STORE VIEW]'),
165 private function getSettingChecker()
167 if ($this->settingChecker ===
null) {
170 return $this->settingChecker;
180 $this->_configDataObject = $this->_configFactory->create(
190 $this->_configData = $this->_configDataObject->load();
191 $this->_fieldsetRenderer = $this->_fieldsetFactory->create();
192 $this->_fieldRenderer = $this->_fieldFactory->create();
201 public function initForm()
206 $form = $this->_formFactory->create();
208 $section = $this->_configStructure->getElement($this->
getSectionCode());
209 if ($section && $section->isVisible($this->getWebsiteCode(), $this->
getStoreCode())) {
210 foreach ($section->getChildren() as
$group) {
229 \
Magento\Config\Model\Config\Structure\Element\Section $section,
232 $frontendModelClass =
$group->getFrontendModel();
233 $fieldsetRenderer = $frontendModelClass ? $this->_layout->getBlockSingleton(
237 $fieldsetRenderer->setForm($this);
238 $fieldsetRenderer->setConfigData($this->_configData);
239 $fieldsetRenderer->setGroup(
$group);
242 'legend' =>
$group->getLabel(),
243 'comment' =>
$group->getComment(),
244 'expanded' =>
$group->isExpanded(),
245 'group' =>
$group->getData(),
248 $fieldset = $form->addFieldset($this->
_generateElementId($group->getPath()), $fieldsetConfig);
249 $fieldset->setRenderer($fieldsetRenderer);
250 $group->populateFieldset($fieldset);
257 $this->_populateDependenciesBlock($dependencies, $elementId,
$elementName);
259 if (
$group->shouldCloneFields()) {
260 $cloneModel =
$group->getCloneModel();
261 foreach ($cloneModel->getPrefixes() as
$prefix) {
265 $this->initFields($fieldset,
$group, $section);
268 $this->_fieldsets[
$group->getId()] = $fieldset;
279 $this->
addChild(
'element_dependence', \
Magento\Backend\Block\Widget\
Form\Element\Dependence::class);
294 public function initFields(
295 \
Magento\Framework\Data\
Form\Element\Fieldset $fieldset,
297 \
Magento\Config\Model\Config\Structure\Element\Section $section,
301 if (!$this->_configDataObject) {
306 $extraConfigGroups = [];
310 if (
$element instanceof \
Magento\Config\Model\Config\Structure\Element\Group) {
314 if (
$element->getSectionId() != $section->getId()) {
315 $groupPath =
$element->getGroupPath();
316 if (!isset($extraConfigGroups[$groupPath])) {
317 $this->_configData = $this->_configDataObject->extendConfig(
322 $extraConfigGroups[$groupPath] =
true;
342 \
Magento\Config\Model\Config\Structure\Element\Field $field,
343 \
Magento\Framework\Data\
Form\Element\Fieldset $fieldset,
348 $inherit = !array_key_exists(
$path, $this->_configData);
351 $fieldRendererClass = $field->getFrontendModel();
352 if ($fieldRendererClass) {
353 $fieldRenderer = $this->_layout->getBlockSingleton($fieldRendererClass);
358 $fieldRenderer->setForm($this);
359 $fieldRenderer->setConfigData($this->_configData);
364 $dependencies = $field->getDependencies($fieldPrefix, $this->
getStoreCode());
365 $this->_populateDependenciesBlock($dependencies, $elementId,
$elementName);
371 ?: $this->getSettingChecker()->isReadOnly(
$path, $this->
getScope(), $this->getStringScopeCode());
372 $formField = $fieldset->addField(
377 'label' => $field->getLabel($labelPrefix),
378 'comment' => $field->getComment(
$data),
379 'tooltip' => $field->getTooltip(),
380 'hint' => $field->getHint(),
382 'inherit' => $inherit,
383 'class' => $field->getFrontendClass() . $sharedClass . $requiresClass,
384 'field_config' => $field->getData(),
391 'disabled' => $isReadOnly,
392 'is_disable_inheritance' => $isReadOnly
395 $field->populateInput($formField);
397 if ($field->hasValidation()) {
398 $formField->addClass($field->getValidation());
400 if ($field->getType() ==
'multiselect') {
401 $formField->setCanBeEmpty($field->canBeEmpty());
403 if ($field->hasOptions()) {
404 $formField->setValues($field->getOptions());
406 $formField->setRenderer($fieldRenderer);
416 private function getFieldData(\
Magento\Config\Model\Config\Structure\Element\Field $field,
$path)
420 $placeholderValue = $this->getSettingChecker()->getPlaceholderValue(
423 $this->getStringScopeCode()
426 if ($placeholderValue) {
427 $data = $placeholderValue;
430 if (
$data ===
null) {
431 $path = $field->getConfigPath() !==
null ? $field->getConfigPath() :
$path;
433 if ($field->hasBackendModel()) {
434 $backendModel = $field->getBackendModel();
436 if (!$backendModel instanceof ProcessorInterface) {
437 $backendModel->setPath(
$path)
442 $data = $backendModel->getValue();
455 private function getStringScopeCode()
457 $scopeCode = $this->
getData(
'scope_string_code');
459 if (
null === $scopeCode) {
461 $scopeCode = $this->_storeManager->getStore($this->
getStoreCode())->getCode();
463 $scopeCode = $this->_storeManager->getWebsite($this->
getWebsiteCode())->getCode();
468 $this->
setData(
'scope_string_code', $scopeCode);
482 protected function _populateDependenciesBlock(array $dependencies, $elementId,
$elementName)
484 foreach ($dependencies as $dependentField) {
493 )->addFieldDependence(
511 $part = explode($separator, $elementPath);
516 $groupName = implode(
'][groups][', $part);
517 $name =
'groups[' . $groupName .
'][fields][' . $fieldPrefix .
$fieldId .
'][value]';
529 return str_replace(
'/',
'_',
$path);
549 return parent::_beforeToHtml();
563 $html = parent::_afterToHtml($html);
575 if ($this->
getScope() == self::SCOPE_STORES && $fieldValue) {
578 if ($this->
getScope() == self::SCOPE_WEBSITES && $fieldValue) {
592 if ($this->
getScope() == self::SCOPE_STORES && $fieldValue) {
607 if ($this->
getScope() == self::SCOPE_DEFAULT && $fieldValue) {
620 $scope = $this->
getData(
'scope');
621 if ($scope ===
null) {
629 $this->setScope($scope);
643 $showInStore = $field->showInStore();
644 $showInWebsite = $field->showInWebsite();
646 if ($showInStore == 1) {
648 }
elseif ($showInWebsite == 1) {
661 $scopeCode = $this->
getData(
'scope_code');
662 if ($scopeCode ===
null) {
670 $this->setScopeCode($scopeCode);
683 $scopeId = $this->
getData(
'scope_id');
684 if ($scopeId ===
null) {
686 $scopeId = $this->_storeManager->getStore($this->
getStoreCode())->getId();
688 $scopeId = $this->_storeManager->getWebsite($this->
getWebsiteCode())->getId();
692 $this->setScopeId($scopeId);
705 'allowspecific' => \Magento\Config\Block\System\Config\Form\Field\Select\Allowspecific::class,
706 'image' => \Magento\Config\Block\System\Config\Form\Field\Image::class,
707 'file' => \Magento\Config\Block\System\Config\Form\Field\File::class
724 return $this->
getRequest()->getParam(
'section',
'');
735 return $this->
getRequest()->getParam(
'website',
'');
746 return $this->
getRequest()->getParam(
'store',
'');
758 if ($field->getAttribute(
'shared') && $field->getConfigPath()) {
759 $sharedClass =
' shared shared-' . str_replace(
'/',
'-', $field->getConfigPath());
775 $requiredPaths = array_merge($field->getRequiredFields($fieldPrefix), $field->getRequiredGroups($fieldPrefix));
776 if (!empty($requiredPaths)) {
777 $requiresClass =
' requires';
778 foreach ($requiredPaths as $requiredPath) {
781 return $requiresClass;
783 return $requiresClass;
792 private function getAppConfig()
794 if ($this->appConfig ===
null) {
797 return $this->appConfig;
806 private function getAppConfigDataValue(
$path)
810 $scopeCode = $this->getStringScopeCode();
813 $data =
new DataObject(isset($appConfig[$scope]) ? $appConfig[$scope] : []);
815 $data =
new DataObject(isset($appConfig[$scope][$scopeCode]) ? $appConfig[$scope][$scopeCode] : []);
831 if (
null === $this->elementVisibility) {
835 return $this->elementVisibility;
getData($key='', $index=null)
elseif(isset( $params[ 'redirect_parent']))
addChild($alias, $block, $data=[])
setData($key, $value=null)
if(!isset($_GET['name'])) $name