Làm thế nào để làm cho các trường của bộ trường đa năng?


7

Tôi có một fieldset trong bảng quản trị với một phụ huynh chọn (có 5 lựa chọn) và 2 lĩnh vực , trong đó sẽ được hiển thị trong trường hợp giá trị cha mẹ chọn sẽ là 3, 4 hoặc 5. Tôi đã không tìm thấy những ví dụ của logic tương tự trong magento và đã cố gắng viết bằng cách tương tự với sự phụ thuộc thông thường, nhưng nó không hoạt động. Trong ví dụ của tôi, các trường phụ thuộc chỉ được hiển thị trong khi chọn các tùy chọn có giá trị 5 ở dạng chọn và không được hiển thị khi chọn 1, 2, 3 hoặc 4.

Mã đầy đủ (ví dụ về khối):

<?php

namespace Siarhey\Test\Block\Adminhtml\Promo\Quote\Edit\Tab;

class Actions extends \Magento\Backend\Block\Widget\Form\Generic implements
    \Magento\Backend\Block\Widget\Tab\TabInterface
{
    /**
     * @param \Magento\Backend\Block\Template\Context $context
     * @param \Magento\Framework\Registry $registry
     * @param \Magento\Framework\Data\FormFactory $formFactory
     * @param array $data
     */
    public function __construct(
        \Magento\Backend\Block\Template\Context $context,
        \Magento\Framework\Registry $registry,
        \Magento\Framework\Data\FormFactory $formFactory,
        array $data = []
    ) {
        parent::__construct($context, $registry, $formFactory, $data);
    }

    public function getTabLabel()
    {
        return __('Actions');
    }

    public function getTabTitle()
    {
        return __('Actions');
    }

    public function canShowTab()
    {
        return true;
    }

    public function isHidden()
    {
        return false;
    }

    protected function _prepareForm()
    {
        $model = $this->_coreRegistry->registry('current_promo_quote_rule');

        /** @var \Magento\Framework\Data\Form $form */
        $form = $this->_formFactory->create();
        $form->setHtmlIdPrefix('rule_');

        $fieldset = $form->addFieldset(
            'action_fieldset',
            ['legend' => __('Rules')]
        );

        $parentField = $fieldset->addField(
            'simple_action',
            'select',
            [
                'label' => __('Apply'),
                'name' => 'simple_action',
                'options' => [
                    1 => __('Amount 1'),
                    2 => __('Discount 1'),
                    3 => __('Amount 2'),
                    4 => __('Discount 2'),
                ]
            ]
        );

        $childFieldOne = $fieldset->addField(
            'amount',
            'text',
            [
                'name' => 'amount',
                'required' => true,
                'class' => 'validate-not-negative-number',
                'label' => __('Amount')
            ]
        );
        $model->setAmount($model->getAmount() * 1);

        $childFieldTwo = $fieldset->addField(
            'percent',
            'text',
            ['name' => 'percent', 'label' => __('Percent')]
        );
        $model->setPercent($model->getPercent() * 1);

        $this->setChild(
            'form_after',
            $this->getLayout()->createBlock(
                'Magento\Backend\Block\Widget\Form\Element\Dependence'
            )->addFieldMap(
                $parentField->getHtmlId(),
                $parentField->getName()
            )->addFieldMap(
                $childFieldOne->getHtmlId(),
                $childFieldOne->getName()
            )->addFieldMap(
                $childFieldTwo->getHtmlId(),
                $childFieldTwo->getName()
            )->addFieldDependence(
                $childFieldOne->getName(),
                $parentField->getName(),
                '1,3'
            )->addFieldDependence(
                $childFieldTwo->getName(),
                $parentField->getName(),
                '2,4'
            )
        );

        $form->setValues($model->getData());

        if ($model->isReadonly()) {
            foreach ($fieldset->getElements() as $element) {
                $element->setReadonly(true, true);
            }
        }

        $this->setForm($form);
        return parent::_prepareForm();
    }
}

