Ustaw wartości domyślne dla wielokrotnego wyboru komponentu interfejsu użytkownika

13

Mam niestandardową jednostkę w mojej instalacji Magento 2.
Jedno z pól tego podmiotu jest typu wielokrotnego wyboru i zawiera listę wszystkich krajów.
Używam komponentów interfejsu użytkownika do formularza administratora.
Ponieważ w zaznaczeniu znajduje się około 200 rekordów, nie chcę mieć pola wielokrotnego wyboru, ponieważ nie jest to takie łatwe w użyciu.
Więc stworzyłem jeden z tych fantazyjnych multiselects podobnych do pola kategorii w sekcji administracyjnej dodawania / edycji produktu.
Wygląda ładniej, ale nie mogę ustawić dla niego wartości domyślnej.
Oto moja konfiguracja (zauważ defaultelement konfiguracji):

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

Wynikiem tego jest:

Oczekuję, że zostaną wybrane 2 wartości, które umieściłem w polu domyślnym:

Jeśli zmienię element w prosty multiselektor, zadziała to dobrze.

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

Przywiązałem ten format do defaultustawienia

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

a ten również:

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

Próbowałem także z tagiem selecti multiselectwewnątrz formElementstagu.
Wszystkie moje próby zakończyły się niepowodzeniem.

Korzystanie z defaultustawienia w innych typach pól, zgodnie z instrukcją (tekst, zaznacz, data, ...) działa dobrze.

Wszelkie sugestie dotyczące fantazyjnych wyborów? Czegoś mi brakowało?

Uwaga: Wiem, że mogę podać wartość domyślną w dostawcy danych, który wypełnia formularz, ale staram się tego uniknąć, ponieważ wygląda brzydko i nie jest tak rozszerzalny ani niezgodny z resztą pól.

Marius
źródło
próbowałeś z id opcji?
Adrian Z.
MD i RO są identyfikatorami opcji. Jak powiedziałem, działa z normalnym wyborem wielokrotnym przy użyciu tych samych wartości domyślnych
Marius
<items name = "default" xsi: type = "array"> </items>
Idham Choudry
@IdhamChoudry Już tego próbowałem. Tak mówi pytanie.
Marius
1
@LazyCoder spójrz na moje pytanie na ten temat <options class="Magento\Config\Model\Config\Source\Locale\Country"/>. Potrzebujesz podobnej klasy, która implementuje \Magento\Framework\Option\ArrayInterfacei ma metodę o nazwie, toOptionArrayktóra zwraca tablicę z twoimi wartościami. każdy element z tablicy musi wyglądać tak['value' => ..., 'label' => ...]
Marius

Odpowiedzi:

1

Pracowałem dla niestandardowych kategorii, ale w tej metodzie musisz podać dane krajów za pośrednictwem bazy danych, zacznij od tego kodu i możesz dostarczyć dane z Db lub danych statycznych poprzez rozszerzenie danych magento. Mam nadzieję, że może to pomóc

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

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

Dane wyjściowe wyglądają tak wprowadź opis zdjęcia tutaj

Sheraz Khan
źródło
och ... ale to pytanie zostało zadane 7 miesięcy temu :(
sheraz khan
Wartości pochodzą już z bazy danych. Potrzebuję tylko na „Dodaj ekran”, gdy nie edytuję czegoś zapisanego w bazie danych, aby wstępnie wybrać wartości domyślne. Nie sądzę, że to rozwiązuje mój problem. Nie potrzebuję też struktury drzewiastej. Mam tylko płaską listę krajów.
Marius
Tak, musimy użyć do tego domyślnych danych, w moim przypadku piszę dostawcę danych, ale w twoim przypadku jest to nieefektywne podejście, w twoim przypadku za pomocą xml jest odpowiednie
sheraz khan