Magento ग्रिड घटक सही ढंग से छँटाई नहीं


16

मैंने Magento में एक ग्रिड घटक को कॉन्फ़िगर किया है - और सॉर्टिंग व्यवहार टूटा हुआ लगता है। मैं जावास्क्रिप्ट स्तर पर इसे कहां डिबग कर सकता हूं, और / या किसी और को कोई विचार है कि ऐसा क्यों हो रहा है?

यदि मैं एक बार ग्रिड को सॉर्ट करता हूं, तो एक एनाक्स अनुरोध किया जाता है, और सब कुछ सही तरीके से होता है।

यहाँ छवि विवरण दर्ज करें

हालांकि, दूसरा प्रकार, बिना अजाक्स अनुरोध के, सभी समान आईडी के साथ ग्रिड प्रदान करता है।

यहाँ छवि विवरण दर्ज करें

मैगेंटो कोर ग्रिड पर व्यवहार दोहराया नहीं जाता है, इसलिए मुझे पूरा यकीन है कि यह कुछ ऐसा है जो मैं कर रहा हूं। मैं अभी तक ui घटक प्रणाली को अच्छी तरह से नहीं जानता कि यह कहां से शुरू करना है।

जवाबों:


21

ठीक है, मैं यह समझने का नाटक नहीं कर सकता कि अभी तक क्यों, लेकिन समस्या dataमेरे dataProviderतर्क का तर्क थी।

<!-- ... -->
<argument name="dataProvider" xsi:type="configurableObject">
    <!-- ... --->
    <argument name="data" xsi:type="array">
        <item name="config" xsi:type="array">
            <item name="update_url" xsi:type="url" path="mui/index/render"/>
        </item>
    </argument>
    <!-- ... -->
</argument>
<!-- ... -->

जब मैंने इसकी तुलना कुछ मुख्य ग्रिडों से की, तो dataतर्क में एक storageConfigनोड गायब था , indexFieldमेरे मॉडल की प्राथमिक कुंजी के साथ एक उप-नोड।

<argument name="data" xsi:type="array">
    <item name="config" xsi:type="array">
        <item name="update_url" xsi:type="url" path="mui/index/render"/>
        <item name="storageConfig" xsi:type="array">
            <item name="indexField" xsi:type="string">pulsestorm_commercebug_log_id</item>
        </item>                    

    </item>                          
</argument>

जब मैंने इन नोड्स को जोड़ा, तो छँटाई कार्यक्षमता को बहाल किया गया था।


बस एक ही समस्या में भाग गया, मुझे लगता है कि यह डेटा सूचकांक आईडी के बजाय पंक्ति सूचकांक द्वारा भंडारण से वापस गिर रहा है या मूल्यों को लोड कर रहा है, हालांकि यह कोई मतलब नहीं है कि डेटा को डुप्लिकेट क्यों किया जाता है। जवाब के लिए धन्यवाद।
LM_Fielding

7

टी एल; डॉ

यह वास्तव में एक दिलचस्प समस्या है।

यहां बताया गया है कि मैंने सिस्टम को कैसे समझा लेकिन मैं 100% सही नहीं हो सकता।

जैसा कि आपने हेडर कॉलम पर क्लिक करते हुए निम्नलिखित मार्ग के लिए एक AJAX अनुरोध उत्पन्न किया है: /admin_key/mui/index/renderनिम्नलिखित मापदंडों के साथ:

  • फिल्टर [प्लेसहोल्डर]
  • isAjax
  • नाम स्थान
  • पेजिंग [वर्तमान]
  • पेजिंग [pageSize]
  • खोज
  • छँटाई [दिशा]
  • छँटाई [field]

अंतिम वह फ़ील्ड है जिस पर आप अपना ग्रिड सॉर्ट कर रहे हैं।

यह मार्ग डिफ़ॉल्ट रूप से घोषित है app/code/Magento/Ui/view/base/ui_component/etc/definition.xml:

<insertListing class="Magento\Ui\Component\Container">
    <argument name="data" xsi:type="array">
        <item name="config" xsi:type="array">
            <item name="component" xsi:type="string">Magento_Ui/js/form/components/insert-listing</item>
            <item name="update_url" xsi:type="url" path="mui/index/render"/>
            <item name="render_url" xsi:type="url" path="mui/index/render"/>
            <item name="autoRender" xsi:type="boolean">false</item>
            <item name="dataLinks" xsi:type="array">
                <item name="imports" xsi:type="boolean">true</item>
                <item name="exports" xsi:type="boolean">false</item>
            </item>
            <item name="realTimeLink" xsi:type="boolean">true</item>
        </item>
    </argument>
</insertListing>

लेकिन एक सूची ui_component XML में यह भी घोषित किया गया है:

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

इस मार्ग को app/code/Magento/Ui/Controller/Adminhtml/Index/Render.phpनाम स्थान पैरामीटर (जो आमतौर पर आपके UI घटक का नाम है) के आधार पर नियंत्रित किया जाता है।