Kết quả (xem):

lựa chọn 1
Tùy chọn 1 được chọn

Lựa chọn 4 Tùy chọn 4 được chọn

Không phụ thuộc Không phụ thuộc

Mã mẫu 1 (không hoạt động):

/*
 * $parentField is select with values (0,1,2,3,4,5)
 */
$this->setChild(
    'form_after',
    $this->getLayout()->createBlock(
        'Magento\Backend\Block\Widget\Form\Element\Dependence'
    )->addFieldMap(
        $parentField->getHtmlId(),
        $parentField->getName()
    )->addFieldMap(
        $childFieldOne->getHtmlId(),
        $childFieldOne->getName()
    )->addFieldDependence(
        $childFieldOne->getName(),
        $parentField->getName(),
        '3'
    )->addFieldDependence(
        $childFieldOne->getName(),
        $parentField->getName(),
        '4'
    )->addFieldDependence(
        $childFieldOne->getName(),
        $parentField->getName(),
        '5'
    )->addFieldMap(
        $parentField->getHtmlId(),
        $parentField->getName()
    )->addFieldMap(
        $childFieldTwo->getHtmlId(),
        $childFieldTwo->getName()
    )->addFieldDependence(
        $childFieldTwo->getName(),
        $parentField->getName(),
        '3'
    )->addFieldDependence(
        $childFieldTwo->getName(),
        $parentField->getName(),
        '4'
    )->addFieldDependence(
        $childFieldTwo->getName(),
        $parentField->getName(),
        '5'
    )
);

Mã mẫu 2 (không hoạt động):

/*
 * $parentField is select with values (0,1,2,3,4,5)
 */
$this->setChild(
    'form_after',
    $this->getLayout()->createBlock(
        'Magento\Backend\Block\Widget\Form\Element\Dependence'
    )->addFieldMap(
        $parentField->getHtmlId(),
        $parentField->getName()
    )->addFieldMap(
        $childFieldOne->getHtmlId(),
        $childFieldOne->getName()
    )->addFieldMap(
        $parentField->getHtmlId(),
        $parentField->getName()
    )->addFieldMap(
        $childFieldTwo->getHtmlId(),
        $childFieldTwo->getName()
    )->addFieldDependence(
        $childFieldOne->getName(),
        $parentField->getName(),
        array('3', '4', '5')
    )->addFieldDependence(
        $childFieldTwo->getName(),
        $parentField->getName(),
        array('3', '4', '5')
    )
);

Kết quả:

Lưu ý: Chuyển đổi mảng thành chuỗi trong /var/www/magento2/app/code/Magento/Backend/Block/Widget/Form/Euity/Dependence.php trên dòng 95

CẬP NHẬT:


Mã mẫu 3 (không hoạt động, nếu giá trị được chọn không '3,4,5'):

// Parent field
$typeField = $fieldset->addField(
    'action_type',
    'select',
    [
        'label' => __('Type'),
        'name' => 'action_type',
        'options' => ['1' => 1, '2' => 2, '3' => 3, '4' => 4, '5' => 5, '3,4,5' => '3,4,5']
    ]
);

$this->setChild(
    'form_after',
    $this->getLayout()->createBlock(
        'Magento\Backend\Block\Widget\Form\Element\Dependence'
    )->addFieldMap(
        $parentField->getHtmlId(),
        $parentField->getName()
    )->addFieldMap(
        $childFieldOne->getHtmlId(),
        $childFieldOne->getName()
    )->addFieldMap(
        $typeField->getHtmlId(),
        $typeField->getName()
    )->addFieldMap(
        $childFieldTwo->getHtmlId(),
        $childFieldTwo->getName()
    )->addFieldDependence(
        $childFieldOne->getName(),
        $parentField->getName(),
        '3,4,5'
    )->addFieldDependence(
        $childFieldTwo->getName(),
        $parentField->getName(),
        '3,4,5'
    )
);

