ตั้งค่าเริ่มต้นสำหรับ multiselect ui-component


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ตั้งค่าในฟิลด์ประเภทอื่น ๆ ตามที่แนะนำในที่นี้ (ข้อความเลือกวันที่ ... ) ทำงานได้ดี

ข้อเสนอแนะใด ๆ สำหรับแฟนซีเลือก? บางสิ่งที่ฉันคิดถึง

หมายเหตุ: ฉันรู้ว่าฉันสามารถให้ค่าเริ่มต้นในผู้ให้บริการข้อมูลที่เติมแบบฟอร์ม แต่ฉันพยายามหลีกเลี่ยงสิ่งนี้เนื่องจากมันดูน่าเกลียดและมันไม่สามารถขยายได้และไม่สอดคล้องกับส่วนที่เหลือของเขตข้อมูล


คุณลองใช้ id ของตัวเลือกหรือไม่
Adrian Z.

MD และ RO เป็นรหัสของตัวเลือก อย่างที่ฉันบอกว่ามันทำงานได้กับตัวเลือกหลายตัวปกติโดยใช้ค่าเริ่มต้นเดียวกัน
Marius

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

@IdhamChoudry ฉันลองแล้ว มันพูดอย่างนั้นในคำถาม
Marius

1
@LazyCoder <options class="Magento\Config\Model\Config\Source\Locale\Country"/>จะดูในคำถามของฉันที่นี้ คุณต้องการคลาสที่คล้ายกันซึ่งใช้\Magento\Framework\Option\ArrayInterfaceและมีเมธอดtoOptionArrayที่ส่งคืนอาร์เรย์ด้วยค่าของคุณ แต่ละองค์ประกอบจากอาเรย์ต้องมีลักษณะเช่นนี้['value' => ..., 'label' => ...]
Marius

คำตอบ:


1

ฉันทำงานกับหมวดหมู่ที่กำหนดเอง แต่ในวิธีนี้คุณต้องให้ข้อมูลประเทศผ่านฐานข้อมูลรับแนวคิดจากรหัสนี้และคุณอาจให้ข้อมูลจาก 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 อยู่แล้ว ฉันแค่ต้องการใน "เพิ่มหน้าจอ" เมื่อฉันไม่ได้แก้ไขสิ่งที่เก็บไว้ใน db เพื่อเลือกค่าเริ่มต้นล่วงหน้า ฉันไม่คิดว่าวิธีนี้จะช่วยแก้ปัญหาของฉันได้ นอกจากนี้ฉันไม่ต้องการโครงสร้างแบบต้นไม้ ฉันมีรายชื่อประเทศเรียบๆ
Marius

ใช่เราต้องใช้ข้อมูลเริ่มต้นสำหรับสิ่งนี้ในกรณีของฉันฉันเขียน dataprovider แต่ในกรณีของคุณวิธีนี้ไม่มีประสิทธิภาพวิธีในกรณีของคุณผ่าน xml เหมาะสม
sheraz khan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.