Tetapkan nilai default untuk komponen ui multi-pilih

13

Saya memiliki entitas khusus di Magento 2 saya instal.
Dan salah satu bidang dalam entitas ini adalah tipe multiselect dan berisi daftar semua negara.
Saya menggunakan komponen ui untuk formulir admin saya.
Karena ada sekitar 200 catatan dalam pilih, saya tidak ingin memiliki bidang multiseleksi karena tidak mudah digunakan.
Jadi saya membuat salah satu multiselek mewah yang mirip dengan bidang kategori di bagian admin tambah / edit produk.
Itu terlihat lebih bagus, tetapi saya tidak dapat menetapkan nilai default untuk itu.
Ini konfigurasi saya (perhatikan defaultitem konfigurasi):

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

Hasilnya adalah ini:

Dan saya mengharapkan 2 nilai yang saya tempatkan di bidang default untuk dipilih:

Jika saya mengubah elemen menjadi multiselect sederhana itu berfungsi dengan baik.

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

Saya terikat dengan format ini untuk defaultpengaturan

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

dan yang ini juga:

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

Juga mencoba dengan tag selectdan multiselectdi dalam formElementstag.
Semua percobaan saya berakhir dengan kegagalan.

Menggunakan defaultpengaturan dalam jenis bidang apa pun lainnya, seperti yang diperintahkan di sini (teks, pilih, tanggal, ...) berfungsi dengan baik.

Ada saran untuk memilih yang mewah? Sesuatu yang saya lewatkan?

Catatan: Saya tahu saya bisa memberikan nilai default di penyedia data yang mengisi formulir, tapi saya mencoba untuk menghindari ini karena terlihat jelek dan tidak bisa diperluas dan tidak konsisten dengan bidang lainnya.

Marius
sumber
Apakah Anda mencoba dengan id opsi?
Adrian Z.
MD dan RO adalah id dari opsi. Seperti yang saya katakan, ini berfungsi dengan multiselect yang normal menggunakan nilai default yang sama
Marius
<items name = "default" xsi: type = "array"> </items>
Idham Choudry
@ IdhamChoudry Saya sudah mencobanya. Dikatakan demikian dalam pertanyaan.
Marius
1
@ LazyCoder lihat pertanyaan saya ini <options class="Magento\Config\Model\Config\Source\Locale\Country"/>. Anda memerlukan kelas serupa yang mengimplementasikan \Magento\Framework\Option\ArrayInterfacedan memiliki metode yang disebut toOptionArrayyang mengembalikan array dengan nilai Anda. setiap elemen dari array harus terlihat seperti ini['value' => ..., 'label' => ...]
Marius

Jawaban:

1

Saya bekerja untuk kategori khusus tetapi dalam metode ini Anda harus memberikan data negara melalui basis data, mengambil gagasan dari kode ini dan Anda dapat memberikan data dari Db atau Data Statis dengan memperluas data magento, Semoga bermanfaat

Kode 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>

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

Outputnya terlihat seperti ini masukkan deskripsi gambar di sini

sheraz khan
sumber
oh ... tapi pertanyaan ini ditanyakan 7 bulan lalu :(
sheraz khan
Nilai sudah berasal dari db. Saya hanya perlu pada "Tambahkan layar" ketika saya tidak mengedit sesuatu yang tersimpan di db untuk memilih nilai default. Saya tidak berpikir ini menyelesaikan masalah saya. Juga, saya tidak memerlukan struktur seperti pohon. Saya hanya punya daftar negara yang datar.
Marius
Ya kita harus menggunakan data default untuk ini, dalam kasus saya saya menulis dataprovider tetapi dalam kasus Anda ini dalam pendekatan yang tidak efisien, dalam kasus Anda melalui xml cocok
sheraz khan