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.


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


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.