Magento 2: मैं पूर्व-परिभाषित फ़िल्टर मानों के साथ एक व्यवस्थापक ग्रिड कैसे लोड कर सकता हूं?


14

मैं पूर्व-निर्धारित फ़िल्टरों के साथ अपने व्यवस्थापक के कस्टम ग्रिड का लिंक बनाना चाहता हूं। ग्रिड एक यूआई लिस्टिंग घटक (एक्सएमएल) के साथ बनाया गया है और इसमें एक कॉलम है जिसे form_idइस तरह सेटअप किया गया है:

<column name="form_id">
    <argument name="data" xsi:type="array">
        <item name="config" xsi:type="array">
            <item name="filter" xsi:type="string">textRange</item>
            <item name="label" xsi:type="string" translate="true">Form id</item>
        </item>
    </argument>
</column>

ग्रिड ठीक काम करता है। मैं फ़िल्टर लागू कर सकता हूं और सब कुछ अच्छी तरह से काम करता है। ग्रिड XHR अनुरोध के साथ अच्छी तरह से अद्यतन हो जाता है।

हालांकि ... मैं कुछ बिंदु पर पूर्व-निर्धारित एक फ़िल्टर मान रखने में सक्षम होना चाहता हूं। उदाहरण के लिए, मैं आईडी = 3 पर फ़िल्टर किए जाने पर ग्रिड को खोलने में सक्षम होना चाहता हूं।

इसलिए मैंने पहले ही XHR-request के साथ ही URL पैरामीटर के साथ पेज लोड करने की कोशिश की, साथ ही साथ केवल आवश्यक मापदंडों को जोड़ते हुए:

?namespace=form_response_listing&search=&filters[placeholder]=true&filters[form_id][from]=3&filters[form_id][to]=3&paging[pageSize]=20&paging[current]=1

साथ ही साथ:

?filters[form_id][from]=3&filters[form_id][to]=3

बिना किसी सफलता के दोनों। तो URL का उपयोग करके मैं फ़िल्टर कैसे भर सकता हूँ?

संपादित करें:

मुझे यकीन नहीं है कि यह दूसरे प्रश्न का एक डुप्लिकेट है (जैसा कि नीचे टिप्पणी में वर्णित है)। मेरे मामले में, मैं अपने ग्रिड के लिए संग्रह के रूप में एक आभासी प्रकार का उपयोग कर रहा हूं:

<virtualType name="Vendor\Module\Model\ResourceModel\Response\Grid\Collection"
             type="Magento\Framework\View\Element\UiComponent\DataProvider\SearchResult">
    <arguments>
        <argument name="mainTable" xsi:type="string">vendormodule_form_response</argument>
        <argument name="resourceModel" xsi:type="string">Vendor\Module\Model\ResourceModel\Response</argument>
    </arguments>
</virtualType>

तो ऐसा नहीं है कि मेरे पास अपने ग्रिड विजेट के लिए एक भौतिक ब्लॉक वर्ग है, यह विशुद्ध रूप से एक यूआई घटक लिस्टिंग XML के साथ बनाया गया है।

फिर भी, मैं किसी भी तरह से जाँच करूँगा यदि संदर्भित प्रश्न मेरे उपयोग के मामले में मदद करेगा।



2
@RaphaelatDigitalPianism मुझे नहीं लगता कि यह कोई डुप्लिकेट है। प्रश्न जो आपने ग्रिड से जुड़ा हुआ है उसे पुराने तरीके से बनाया है। ग्रिड ब्लॉक और यूआई-घटकों के बीच कुछ। यह मूल रूप से कुछ था जहां आपके पास अभी भी ग्रिड ब्लॉक थे लेकिन वे prepareColumnsविधि के बजाय एक xml फ़ाइल में कॉन्फ़िगर किए गए थे ।
मैरियस

@ मार्सिट वोट पीछे हट गए;)
डिजिटल पियानोवाद पर राफेल 14

1
मैंने अपना प्रश्न संपादित किया, क्योंकि मुझे नहीं लगता कि यह एक डुप्लिकेट है (मैंने अपना शोध ;-)) कर लिया है
Giel Berkers

@ जील बेरकर्स मुझे एक ही मुद्दा मिल रहा है
भार्गव शास्त्री

जवाबों:


9

यहाँ मैं क्या अब तक पता चला है।
यह पूरा नहीं है लेकिन यह आपको सही रास्ते पर ले जा सकता है।
मैंने अपने परीक्षण का संचालन सेमी पेज लिस्टिंग ui घटक को संशोधित करके किया।
मैंने इसे जोड़ा

<item name="filter_url_params" xsi:type="array">
    <item name="page_id" xsi:type="string">*</item>
</item>

में cms_page_listing.xmlडेटा / config तर्क के अंदर डेटा स्रोत नोड के अंदर। तो अब ऐसा दिखता है

