id mapper * @var array */ protected $_fields = []; /** * Dependencies mapper (by names) * array( * 'dependent_name' => array( * 'depends_from_1_name' => 'mixed value', * 'depends_from_2_name' => 'some another value', * ... * ) * ) * @var array */ protected $_depends = []; /** * Additional configuration options for the dependencies javascript controller * * @var array */ protected $_configOptions = []; /** * @var \Magento\Config\Model\Config\Structure\Element\Dependency\FieldFactory */ protected $_fieldFactory; /** * @var \Magento\Framework\Json\EncoderInterface */ protected $_jsonEncoder; /** * @param \Magento\Backend\Block\Context $context * @param \Magento\Framework\Json\EncoderInterface $jsonEncoder * @param \Magento\Config\Model\Config\Structure\Element\Dependency\FieldFactory $fieldFactory * @param array $data */ public function __construct( \Magento\Backend\Block\Context $context, \Magento\Framework\Json\EncoderInterface $jsonEncoder, \Magento\Config\Model\Config\Structure\Element\Dependency\FieldFactory $fieldFactory, array $data = [] ) { $this->_jsonEncoder = $jsonEncoder; $this->_fieldFactory = $fieldFactory; parent::__construct($context, $data); } /** * Add name => id mapping * * @param string $fieldId - element ID in DOM * @param string $fieldName - element name in their fieldset/form namespace * @return \Magento\Backend\Block\Widget\Form\Element\Dependence */ public function addFieldMap($fieldId, $fieldName) { $this->_fields[$fieldName] = $fieldId; return $this; } /** * Register field name dependence one from each other by specified values * * @param string $fieldName * @param string $fieldNameFrom * @param \Magento\Config\Model\Config\Structure\Element\Dependency\Field|string $refField * @return \Magento\Backend\Block\Widget\Form\Element\Dependence */ public function addFieldDependence($fieldName, $fieldNameFrom, $refField) { if (!is_object($refField)) { /** @var $refField \Magento\Config\Model\Config\Structure\Element\Dependency\Field */ $refField = $this->_fieldFactory->create( ['fieldData' => ['value' => (string)$refField], 'fieldPrefix' => ''] ); } $this->_depends[$fieldName][$fieldNameFrom] = $refField; return $this; } /** * Add misc configuration options to the javascript dependencies controller * * @param array $options * @return \Magento\Backend\Block\Widget\Form\Element\Dependence */ public function addConfigOptions(array $options) { $this->_configOptions = array_merge($this->_configOptions, $options); return $this; } /** * HTML output getter * @return string */ protected function _toHtml() { if (!$this->_depends) { return ''; } return ''; } /** * Field dependences JSON map generator * @return string */ protected function _getDependsJson() { $result = []; foreach ($this->_depends as $to => $row) { foreach ($row as $from => $field) { /** @var $field \Magento\Config\Model\Config\Structure\Element\Dependency\Field */ $result[$this->_fields[$to]][$this->_fields[$from]] = [ 'values' => $field->getValues(), 'negative' => $field->isNegative(), ]; } } return $this->_jsonEncoder->encode($result); } }