public function execute()
{
    if ($this->_request->getParam('namespace') === null) {
        $this->_redirect('admin/noroute');
        return;
    }

    $component = $this->factory->create($this->_request->getParam('namespace'));
    $this->prepareComponent($component);
    $this->_response->appendBody((string) $component->render());
}

जहां prepareComponentविधि बाल घटकों पर पुनरावर्ती है:

protected function prepareComponent(UiComponentInterface $component)
{
    foreach ($component->getChildComponents() as $child) {
        $this->prepareComponent($child);
    }
    $component->prepare();
}

जब स्तंभ घटक तैयार किया जाता है, तो स्तंभ छँटाई को इसके द्वारा नियंत्रित किया जाता है app/code/Magento/Ui/Component/Listing/Columns/Column.php:

public function prepare()
{
    $this->addFieldToSelect();

    $dataType = $this->getData('config/dataType');
    if ($dataType) {
        $this->wrappedComponent = $this->uiComponentFactory->create(
            $this->getName(),
            $dataType,
            array_merge(['context' => $this->getContext()], (array) $this->getData())
        );
        $this->wrappedComponent->prepare();
        $wrappedComponentConfig = $this->getJsConfig($this->wrappedComponent);
        // Merge JS configuration with wrapped component configuration
        $jsConfig = array_replace_recursive($wrappedComponentConfig, $this->getJsConfig($this));
        $this->setData('js_config', $jsConfig);

        $this->setData(
            'config',
            array_replace_recursive(
                (array)$this->wrappedComponent->getData('config'),
                (array)$this->getData('config')
            )
        );
    }

    $this->applySorting();

    parent::prepare();
}

जहां applySorting()विधि छँटाई पैरामीटर पर आधारित है और यह डेटा प्रदाता को केवल आदेश जोड़ता है:

protected function applySorting()
{
    $sorting = $this->getContext()->getRequestParam('sorting');
    $isSortable = $this->getData('config/sortable');
    if ($isSortable !== false
        && !empty($sorting['field'])
        && !empty($sorting['direction'])
        && $sorting['field'] === $this->getName()
    ) {
        $this->getContext()->getDataProvider()->addOrder(
            $this->getName(),
            strtoupper($sorting['direction'])
        );
    }
}

हर घटक तैयार हो जाने के बाद, प्रतिक्रिया के लिए एक्शन क्लास घटक (फिर से पुनरावर्ती) का प्रतिपादन करता है:

$this->_response->appendBody((string) $component->render());

मुझे लगता है कि उन महत्वपूर्ण PHP कदम हैं जो छँटाई के दौरान होता है।

अब JS को, रेंडर और अपडेट यूआरएल ( definition.xmlऊपर घोषित ) तत्व में दिए गए हैं app/code/Magento/Ui/view/base/web/js/form/components/insert.js:

return Element.extend({
    defaults: {
        content: '',
        template: 'ui/form/insert',
        showSpinner: true,
        loading: false,
        autoRender: true,
        visible: true,
        contentSelector: '${$.name}',
        externalData: [],
        params: {
            namespace: '${ $.ns }'
        },
        renderSettings: {
            url: '${ $.render_url }',
            dataType: 'html'
        },
        updateSettings: {
            url: '${ $.update_url }',
            dataType: 'json'
        },
        imports: {},
        exports: {},
        listens: {},
        links: {
            value: '${ $.provider }:${ $.dataScope}'
        },
        modules: {
            externalSource: '${ $.externalProvider }'
        }
    }

अभी भी इस फ़ाइल में, requestDataAJAX डेटा को पुनः प्राप्त करने के लिए उपयोग की जाने वाली विधि है:

    requestData: function (params, ajaxSettings) {
        var query = utils.copy(params);

        ajaxSettings = _.extend({
            url: this['update_url'],
            method: 'GET',
            data: query,
            dataType: 'json'
        }, ajaxSettings);

        this.loading(true);

        return $.ajax(ajaxSettings);
    }

आप देख सकते हैं कि इस विधि को कहा जाता है जब render()विधि कहा जाता है:

        $.async({
            component: this.name,
            ctx: '.' + this.contentSelector
        }, function (el) {
            self.contentEl = $(el);
            self.startRender = true;
            params = _.extend({}, self.params, params || {});
            request = self.requestData(params, self.renderSettings);
            request
                .done(self.onRender)
                .fail(self.onError);
        });

एक बार जब यह किया जाता है, तो डेटा को लागू करने के लिए कॉलबैक विधि कहा जाता है। यह है onRender():

    onRender: function (data) {
        this.loading(false);
        this.set('content', data);
        this.isRendered = true;
        this.startRender = false;
    }

मुझे लगता है कि जहां नई सामग्री लागू की जा रही है।


कोड कोलम्बो ...
LM_Fielding
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.