Đặt giá trị mặc định cho nhiều thành phần ui


13

Tôi có một thực thể tùy chỉnh trong cài đặt magento 2 của tôi.
Và một trong các trường trong thực thể này thuộc loại multiselect và chứa danh sách tất cả các quốc gia.
Tôi đang sử dụng các thành phần ui cho mẫu quản trị viên của mình.
Vì có khoảng 200 bản ghi trong phần chọn, tôi không muốn có trường đa lựa chọn vì nó không dễ sử dụng.
Vì vậy, tôi đã tạo một trong những đa lựa chọn ưa thích tương tự như trường danh mục trong phần thêm / chỉnh sửa quản trị sản phẩm.
Nó trông đẹp hơn, nhưng tôi không thể đặt giá trị mặc định cho nó.
Đây là cấu hình của tôi (chú ý defaultmục cấu hình):

<field name="affected_countries" formElement="select" component="Magento_Ui/js/form/element/ui-select" sortOrder="100">
    <argument name="data" xsi:type="array">
        <item name="config" xsi:type="array">
            <item name="source" xsi:type="string">article</item>
            <item name="filterOptions" xsi:type="boolean">true</item>
            <item name="chipsEnabled" xsi:type="boolean">true</item>
            <item name="disableLabel" xsi:type="boolean">true</item>
            <item name="default" xsi:type="string">RO,MD</item>
        </item>
    </argument>
    <settings>
        <elementTmpl>ui/grid/filters/elements/ui-select</elementTmpl>
        <dataType>text</dataType>
        <label translate="true">Affected Countries</label>
        <dataScope>affected_countries</dataScope>
        <componentType>field</componentType>
    </settings>
    <formElements>
        <select>
            <settings>
                <options class="Magento\Config\Model\Config\Source\Locale\Country"/>
            </settings>
        </select>
    </formElements>
</field>

Nó dẫn đến điều này:

Và tôi đang mong đợi 2 giá trị tôi đặt trong trường mặc định sẽ được chọn:

Nếu tôi biến phần tử thành một multiselect đơn giản, nó hoạt động độc đáo.

<field name="affected_countries" formElement="multiselect" sortOrder="100">
    <argument name="data" xsi:type="array">
        <item name="config" xsi:type="array">
            <item name="source" xsi:type="string">article</item>
            <item name="default" xsi:type="string">RO,MD</item>
        </item>
    </argument>
    <settings>
        <dataType>text</dataType>
        <label translate="true">Affected Countries</label>
        <dataScope>affected_countries</dataScope>
    </settings>
    <formElements>
        <multiselect>
            <settings>
                <options class="Magento\Config\Model\Config\Source\Locale\Country"/>
            </settings>
        </multiselect>
    </formElements>
</field>

Tôi gắn với định dạng này cho defaultcài đặt

<item name="default" xsi:type="string">RO,MD</item>

và cái này cũng:

<item name="default" xsi:type="array">
    <item name="MD" xsi:type="string">MD</item>
    <item name="RO" xsi:type="string">RO</item>
</item>

Cũng đã thử với thẻ selectmultiselectbên trong formElementsthẻ.
Tất cả những cố gắng của tôi đã kết thúc trong thất bại.

Sử dụng defaultcài đặt trong bất kỳ loại trường nào khác, như được hướng dẫn ở đây (văn bản, chọn, ngày, ...) hoạt động độc đáo.

Bất kỳ đề nghị cho các lựa chọn ưa thích? Một cái gì đó tôi đã bỏ lỡ?

Lưu ý: Tôi biết rằng tôi có thể cung cấp một giá trị mặc định trong nhà cung cấp dữ liệu điền vào biểu mẫu, nhưng tôi đang cố gắng tránh điều này vì nó trông xấu và nó không thể mở rộng và không phù hợp với các trường còn lại.


Bạn đã thử với id của các tùy chọn?
Adrian Z.

MD và RO là id của các tùy chọn. Giống như tôi đã nói, nó hoạt động với nhiều chế độ bình thường sử dụng cùng các giá trị mặc định
Marius

<item name = "default" xsi: type = "mảng"> </ items>
Idham Choudry

@IdhamChoudry Tôi đã thử nó. Nó nói như vậy trong câu hỏi.
Marius

