बहु-आकार ui- घटक के लिए डिफ़ॉल्ट मान सेट करें


13

मैं अपने Magento 2 स्थापित में एक कस्टम इकाई है।
और इस इकाई में से एक क्षेत्र बहु ​​प्रकार का है और इसमें सभी देशों की सूची है।
मैं अपने व्यवस्थापक फॉर्म के लिए यूआई-घटकों का उपयोग कर रहा हूं।
चूंकि चयन में लगभग 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किसी अन्य प्रकार के फ़ील्ड में सेटिंग का उपयोग करना , जैसा कि यहाँ निर्देश दिया गया है (पाठ, चयन, दिनांक, ...) अच्छी तरह से काम करता है।

फैंसी चयन के लिए कोई सुझाव? कुछ याद आया?

नोट: मुझे पता है कि मैं डेटा प्रदाता में एक डिफ़ॉल्ट मान की आपूर्ति कर सकता हूं जो फ़ॉर्म को पॉप्युलेट करता है, लेकिन मैं इससे बचने की कोशिश कर रहा हूं क्योंकि यह बदसूरत दिखता है और यह एक्स्टेंसिबल नहीं है और बाकी क्षेत्रों के अनुरूप नहीं है।


आप विकल्पों की आईडी के साथ की कोशिश की?
एड्रियन जेड।

एमडी और आरओ विकल्प के आईडी हैं। जैसा कि मैंने कहा, यह एक ही मूलभूत मूल्यों का उपयोग कर एक सामान्य एकाधिक चयन करें के साथ काम करता
मेरियस

<आइटम का नाम = "डिफ़ॉल्ट" xsi: प्रकार = "सरणी"> </ आइटम>
इडाहम चौधरी

@IdhamChoudry मैंने पहले ही कोशिश की थी। यह सवाल में ऐसा कहता है।
मेरियस

1
@LazyCoder इस पर मेरे सवाल में एक नज़र रखना <options class="Magento\Config\Model\Config\Source\Locale\Country"/>। आपको एक समान वर्ग की आवश्यकता होती है जो लागू करता है \Magento\Framework\Option\ArrayInterfaceऔर एक विधि है जिसे कहा जाता है toOptionArrayकि आपके मूल्यों के साथ एक सरणी देता है। सरणी से प्रत्येक तत्व इस तरह दिखना चाहिए['value' => ..., 'label' => ...]
मेरियस

जवाबों:


1

मैंने कस्टम श्रेणियों के लिए काम किया है, लेकिन इस विधि में आपको डेटाबेस के माध्यम से देशों का डेटा प्रदान करना है, इस कोड से विचार करें और आप Magento डेटा का विस्तार करके डीबी या स्टेटिक डेटा से डेटा प्रदान कर सकते हैं, आशा है कि यह मदद कर सकता है

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>

कोफ़िग कोड

<?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 में संग्रहीत कुछ संपादन नहीं कर रहा हूं। मुझे नहीं लगता कि यह मेरी समस्या को हल करता है। इसके अलावा, मुझे पेड़ जैसी संरचना की जरूरत नहीं है। मेरे पास देशों की एक समतल सूची है।
मेरियस

हां, हमें इसके लिए डिफ़ॉल्ट डेटा का उपयोग करना चाहिए, मेरे मामले में मैं डेटाप्रॉइडर लिखता हूं लेकिन आपके मामले में यह कुशल दृष्टिकोण में नहीं है, आपके मामले में xml के माध्यम से उपयुक्त है
sheraz khan
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.