123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160 |
- <?php
- /**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
- namespace Magento\Backend\Block\Widget\Form\Element;
- /**
- * Form element dependencies mapper
- * Assumes that one element may depend on other element values.
- * Will toggle as "enabled" only if all elements it depends from toggle as true.
- *
- * @api
- * @since 100.0.2
- */
- class Dependence extends \Magento\Backend\Block\AbstractBlock
- {
- /**
- * name => 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 '';
- }
- $params = $this->_getDependsJson();
- if ($this->_configOptions) {
- $params .= ', ' . $this->_jsonEncoder->encode($this->_configOptions);
- }
- return "<script>
- require(['mage/adminhtml/form'], function(){
- new FormElementDependenceController({$params});
- });
- </script>";
- }
- /**
- * Field dependencies 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);
- }
- }
|