Imposta i valori predefiniti per un componente ui a selezione multipla


13

Ho un'entità personalizzata nella mia installazione di Magento 2.
E uno dei campi in questa entità è di tipo multi-selezione e contiene l'elenco di tutti i paesi.
Sto usando i componenti dell'interfaccia utente per il mio modulo di amministrazione.
Dato che ci sono circa 200 record nella selezione, non voglio avere un campo a selezione multipla perché non è così facile da usare.
Così ho creato una di quelle fantastiche multiselect simili al campo delle categorie nella sezione di amministrazione del prodotto Aggiungi / Modifica.
Sembra più bello, ma non riesco a impostare un valore predefinito.
Ecco la mia configurazione (nota l' defaultelemento di configurazione):

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

Ne risulta:

E mi aspetto che vengano selezionati i 2 valori che ho inserito nel campo predefinito:

Se trasformo l'elemento in una semplice selezione multipla, funziona perfettamente.

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

Ho legato con questo formato per l' defaultimpostazione

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

e anche questo:

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

Provato anche con il tag selecte multiselectall'interno del formElementstag.
Tutti i miei tentativi sono falliti.

L'uso defaultdell'impostazione in qualsiasi altro tipo di campo, come indicato qui (testo, seleziona, data, ...) funziona bene.

Qualche suggerimento per la fantasia seleziona? Qualcosa che mi mancava?

Nota: so di poter fornire un valore predefinito nel fornitore di dati che popola il modulo, ma sto cercando di evitarlo poiché sembra brutto e non è estensibile e non coerente con il resto dei campi.


hai provato con l'id delle opzioni?
Adrian Z.

MD e RO sono gli ID delle opzioni. Come ho detto, funziona con una normale selezione multipla utilizzando gli stessi valori predefiniti
Marius

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

@IdhamChoudry L'ho già provato. Lo dice nella domanda.
Marius

1
@LazyCoder dai un'occhiata alla mia domanda <options class="Magento\Config\Model\Config\Source\Locale\Country"/>. È necessaria una classe simile che implementa \Magento\Framework\Option\ArrayInterfacee abbia un metodo chiamato toOptionArrayche restituisce un array con i propri valori. ogni elemento dell'array deve apparire così['value' => ..., 'label' => ...]
Marius

Risposte:


1

Ho lavorato per categorie personalizzate ma in questo metodo devi fornire i dati dei paesi tramite database, prendere idea da questo codice e puoi fornire dati da Db o dati statici estendendo i dati magento, spero che possa aiutare

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

Il codice 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;
}
}

L'output è simile al seguente inserisci qui la descrizione dell'immagine


oh ... ma questa domanda è stata posta 7 mesi fa :(
sheraz khan,

I valori provengono già dal db. Ho solo bisogno di "Aggiungi schermo" quando non sto modificando qualcosa memorizzato nel db per preselezionare i valori predefiniti. Non penso che questo risolva il mio problema. Inoltre, non ho bisogno di una struttura ad albero. Ho solo un elenco semplice di paesi.
Marius

Sì, per questo dobbiamo usare i dati predefiniti, nel mio caso scrivo dataprovider ma nel tuo caso questo in un approccio non efficiente, nel tuo caso tramite xml è adatto
sheraz khan
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.