Có ai đó phải đối mặt với cùng một vấn đề và tìm thấy một giải pháp?

Cập nhật:

Có lẽ người khác có thể kiểm tra sự hiện diện của vấn đề này? Tôi đã kiểm tra nó trên 3 cài đặt khác nhau và giải pháp này (dòng có các giá trị hôn mê được phân tách) vẫn không hoạt động.


Bạn có thể hiển thị đầy đủ mã của bạn, Nó hoạt động cho tôi.
Sohel Rana

@SohelRana Tôi cần sao chép nó ngay bây giờ (Tôi đang ở nhà). Tôi sẽ có thể xuất bản nó trong khoảng một giờ. Cảm ơn bạn đã giúp đỡ :)
Siarhey Uchukhlebau

@SohelRana Tôi đã cập nhật câu hỏi của mình với mã của khối và ảnh chụp màn hình (kết quả)
Siarhey Uchukhlebau

Kiểm tra cập nhật câu trả lời.
Sohel Rana

Tôi chỉ kiểm tra nó với M2.0.4, và nó hoạt động
Sohel Rana

Câu trả lời:


6

Nếu bạn kiểm tra mã chịu trách nhiệm thêm các trường tương ứng theo các phụ thuộc trong tệp lib/web/mage/adminhtml/form.js, bạn sẽ thấy sơ đồ sau đây:

    var shouldShowUp = true;
    for (var idFrom in valuesFrom) {
        var from = $(idFrom);
        if (from) {
            var values = valuesFrom[idFrom]['values'];
            var isInArray = values.indexOf(from.value) != -1;
            var isNegative = valuesFrom[idFrom]['negative'];
            if (!from || isInArray && isNegative || !isInArray && !isNegative) {
                shouldShowUp = false;
            }
        }
    }

Trong trường hợp bạn đặt các giá trị được phân tách bằng dấu phẩy, ví dụ:

    /** @var \Magento\Backend\Block\Widget\Form\Element\Dependence $blockDependence */
    $blockDependence->addFieldMap(
        $actionType->getHtmlId(),
        $actionType->getName()
    )->addFieldMap(
        $amountField->getHtmlId(),
        $amountField->getName()
    )->addFieldDependence(
        $amountField->getName(),
        $actionType->getName(),
        implode(',', array(
            Rule::ACTION_TYPE_OVERWRITE_COST,
            Rule::ACTION_TYPE_ADD_SURCHARGE,
            Rule::ACTION_TYPE_ENABLE_SM_AND_OVERWRITE_COST
        ))
    );

sau đó trong khi gỡ lỗi, bạn sẽ thấy indexOfđang cố gắng tìm giá trị hiện có trong mảng một phần tử, trong trường hợp của bạn, là giá trị được phân tách bằng dấu phẩy. Yếu tố này không thể được tìm thấy:

nhập mô tả hình ảnh ở đây

Một đầu ra từng bước của console.logphương thức:

console.log(values);
console.log('Value: '+from.value);
console.log('Is in array: '+isInArray);

Để tạo nhiều trường phụ thuộc, bạn có thể sử dụng cùng một giá trị được phân tách bằng hôn mê, nhưng với một số sửa đổi. Bạn sẽ chỉ cần khối, điều đó sẽ mở rộng \Magento\Backend\Block\Widget\Form\Element\Dependence:

<?php

namespace Vendor\Module\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.
 */
