Встановіть за замовчуванням багатокористувацькі ui-компоненти


13

У моїй установці magento 2 у мене є власна сутність.
І одне з полів цієї сутності має тип мультиселекції та містить перелік усіх країн.
Я використовую ui-компоненти для своєї форми адміністратора.
Оскільки в обраному режимі є близько 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налаштувань у будь-яких інших типах полів, як указано тут (текст, вибір, дата, ...), працює добре.

Будь-яка пропозиція для фантазії вибирає? Щось я пропустив?

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


ви спробували з ідентифікатором параметрів?
Адріан З.

MD і RO - ідентифікатори варіантів. Як я вже говорив, він працює з нормальним багатоселекцією, використовуючи ті самі значення за замовчуванням
Marius

<items name = "default" xsi: type = "array"> </items>
Idham Choudry

@IdhamChoudry Я вже пробував це. Про це йдеться у питанні.
Маріус

1
@LazyCoder подивіться на моє запитання з цього приводу <options class="Magento\Config\Model\Config\Source\Locale\Country"/>. Вам потрібен аналогічний клас, який реалізує \Magento\Framework\Option\ArrayInterfaceі має метод, який називається, toOptionArrayщо повертає масив зі своїми значеннями. кожен елемент з масиву повинен виглядати так['value' => ..., 'label' => ...]
Маріус

Відповіді:


1

Я працював у користувацьких категоріях, але в цьому методі ви повинні надати дані про країни за допомогою бази даних, взяти ідею з цього коду, і ви можете надати дані з Db або статичних даних шляхом розширення даних magento, сподіваюся, що це може допомогти

Код 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 місяців тому :(
sheraz khan

Значення вже надходять від db. Мені просто потрібно на екрані "Додати", коли я не редагую щось, що зберігається в db, щоб попередньо вибрати значення за замовчуванням. Я не думаю, що це вирішує мою проблему. Також мені не потрібна деревоподібна структура. У мене просто рівний список країн.
Маріус

Так, ми повинні використовувати для цього дані за замовчуванням, в моєму випадку я пишу dataprovider, але у вашому випадку це неефективний підхід, у вашому випадку через xml підходить
sheraz khan
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.