Установить значения по умолчанию для мультиселектного пользовательского интерфейса

13

У меня есть пользовательский объект в моем magento 2 установки.
И одно из полей в этой сущности имеет тип multiselect и содержит список всех стран.
Я использую UI-компоненты для моей формы администратора.
Поскольку в select есть около 200 записей, я не хочу иметь поле множественного выбора, потому что его не так просто использовать.
Поэтому я создал один из этих модных мультиселектов, похожих на поле категорий в разделе администрирования добавления / редактирования продукта.
Это выглядит лучше, но я не могу установить для него значение по умолчанию.
Вот моя конфигурация (обратите внимание на defaultэлемент конфигурации):

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

Это приводит к этому:

И я ожидаю, что будут выбраны 2 значения, которые я поместил в поле по умолчанию:

Если я превращу элемент в простой множественный выбор, он работает хорошо.

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

Я привязан к этому формату для defaultнастройки

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

и этот тоже:

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

Также пробовал с тегом selectи multiselectвнутри formElementsтега.
Все мои попытки закончились неудачей.

Использование defaultнастроек в любых других типах полей, как указано здесь (текст, выбор, дата, ...), работает хорошо.

Любое предложение для фантазии выбирает? Что-то я пропустил?

Примечание. Я знаю, что могу предоставить значение по умолчанию в поставщике данных, который заполняет форму, но я пытаюсь избежать этого, так как это выглядит некрасиво и не настолько расширяемо и не согласуется с остальными полями.

Мариус
источник
ты пробовал с id опций?
Адриан З.
MD и RO являются идентификаторами опций. Как я уже сказал, он работает с обычным множественным выбором, используя те же значения по умолчанию
Marius
<items name = "default" xsi: type = "array"> </ items>
Идхам Чудри,
@IdhamChoudry Я уже попробовал это. Так говорится в вопросе.
Мариус
1
@LazyCoder посмотрите на мой вопрос по этому вопросу <options class="Magento\Config\Model\Config\Source\Locale\Country"/>. Вам нужен подобный класс, который реализует \Magento\Framework\Option\ArrayInterfaceи имеет метод, toOptionArrayкоторый возвращает массив с вашими значениями. каждый элемент из массива должен выглядеть следующим образом['value' => ..., 'label' => ...]
Marius

Ответы:

1

Я работал над пользовательскими категориями, но в этом методе вы должны предоставить данные о странах через базу данных, взять идею из этого кода, и вы можете предоставить данные из Db или Static Data, расширив magento data, надеюсь, это поможет

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>

Код Кофига

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

Вывод выглядит так введите описание изображения здесь

Шераз Хан
источник
о ... но этот вопрос был задан 7 месяцев назад :(
Шераз хан
Значения приходят из БД уже. Мне просто нужно на «Добавить экран», когда я не редактирую что-то, хранящееся в БД, чтобы предварительно выбрать значения по умолчанию. Я не думаю, что это решает мою проблему. Кроме того, мне не нужна древовидная структура. У меня просто плоский список стран.
Мариус
Да, мы должны использовать данные по умолчанию для этого, в моем случае я пишу dataprovider, но в вашем случае это неэффективный подход, в вашем случае подходит через xml
sheraz khan