class Dependence extends \Magento\Backend\Block\Widget\Form\Element\Dependence
{
    /**
     * @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 = []
    )
    {
        parent::_construct($context, $jsonEncoder, $fieldFactory, $data);
    }

    /**
     * {@inheritdoc}
     */
    protected function _toHtml()
    {
        if (!$this->_depends) {
            return '';
        }

        return '<script>
                require(["uiRegistry", "mage/adminhtml/form"], function(registry) {
                    var controller = new FormElementDependenceController(' . $this->_getDependsJson() .
        ($this->_configOptions ? ', ' .
            $this->_jsonEncoder->encode(
                $this->_configOptions
            ) : '') . ');
                    registry.set("formDependenceController", controller);
                });</script>';
    }

    /**
     * Field dependences JSON map generator * @return string
     */
    protected function _getDependsJson()
    {
        $result = [];
        foreach ($this->_depends as $to => $row) {
            foreach ($row as $from => $field) {
                $values = $this->_prepareValues($field->getValues());
                /** @var $field \Magento\Config\Model\Config\Structure\Element\Dependency\Field */
                $result[$this->_fields[$to]][$this->_fields[$from]] = [
                    'values' => $values,
                    'negative' => $field->isNegative(),
                ];
            }
        }
        return $this->_jsonEncoder->encode($result);
    }

    /**
     * @param $values
     * @return array
     */
    protected function _prepareValues($values)
    {
        if (!is_array($values)) {
            return $values;
        }

        $result = array();
        foreach ($values as $value) {
            if (stripos($value, ',')) {
                $result += explode(',', $value);
            } else {
                $result += $value;
            }
        }

        return $result;
    }
}

Như bạn có thể thấy, giá trị là FORCED được thay đổi thành mảng 1 giá trị.

Vấn đề chính nằm ở addFieldDependencelớp \Magento\Backend\Block\Widget\Form\Element\Dependence:

Điểm đáng chú ý là giá trị (dòng từ phụ thuộc), được chuyển dưới dạng phần tử duy nhất của mảng. indexOfcố gắng tìm giá trị của tùy chọn đã chọn tương ứng, nhưng không xác định được kết quả khớp chính xác. Kết quả là, nó trả về 'false'.

Cũng không có cách nào để chuyển các giá trị dưới dạng một mảng, vì PHP trả về Notice: Array to string conversionvì chuyển đổi 'value' => (string)$refField.

Trong ví dụ của chúng tôi, chúng tôi đã tạo lại mảng một phần tử thành một phần tử đa phần tử, trong đó mỗi phần tử bao gồm một số phụ thuộc.

Mã của sự phụ thuộc của bạn nên được sửa đổi (bạn sẽ cần thay đổi khối). Đây là cách để:

// Dependency START
/** @var \Magento\Backend\Block\Widget\Form\Element\Dependence $blockDependence */
$blockDependence = $this->getLayout()->createBlock(
// 'Magento\Backend\Block\Widget\Form\Element\Dependence'
'{Vendor}\{Module}\Block\Widget\Form\Element\Dependence'
);

$blockDependence->addFieldMap(
    $parentField->getHtmlId(),
    $parentField->getName()
)->addFieldMap(
    $childFieldOne->getHtmlId(),
    $childFieldOne->getName()
)->addFieldMap(
    $childFieldTwo->getHtmlId(),
    $childFieldTwo->getName()
)->addFieldDependence(
    $childFieldOne->getName(),
    $parentField->getName(),
    '1,3'
)->addFieldDependence(
    $childFieldTwo->getName(),
    $parentField->getName(),
    '2,4'
);

$this->setChild('form_after', $blockDependence);
// Dependency END

Kết quả sẽ như thế này:

nhập mô tả hình ảnh ở đây

CẬP NHẬT

Nếu bạn chắc chắn rằng bạn sẽ sử dụng một giá trị được phân tách bằng dấu phẩy trong tương lai, cách tốt nhất sẽ là thêm const UNIQUE_DELIMITERvới giá trị bắt buộc của dấu phân cách vào lớp Vendor\Module\Block\Widget\Form\Element\Dependence: Ví dụ

const UNIQUE_DELIMITER = '~#!~';

Tiếp theo, sửa đổi phương thức phân vùng:

/**
 * @param $values
 * @return array
 */
protected function _prepareValues($values)
{
    if (!is_array($values)) {
        return $values;
    }

    $result = array();
    foreach ($values as $value) {
        if (stripos($value, self::UNIQUE_DELIMITER)) {
            $result += explode(self::UNIQUE_DELIMITER, $value);
        } else {
            $result += $value;
        }
    }

    return $result;
}

Sau đó, sử dụng Vendor\Module\Block\Widget\Form\Element\Dependence::UNIQUE_DELIMITERtrong lớp học của bạn Actions.

Để thuận tiện cho bạn, hãy thêm lớp Dependence(sau không gian tên):

use Vendor\Module\Block\Widget\Form\Element\Dependence;

Và viết mã theo cách này:

