Dependence.php 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Backend\Block\Widget\Form\Element;
  7. /**
  8. * Form element dependencies mapper
  9. * Assumes that one element may depend on other element values.
  10. * Will toggle as "enabled" only if all elements it depends from toggle as true.
  11. *
  12. * @api
  13. * @since 100.0.2
  14. */
  15. class Dependence extends \Magento\Backend\Block\AbstractBlock
  16. {
  17. /**
  18. * name => id mapper
  19. * @var array
  20. */
  21. protected $_fields = [];
  22. /**
  23. * Dependencies mapper (by names)
  24. * array(
  25. * 'dependent_name' => array(
  26. * 'depends_from_1_name' => 'mixed value',
  27. * 'depends_from_2_name' => 'some another value',
  28. * ...
  29. * )
  30. * )
  31. * @var array
  32. */
  33. protected $_depends = [];
  34. /**
  35. * Additional configuration options for the dependencies javascript controller
  36. *
  37. * @var array
  38. */
  39. protected $_configOptions = [];
  40. /**
  41. * @var \Magento\Config\Model\Config\Structure\Element\Dependency\FieldFactory
  42. */
  43. protected $_fieldFactory;
  44. /**
  45. * @var \Magento\Framework\Json\EncoderInterface
  46. */
  47. protected $_jsonEncoder;
  48. /**
  49. * @param \Magento\Backend\Block\Context $context
  50. * @param \Magento\Framework\Json\EncoderInterface $jsonEncoder
  51. * @param \Magento\Config\Model\Config\Structure\Element\Dependency\FieldFactory $fieldFactory
  52. * @param array $data
  53. */
  54. public function __construct(
  55. \Magento\Backend\Block\Context $context,
  56. \Magento\Framework\Json\EncoderInterface $jsonEncoder,
  57. \Magento\Config\Model\Config\Structure\Element\Dependency\FieldFactory $fieldFactory,
  58. array $data = []
  59. ) {
  60. $this->_jsonEncoder = $jsonEncoder;
  61. $this->_fieldFactory = $fieldFactory;
  62. parent::__construct($context, $data);
  63. }
  64. /**
  65. * Add name => id mapping
  66. *
  67. * @param string $fieldId - element ID in DOM
  68. * @param string $fieldName - element name in their fieldset/form namespace
  69. * @return \Magento\Backend\Block\Widget\Form\Element\Dependence
  70. */
  71. public function addFieldMap($fieldId, $fieldName)
  72. {
  73. $this->_fields[$fieldName] = $fieldId;
  74. return $this;
  75. }
  76. /**
  77. * Register field name dependence one from each other by specified values
  78. *
  79. * @param string $fieldName
  80. * @param string $fieldNameFrom
  81. * @param \Magento\Config\Model\Config\Structure\Element\Dependency\Field|string $refField
  82. * @return \Magento\Backend\Block\Widget\Form\Element\Dependence
  83. */
  84. public function addFieldDependence($fieldName, $fieldNameFrom, $refField)
  85. {
  86. if (!is_object($refField)) {
  87. /** @var $refField \Magento\Config\Model\Config\Structure\Element\Dependency\Field */
  88. $refField = $this->_fieldFactory->create(
  89. ['fieldData' => ['value' => (string)$refField], 'fieldPrefix' => '']
  90. );
  91. }
  92. $this->_depends[$fieldName][$fieldNameFrom] = $refField;
  93. return $this;
  94. }
  95. /**
  96. * Add misc configuration options to the javascript dependencies controller
  97. *
  98. * @param array $options
  99. * @return \Magento\Backend\Block\Widget\Form\Element\Dependence
  100. */
  101. public function addConfigOptions(array $options)
  102. {
  103. $this->_configOptions = array_merge($this->_configOptions, $options);
  104. return $this;
  105. }
  106. /**
  107. * HTML output getter
  108. *
  109. * @return string
  110. */
  111. protected function _toHtml()
  112. {
  113. if (!$this->_depends) {
  114. return '';
  115. }
  116. $params = $this->_getDependsJson();
  117. if ($this->_configOptions) {
  118. $params .= ', ' . $this->_jsonEncoder->encode($this->_configOptions);
  119. }
  120. return "<script>
  121. require(['mage/adminhtml/form'], function(){
  122. new FormElementDependenceController({$params});
  123. });
  124. </script>";
  125. }
  126. /**
  127. * Field dependencies JSON map generator
  128. *
  129. * @return string
  130. */
  131. protected function _getDependsJson()
  132. {
  133. $result = [];
  134. foreach ($this->_depends as $to => $row) {
  135. foreach ($row as $from => $field) {
  136. /** @var $field \Magento\Config\Model\Config\Structure\Element\Dependency\Field */
  137. $result[$this->_fields[$to]][$this->_fields[$from]] = [
  138. 'values' => $field->getValues(),
  139. 'negative' => $field->isNegative(),
  140. ];
  141. }
  142. }
  143. return $this->_jsonEncoder->encode($result);
  144. }
  145. }