Çok seçmeli kullanıcı arabirimi bileşeni için varsayılan değerleri ayarlama


13

Magento 2 kurulumumda özel bir varlık var.
Ve bu varlıktaki alanlardan biri çoklu seçim türündedir ve tüm ülkelerin listesini içerir.
Yönetici formum için ui bileşenlerini kullanıyorum.
Seçimde yaklaşık 200 kayıt olduğundan, çoklu seçim alanına sahip olmak istemiyorum çünkü kullanımı o kadar kolay değil.
Bu yüzden, ürün yöneticisi ekle / düzenle bölümündeki kategoriler alanına benzer süslü çoklu seçimlerden birini oluşturdum.
Daha güzel görünüyor, ancak buna varsayılan bir değer ayarlayamıyorum.
İşte benim yapılandırmam ( defaultyapılandırma öğesine dikkat edin ):

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

Bunun sonucu:

Ve varsayılan alana yerleştirdiğim 2 değerin seçilmesini bekliyorum:

Elemanı basit bir çoklu seçime dönüştürürsem iyi çalışır.

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

defaultAyar için bu formatla bağlandım

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

ve bu da:

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

Ayrıca etiketiyle denenmiş selectve multiselectformElementsetiketi.
Bütün denemelerim başarısızlıkla sonuçlandı.

Kullanımı defaultgibi alanlardan herhangi başka tür ayarını burada talimat (metin, seçmek tarih, ...) güzel çalışıyor.

Süslü seçimler için herhangi bir öneriniz var mı? Kaçırdığım bir şey mi?

Not: Ben formu dolduran veri sağlayıcısında varsayılan bir değer sağlayabileceğini biliyorum, ama çirkin görünüyor ve bu genişletilebilir ve alanların geri kalanı ile tutarlı değil bu önlemek için çalışıyorum.


Seçeneklerin kimliğini denediniz mi?
Adrian Z.

MD ve RO seçeneklerin kimlikleri. Dediğim gibi, aynı varsayılan değerleri kullanarak normal bir çoklu seçim ile çalışır
Marius

<items name = "default" xsi: type = "dizi"> </items>
Idham Choudry 29:18

@IdhamChoudry Bunu zaten denedim. Soruda öyle diyor.
Marius

1
@LazyCoder bu soruya bir göz atın <options class="Magento\Config\Model\Config\Source\Locale\Country"/>. Değerlerinizi içeren bir dizi döndüren \Magento\Framework\Option\ArrayInterfaceve uygulayan benzer bir sınıfa ihtiyacınız var toOptionArray. dizideki her öğe şöyle görünmelidir['value' => ..., 'label' => ...]
Marius

Yanıtlar:


1

Özel kategoriler için çalıştım, ancak bu yöntemde ülke verilerini veritabanı yoluyla sağlamanız, bu koddan fikir almanız ve magento verilerini genişleterek Db veya Statik Verilerden veri sağlayabilirsiniz, Umarım yardımcı olabilir

XML kodu

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

Cofig Kodu

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

Çıktı şöyle görünür resim açıklamasını buraya girin


oh ... ama bu soru sordu 7 ay önce :(
sheraz khan

Değerler zaten db'den geliyor. Önceden varsayılan değerleri seçmek için db saklanan bir şeyi düzenlemediğimde sadece "Ekran ekle" gerekir. Bunun sorunumu çözdüğünü sanmıyorum. Ayrıca, ağaç benzeri bir yapıya ihtiyacım yok. Sadece düz bir ülke listem var.
Marius

Evet, bunun için varsayılan verileri kullanmalıyız, benim durumumda veri sağlayıcı yazıyorum, ancak sizin durumunuzda bu verimli bir yaklaşımla değil, xml yoluyla sizin durumunuz uygundur
sheraz khan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.