 // Dependency START
    /** @var \Magento\Backend\Block\Widget\Form\Element\Dependence $blockDependence */
    $blockDependence = $this->getLayout()->createBlock(
    // 'Magento\Backend\Block\Widget\Form\Element\Dependence'
        '{Vendor}\{Module}\Block\Widget\Form\Element\Dependence'
    );

    $childFieldOneToParentValues = implode(Dependence::UNIQUE_DELIMITER, array('1','3'));
    $childFieldTwoToParentValues = implode(Dependence::UNIQUE_DELIMITER, array('2','4'));

    $blockDependence->addFieldMap(
        $parentField->getHtmlId(),
        $parentField->getName()
    )->addFieldMap(
        $childFieldOne->getHtmlId(),
        $childFieldOne->getName()
    )->addFieldMap(
        $childFieldTwo->getHtmlId(),
        $childFieldTwo->getName()
    )->addFieldDependence(
        $childFieldOne->getName(),
        $parentField->getName(),
        $childFieldOneToParentValues
    )->addFieldDependence(
        $childFieldTwo->getName(),
        $parentField->getName(),
        $childFieldTwoToParentValues
    );

    $this->setChild('form_after', $blockDependence);
    // Dependency END

2
Giải thích hay, tôi chỉ tự hỏi điều gì sẽ xảy ra nếu một trong các giá trị là một chuỗi có dấu phẩy hãy nói "15,50"? Mã sẽ xử lý như hai giá trị vẫn còn hoặc xử lý đúng như một giá trị?
Raphael tại Digital Pianism

@RaphaelatDigitalPianism Câu hỏi hợp lý :)
Siarhey Uchukhlebau

Cảm ơn bạn vì câu trả lời! Tôi sẽ cố gắng thực hiện giải pháp này ngày hôm nay và kiểm tra nó. Sẽ thật tuyệt, nếu bạn có thể cập nhật câu trả lời của mình bằng giải pháp cho trường hợp Raphael.
Siarhey Uchukhlebau

@RaphaelatDigitalPianism chúng tôi đã cập nhật phản hồi của chúng tôi (xin lỗi, đầu tiên chúng tôi đã đăng nhầm thành chủ đề sai). :)
MageWorx

@MageWorx Bây giờ tôi đã kiểm tra nó và nó hoạt động. Cảm ơn sự giúp đỡ của bạn :)
Siarhey Uchukhlebau

2

Tôi có thể sai nhưng thật không may, tôi không nghĩ bạn có thể với Magento\Backend\Block\Widget\Form\Element\Dependencelớp mặc định .

Hãy để tôi giải thích:

Các addFieldDependencephương pháp như sau:

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;
}

Vì vậy, hãy nói rằng bạn thử mã này:

addFieldDependence($child,$parent,'2,4')

Các valuecủa $refFieldsẽ là chuỗi sau: 2,4như vậy là không có giá trị như vậy trong bạn chọn nó sẽ không bao giờ làm việc.

Nếu bạn thử mã này:

addFieldDependence($child,$parent,array('2,4'))

Bạn sẽ nhận được Array to string conversionlỗi vì (string)$refField