<dataSource name="cms_page_listing_data_source">
    <argument name="dataProvider" xsi:type="configurableObject">
        <argument name="class" xsi:type="string">Magento\Cms\Ui\Component\DataProvider</argument>
        <argument name="name" xsi:type="string">cms_page_listing_data_source</argument>
        <argument name="primaryFieldName" xsi:type="string">page_id</argument>
        <argument name="requestFieldName" xsi:type="string">id</argument>
        <argument name="data" xsi:type="array">
            <item name="config" xsi:type="array">
                <item name="component" xsi:type="string">Magento_Ui/js/grid/provider</item>
                <item name="update_url" xsi:type="url" path="mui/index/render"/>
                <item name="storageConfig" xsi:type="array">
                    <item name="indexField" xsi:type="string">page_id</item>
                </item>
                <item name="filter_url_params" xsi:type="array"><!-- my addition -->
                    <item name="page_id" xsi:type="string">*</item>
                </item>
            </item>
        </argument>
    </argument>
</dataSource>

यह मुझे url को कॉल करने की अनुमति देता है ROOT/admin/cms/page/index/key/<form_key_here>/?page_id=2
और मैं केवल पेज 2 आईडी के साथ देखता हूं।
लेकिन यह रेंज फिल्टर के लिए काम नहीं करता है और फिल्टर वैल्यू नहीं भरी जाती है। यह अभी भी रिक्त के रूप में दिखाता है।

अब यहाँ क्यों यह संभव है।

Cms पृष्ठों के लिए डेटाप्रॉइडर क्लास है Magento\Cms\Ui\Component\DataProvider
यह एक फैली हुई है Magento\Framework\View\Element\UiComponent\DataProvider\DataProvider
इस आखिरी में एक संरक्षित विधि शामिल है जिसे कहा जाता हैprepareUpdateUrl

protected function prepareUpdateUrl()
{
    if (!isset($this->data['config']['filter_url_params'])) {
        return;
    }
    foreach ($this->data['config']['filter_url_params'] as $paramName => $paramValue) {
        if ('*' == $paramValue) {
            $paramValue = $this->request->getParam($paramName);
        }
        if ($paramValue) {
            $this->data['config']['update_url'] = sprintf(
                '%s%s/%s',
                $this->data['config']['update_url'],
                $paramName,
                $paramValue
            );
            $this->addFilter(
                $this->filterBuilder->setField($paramName)->setValue($paramValue)->setConditionType('eq')->create()
            );
        }
    }
}

यदि कोई तत्व कहा जाता है तो यह ui घटक विन्यास में जांचना है filter_url_params। अगर वहाँ है, तो यह उसके अंदर सभी मूल्यों को लेता है और उन मूल्यों के मिलान के लिए अनुरोध की जाँच करता है जो इसमें परिभाषित हैं filter_url_params
लेकिन डिफ़ॉल्ट रूप से यह केवल साथ काम करता है eq

आप जो कोशिश कर सकते हैं वह आपके घटक के लिए एक कस्टम डेटा स्रोत है जहां आप विधि को फिर से लिखते हैं prepareUpdateUrlऔर इसे आपके द्वारा आवश्यक सभी अनुरोध चर को ध्यान में रखते हैं और शायद इसमें पेजिंग जोड़ते हैं और फ़िल्टरिंग रेंज करते हैं।

साइड नोट: यह एक बहुत ही दिलचस्प सवाल है। मुझे यकीन है कि भविष्य में बहुत सारे लोगों को इसकी आवश्यकता होगी।


आपके उत्तर के लिए धन्यवाद @ मारीश। यह मेरी स्थिति के लिए काम करता है, क्योंकि लिंक को हमेशा एक आईडी द्वारा फ़िल्टर करने की आवश्यकता होती है, न कि एक सीमा द्वारा (सीमा कम या ज्यादा एक विशेषता है, लेकिन मेरे URL द्वारा आवश्यक नहीं है)। आपके उत्तर के साथ-साथ आपके स्पष्टीकरण से मुझे बहुत मदद मिली!
गियल बर्कर्स

1
@ मैं इस तरह url का उपयोग कर सकता हूं ROOT/admin/cms/page/index/page_id/2/key/<form_key_here>, क्योंकि मैं $this->urlBuilder->getUrl(static::URL_PATH,[ 'page_id' => $item['id']])UiCompnent / Listing / Column में प्रयोग कर रहा हूं
सरल आदमी

मैं फ़िल्टर करने के लिए एक से अधिक पैरा का उपयोग कैसे करता हूं, अर्थात ROOT / admin / cms / पेज / index / param_1 / val1 / par2_3 / val3 / val3 / key / <form_key_here <आइटम नाम = "filter_url_params" के तहत तीन पैरामेट्स xsi: टाइप = "एरे"> व्यक्तिगत फिल्टरों के लिए काम करता है लेकिन सामूहिक रूप से नहीं।
शतभिषा ३०'१

@ मेरी! उरा जीवन बचाने!
ज़ोरोक्स 31'17

@ मार्स: क्या आपके पास विचार है, कि कई url param के लिए कार्यक्षमता का उपयोग कैसे करें जैसे ROOT / admin / cms / page / index / param_1 / val1 / par2_2 / val2 / param_3 / val val3 / key / <form_key_hh ere> as शतीश द्वारा पहले से ही निर्दिष्ट
आशीष राज
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.