1
@LazyCoder hãy xem câu hỏi của tôi lúc này <options class="Magento\Config\Model\Config\Source\Locale\Country"/>. Bạn cần một lớp tương tự thực hiện \Magento\Framework\Option\ArrayInterfacevà có một phương thức được gọi là toOptionArraytrả về một mảng với các giá trị của bạn. mỗi phần tử từ mảng phải trông như thế này['value' => ..., 'label' => ...]
Marius

Câu trả lời:


1

Tôi đã làm việc cho các danh mục tùy chỉnh nhưng trong phương pháp này, bạn phải cung cấp dữ liệu quốc gia qua cơ sở dữ liệu, lấy ý tưởng từ mã này và bạn có thể cung cấp dữ liệu từ Db hoặc Dữ liệu tĩnh bằng cách mở rộng dữ liệu magento, Hy vọng nó có thể giúp

Mã xml

    <field name="country_id">
    <argument name="data" xsi:type="array">
        <item name="options" xsi:type="object">Vendor\Module\Model\Config\Source\CountriesTree</item>
        <item name="config" xsi:type="array">
            <item name="label" xsi:type="string" translate="true">Country</item>
            <item name="formElement" xsi:type="string">select</item>
            <item name="component" xsi:type="string">Magento_Ui/js/form/element/ui-select</item>
            <item name="elementTmpl" xsi:type="string">ui/grid/filters/elements/ui-select</item>
            <item name="dataScope" xsi:type="string">category_id</item>
            <item name="filterOptions" xsi:type="boolean">true</item>
            <item name="chipsEnabled" xsi:type="boolean">true</item>
            <item name="showCheckbox" xsi:type="boolean">true</item>
            <item name="disableLabel" xsi:type="boolean">true</item>
            <item name="multiple" xsi:type="boolean">true</item>
            <item name="levelsVisibility" xsi:type="number">1</item>
            <item name="sortOrder" xsi:type="number">30</item>
            <item name="validation" xsi:type="array">
                <item name="required-entry" xsi:type="boolean">false</item>
            </item>
            <item name="listens" xsi:type="array">
                <item name="index=create_category:responseData" xsi:type="string">setParsed</item>
                <item name="newOption" xsi:type="string">toggleOptionSelected</item>
            </item>
        </item>
    </argument>
</field>

Mã Cofig

<?php

namespace Vendor\Module\Model\Config\Source;

class CountriesTree implements \Magento\Framework\Option\ArrayInterface
{

protected $_countryCollectionFactory;

protected $_options;

protected $_childs;


public function __construct(
    \Vendor\Module\Model\ResourceModel\Country\CollectionFactory 
 $countryCollectionFactory
) {
    $this->_countryCollectionFactory = $countryCollectionFactory;
}

public function toOptionArray()
{
    if ($this->_options === null) {
        $this->_options = $this->_getOptions();
    }
    return $this->_options;
}

protected function _getOptions($itemId = 0)
{
    $childs =  $this->_getChilds();
    $options = [];

    if (isset($childs[$itemId])) {
        foreach ($childs[$itemId] as $item) {
            $data = [
                'label' => $item->getCountry_title(),
                'value' => $item->getCountry_id(),
            ];

             if (isset($childs[$item->getCountry_id()])) {
                 $data['optgroup'] = $this->_getOptions($item->getCountry_id());
             }

            $options[] = $data;
        }
    }

    return $options;
}

protected function _getChilds()
{
    if ($this->_childs === null) {
        $this->_childs =  $this->_countryCollectionFactory->create()
            ->getGroupedChilds();
    }
    return $this->_childs;
}
}

Đầu ra trông như thế này nhập mô tả hình ảnh ở đây


oh ... nhưng câu hỏi này đã được hỏi 7 tháng trước :(
sheraz khan

Các giá trị đến từ db rồi. Tôi chỉ cần trên "Thêm màn hình" khi tôi không chỉnh sửa thứ gì đó được lưu trong db để chọn trước các giá trị mặc định. Tôi không nghĩ rằng điều này giải quyết vấn đề của tôi. Ngoài ra, tôi không cần một cấu trúc giống như cây. Tôi chỉ có một danh sách phẳng các quốc gia.
Marius

Có, chúng tôi phải sử dụng dữ liệu mặc định cho việc này, trong trường hợp của tôi, tôi viết dataprovider nhưng trong trường hợp của bạn thì cách tiếp cận này không hiệu quả, trong trường hợp của bạn qua xml là phù hợp
sheraz khan
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.