Nếu bạn thử mã này:

addFieldDependence($child,$parent,'2')->addFieldDependence($child,$parent,'4')

Cuộc gọi đầu tiên sẽ đặt $refFieldgiá trị 2 và gán nó cho các phụ thuộc bằng mã sau:

$this->_depends[$fieldName][$fieldNameFrom] = $refField;

Tuy nhiên, mã thứ hai sẽ ghi đè lên sự phụ thuộc đó bởi vì $fieldName$fieldNameFromcác biến giống nhau trong suốt cuộc gọi đầu tiên.

Bạn có giải pháp gì?

  • Sử dụng các tùy chọn hoặc plugin để sửa đổi hành vi của Magento\Backend\Block\Widget\Form\Element\Dependencelớp

Các phương pháp quan trọng để xem xét ở đây là addFieldDependence_getDependsJson. Vấn đề ở đây là có rất nhiều cơ hội mà bạn cũng có thể phải sửa đổi FormElementDependenceControllerlớp JavaScript xử lý các phụ thuộc.

  • Sử dụng một số trường trùng lặp với các tên khác nhau: điều này thật bẩn nhưng tôi nghĩ nó sẽ hoạt động.

Thí dụ:

    $parentField = $fieldset->addField(
        'simple_action',
        'select',
        [
            'label' => __('Apply'),
            'name' => 'simple_action',
            'options' => [
                1 => __('Amount 1'),
                2 => __('Discount 1'),
                3 => __('Amount 2'),
                4 => __('Discount 2'),
            ]
        ]
    );

    $childFieldOne = $fieldset->addField(
        'amount',
        'text',
        [
            'name' => 'amount',
            'required' => true,
            'class' => 'validate-not-negative-number',
            'label' => __('Amount')
        ]
    );

    $childFieldOneCopy = $fieldset->addField(
        'amount',
        'text',
        [
            'name' => 'amount',
            'required' => true,
            'class' => 'validate-not-negative-number',
            'label' => __('Amount')
        ]
    );

Sau đó sử dụng:

->addFieldDependence(
            $childFieldOne->getName(),
            $parentField->getName(),
            '1'
        )    
->addFieldDependence(
            $childFieldOneCopy->getName(),
            $parentField->getName(),
            '3'
        )

Vấn đề ở đây là bạn sẽ phải thêm một số kiểm tra trong bộ điều khiển xử lý dữ liệu để đảm bảo bạn đang xử lý đúng dữ liệu chứ không phải trường sao chép ẩn.


Cảm ơn bạn vì câu trả lời. Bây giờ thì rõ ràng hơn. Theo bạn, giải pháp nào tốt hơn: sử dụng một số lĩnh vực hoặc tạo Form\Element\Dependencekhối riêng ?
Siarhey Uchukhlebau

1
@SiarheyUchukhlebau như tôi đã nói trong câu trả lời của tôi, tạo ra của riêng bạn Form\Element\Dependencelà cách nó nên được thực hiện. Vấn đề là có thể bạn sẽ mất nhiều thời gian để phát triển tính năng như vậy vì bạn có rất nhiều tệp khác nhau để xử lý. Giải pháp một số lĩnh vực thì bẩn hơn nhưng tôi khá chắc chắn khi sử dụng phương pháp đó bạn có thể có được những gì bạn muốn một cách nhanh chóng và nó sẽ hoạt động mà không có khả năng phá vỡ bất cứ điều gì
Raphael tại Digital Pianism

2

Tôi nghĩ rằng bạn nên nhìn lớp học Magento\Backend\Block\Widget\Form\Element\Dependence. Bạn có thể tạo khối riêng của mình được kế thừa từ lớp này và viết lại nó theo cách bạn muốn. Trong mã của bạn thay thế cuộc gọi khối:

$this->getLayout()->createBlock(
    'Magento\Backend\Block\Widget\Form\Element\Dependence'
)

