Definir valores padrão para um componente de interface do usuário de seleção múltipla

13

Eu tenho uma entidade personalizada na minha instalação do magento 2.
E um dos campos nesta entidade é do tipo multiselecionado e contém a lista de todos os países.
Estou usando os componentes da interface do usuário no meu formulário de administração.
Como existem cerca de 200 registros no select, não quero ter um campo de seleção múltipla, porque não é tão fácil de usar.
Então, criei uma daquelas multiselecionadas sofisticadas, semelhantes ao campo de categorias na seção Adicionar / editar administração do produto.
Parece melhor, mas não posso definir um valor padrão para ele.
Aqui está minha configuração (observe o defaultitem de configuração):

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

Isso resulta em:

E espero que os 2 valores que coloquei no campo padrão sejam selecionados:

Se eu transformar o elemento em uma simples seleção múltipla, ele funcionará bem.

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

Eu amarrei com esse formato para a defaultconfiguração

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

e este também:

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

Também tentei com a tag selecte multiselectdentro formElementsdela.
Todas as minhas tentativas terminaram em fracasso.

Usar a defaultconfiguração em qualquer outro tipo de campo, conforme as instruções aqui (texto, seleção, data, ...) funciona bem.

Alguma sugestão para a fantasia seleciona? Algo que eu perdi?

Nota: Eu sei que posso fornecer um valor padrão no provedor de dados que preenche o formulário, mas estou tentando evitar isso, pois parece feio e não é tão extensível nem consistente com o restante dos campos.

Marius
fonte
você tentou com o id das opções?
Adrian Z.
MD e RO são os IDs das opções. Como eu disse, ele funciona com uma seleção múltipla normal usando os mesmos valores padrão
Marius
<itens nome = "padrão" xsi: type = "array"> </items>
Idham Choudry
@IdhamChoudry Eu já tentei isso. É o que diz a pergunta.
Marius
1
@ LazyCoder dê uma olhada na minha pergunta a este respeito <options class="Magento\Config\Model\Config\Source\Locale\Country"/>. Você precisa de uma classe semelhante que implemente \Magento\Framework\Option\ArrayInterfacee tenha um método chamado toOptionArrayque retorne uma matriz com seus valores. cada elemento da matriz deve ter a seguinte aparência['value' => ..., 'label' => ...]
Marius

Respostas:

1

Eu trabalhei para categorias personalizadas, mas neste método você precisa fornecer dados de países via banco de dados, ter uma ideia desse código e fornecer dados de Db ou Static Data estendendo os dados do magento. Espero que ajude

O código 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>

O Código 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;
}
}

A saída é assim insira a descrição da imagem aqui

Sheraz Khan
fonte
oh ... mas esta pergunta foi feita há 7 meses :(
sheraz khan
Os valores já vêm do banco de dados. Eu só preciso na "Adicionar tela" quando não estiver editando algo armazenado no banco de dados para pré-selecionar os valores padrão. Eu não acho que isso resolve meu problema. Além disso, não preciso de uma estrutura de árvore. Eu só tenho uma lista plana de países.
Marius
Sim, devemos usar dados padrão para isso, no meu caso eu escrevo dataprovider mas no seu caso isso em abordagem não é eficiente, no seu caso via xml é adequado
sheraz khan