複数選択UIコンポーネントのデフォルト値を設定する


13

magento 2のインストールにカスタムエンティティがあります。
また、このエンティティのフィールドの1つはmultiselectタイプで、すべての国のリストが含まれています。
管理フォームにUIコンポーネントを使用しています。
選択には約200のレコードがあるので、複数選択フィールドは使いにくいため、複数選択フィールドは使いたくありません。
そのため、製品管理の追加/編集セクションのカテゴリフィールドに似た派手な複数選択の1つを作成しました。
見た目は良くなっていますが、デフォルト値を設定できません。
ここに私の設定があります(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で試しましたか?
エイドリアンZ.

MDとROはオプションのIDです。先ほど言ったように、同じデフォルト値を使用して通常の複数選択で動作します
マリウス

<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

私はカスタムカテゴリで働いていましたが、この方法では、データベース経由で国のデータを提供し、このコードからアイデアを取り、Magentoデータを拡張してDbまたは静的データからデータを提供する必要があります

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>

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

出力は次のようになります ここに画像の説明を入力してください


ああ...しかし、この質問は7ヶ月前に尋ねられた:(
sheraz khan

値はすでにデータベースから取得されています。デフォルト値を事前に選択するために、dbに保存されているものを編集していないときに、「追加画面」で必要になります。これが私の問題を解決するとは思わない。また、ツリーのような構造は必要ありません。私は国のフラットなリストを持っています。
マリウス

はい、我々はこのために、デフォルトのデータを使用する必要があり、私の場合は、dataProviderの書き込みが、あなたの場合にはこれがない効率的なアプローチでは、XMLを介しあなたのケースに適している
sherazカーン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.