đến:

this->getLayout()->createBlock(
    'Siarhey\Test\Block\Widget\Form\Element\Dependence'
)

Tạo khối Siarhey\Test\Block\Widget\Form\Element\Dependencevà bạn có thể thực hiện trong đó logic xác minh của mình.

Đó chỉ là lời khuyên. Tôi hy vọng rằng nó sẽ giúp bạn.


2

Tạo một di.xml dưới adminhtml và thêm mã sau đây:

Về cơ bản cần ghi đè lên Magento \ Backend \ Block \ Widget \ Form \ Element \ Dependence class


<preference for="Magento\Backend\Block\Widget\Form\Element\Dependence"
                type="Vendor\Module\Block\Widget\Form\Element\Dependence" />


namespace Vendor\Module\Block\Widget\Form\Element;

class Dependence extends \Magento\Backend\Block\Widget\Form\Element\Dependence
{
    /**
     * 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, 'separator' => ','], 'fieldPrefix' => '']
            );
        }
        $this->_depends[$fieldName][$fieldNameFrom] = $refField;
        return $this;
    }
}

Bây giờ bạn có thể sử dụng cách sau đây.


->addFieldDependence(
    $childFieldTwo->getName(),
    $parentField->getName(),
    '2,4'
)

Xóa bộ nhớ cache Magento2.


Cảm ơn câu trả lời của bạn, nhưng vẫn không hoạt động, nếu giá trị được chọn không phải là '3,4,5' (chuỗi có dấu phẩy)
Siarhey Uchukhlebau

nếu giá trị được chọn là bất kỳ một trong chuỗi này '3,4,5', thì nó sẽ hoạt động.
Sohel Rana

Bạn cần sử dụng chuỗi được phân tách bằng dấu phẩy thay vì mảng.
Sohel Rana

Tôi đã thử nghiệm và nó không hoạt động nếu giá trị được chọn 3 hoặc 4 hoặc 5 :( Nhưng nó hoạt động nếu giá trị được chọn là '3,4,5' (chuỗi)
Siarhey Uchukhlebau

chỉ hiển thị mã đầy đủ của bạn cho tệp này
Sohel Rana

1

Tôi không chắc về điều này, tôi đã không thử nó, nhưng nhìn vào addFieldDependencephương pháp và ở \Magento\Config\Model\Config\Structure\Element\Dependency\Fieldlớp tôi nghĩ nó có thể hoạt động.

Thêm điều này trong lớp của bạn:

protected $fieldFactory;
public function __construct(
   ....
   \Magento\Config\Model\Config\Structure\Element\Dependency\FieldFactory $fieldFactory,
   ....
) {
    $this->fieldFactory = $fieldFactory;
}

Sau đó, thay vì

->addFieldDependence(
    $childFieldOne->getName(),
    $parentField->getName(),
    '1,3'
)

Thử cái này:

$someField = $this->fieldFactory()->create([
    'fieldData' => [
         'separator' => ',',
          'value' => '1,3',
    ],
    'fieldPrefix' => ''
]);

->addFieldDependence(
    $childFieldOne->getName(),
    $parentField->getName(),
    $someField
)

0

Xác định $this->_fieldFactoryvà thử dưới đây, nó làm việc cho tôi:

    $blockDependence = $this->getLayout()->createBlock(
        'Magento\Backend\Block\Widget\Form\Element\Dependence'
    );

    $filter = $this->_fieldFactory->create([
        'fieldData' => [
            'separator' => ',',
            'value' => '0,1',
        ],
        'fieldPrefix' => '',
    ]);

    $blockDependence->addFieldMap(
        "discount_type",
        'discount_type'
    )->addFieldMap(
        "discount",
        'discount'
    )->addFieldDependence(
        'discount',
        'discount_type',
        $filter
    );

    $this->setChild('form_after', $blockDependence);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.